<?xml version="1.0" encoding='utf-8'?>
<rdf:RDF xmlns="http://purl.org/rss/1.0/"        
         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns:dc="http://purl.org/dc/elements/1.1/"
         xmlns:dct="http://purl.org/dc/terms/"
         xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"        
         xmlns:admin="http://webns.net/mvcb/"        
         xmlns:content="http://purl.org/rss/1.0/modules/content/">
 
 <channel rdf:about="http://blogs.sun.com/bblfish/">        
   <title>The Sun BabelFish Blog</title>        
   <link>http://blogs.sun.com/bblfish/</link>        
   <description>Don&apos;t panic !</description>        
   <dc:date>2005-06-24T11:59:34-07:00</dc:date>
   <admin:generatorAgent rdf:resource="http://rollerweblogger.org/"/> 
   <items>
      <rdf:Seq>
              <rdf:li rdf:resource="http://blogs.sun.com/bblfish/entry/bof_5911_building_a_web"/>
              <rdf:li rdf:resource="http://blogs.sun.com/bblfish/entry/foaf_ssl_creating_a_global"/>
              <rdf:li rdf:resource="http://blogs.sun.com/bblfish/entry/the_openid_sequence_diagram"/>
              <rdf:li rdf:resource="http://blogs.sun.com/bblfish/entry/semantic_camp_paris"/>
              <rdf:li rdf:resource="http://blogs.sun.com/bblfish/entry/kiwi_knowledge_in_a_wiki"/>
              <rdf:li rdf:resource="http://blogs.sun.com/bblfish/entry/rdfauth_sketch_of_a_buzzword"/>
              <rdf:li rdf:resource="http://blogs.sun.com/bblfish/entry/why_binary_relations_beat_tuples"/>
              <rdf:li rdf:resource="http://blogs.sun.com/bblfish/entry/semantic_web_for_the_working"/>
              <rdf:li rdf:resource="http://blogs.sun.com/bblfish/entry/drupal_s_future_is_the"/>
              <rdf:li rdf:resource="http://blogs.sun.com/bblfish/entry/opening_sesame_with_networked_graphs"/>
              <rdf:li rdf:resource="http://blogs.sun.com/bblfish/entry/sparqling_calling_codes"/>
              <rdf:li rdf:resource="http://blogs.sun.com/bblfish/entry/semantic_bar_camp_london_and"/>
              <rdf:li rdf:resource="http://blogs.sun.com/bblfish/entry/proof_data_portability_requires_linked"/>
              <rdf:li rdf:resource="http://blogs.sun.com/bblfish/entry/replacing_ant_with_rdf"/>
              <rdf:li rdf:resource="http://blogs.sun.com/bblfish/entry/3_semantic_web_talks_for"/>
            </rdf:Seq>
   </items>
 </channel>

  <item rdf:about="http://blogs.sun.com/bblfish/entry/bof_5911_building_a_web">        
     <title>BOF-5911: Building a Web 3.0 Address Book</title>
     <link>http://blogs.sun.com/bblfish/entry/bof_5911_building_a_web</link>
     <dct:modified>2008-05-06T18:43:29-07:00</dct:modified> 
     <dc:date>2008-05-06T15:50:03-07:00</dc:date> 
     <dc:creator>Henry Story</dc:creator>
     <foaf:maker xmlns:foaf="http://xmlns.com/foaf/0.1/">
        <foaf:Person rdf:about="http://bblfish.net/people/henry/card#me">
          <foaf:name>Henry Story</foaf:name>
        </foaf:Person>
     </foaf:maker>
          <dc:subject>Java</dc:subject>
               <dc:subject>community</dc:subject>     
          <dc:subject>identity</dc:subject>     
          <dc:subject>javaone</dc:subject>     
          <dc:subject>javaone2008</dc:subject>     
          <dc:subject>semweb</dc:subject>     
          <dc:subject>social</dc:subject>     
          <dc:subject>web2.0</dc:subject>     
          <dc:subject>web3.0</dc:subject>     
                    <content:encoded>&lt;a href=&quot;http://bblfish.net/work/AddressBook/JavaOne2008/launch.jnlp&quot;&gt;&lt;img align=&quot;right&quot; src=&quot;http://farm4.static.flickr.com/3016/2472223298_e3eb607a97.jpg?v=0&quot;/&gt;&lt;/a&gt;
&lt;p&gt;To give everyone a chance to try out the So(m)mer Address Book, I have made it available via Java Web Start: just click on the picture to the right, and try it out.&lt;/p&gt;
&lt;p&gt;The Address Book is currently demoware: it shows how one can build virally an open distributed social network client that solves &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/2008_the_rise_of_linked&quot;&gt;the social network data silo problem&lt;/a&gt; (&lt;a href=&quot;http://blogs.sun.com/bblfish/entry/data_portability_the_video&quot;&gt;video&lt;/a&gt;). No need to have an account on every social networking site on which you have friends, and so maintain your data on each one. You can simply belong to one network and link to all your friends wherever they are. With one click of a button you can publish your social network to your own web server, using ftp, scp, WebDAV, or even Atom. You can then link to other people who have (or not in fact), a &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/i_have_a_foaf_file&quot;&gt;foaf file&lt;/a&gt;. By pressing the space bar when selecting a friend, the Address Book with then GET their file. So you can browse your social network.
&lt;/p&gt;
&lt;p&gt;To get going you can explore my social network by dragging my foaf file icon &lt;a href=&quot;http://bblfish.net/people/henry/card#me&quot;&gt;&lt;img src=&quot;http://www.foaf-project.org/images/foafTiny.gif&quot;&gt;&lt;/a&gt; onto the first pane of the application.
&lt;/p&gt;
&lt;p&gt;
In &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/three_semantic_web_talks_at&quot;&gt;BOF-5911&lt;/a&gt; which I will be presenting on Thursday at 7:30pm I will be presenting the social networking problem, demonstrating how the &lt;a href=&quot;https://sommer.dev.java.net/AddressBook.html&quot;&gt;So(m)mer Address Book&lt;/a&gt; solves it, and showing in detail how it is build, what the problems are, and what work remains. I will also discuss how this can be used to create global single sign on based on a network of trust. &lt;/p&gt;</content:encoded>
       </item>
  <item rdf:about="http://blogs.sun.com/bblfish/entry/foaf_ssl_creating_a_global">        
     <title>FOAF & SSL: creating a global decentralised authentication protocol</title>
     <link>http://blogs.sun.com/bblfish/entry/foaf_ssl_creating_a_global</link>
     <dct:modified>2008-04-22T08:22:33-07:00</dct:modified> 
     <dc:date>2008-04-21T05:00:26-07:00</dc:date> 
     <dc:creator>Henry Story</dc:creator>
     <foaf:maker xmlns:foaf="http://xmlns.com/foaf/0.1/">
        <foaf:Person rdf:about="http://bblfish.net/people/henry/card#me">
          <foaf:name>Henry Story</foaf:name>
        </foaf:Person>
     </foaf:maker>
          <dc:subject>SemWeb</dc:subject>
               <dc:subject>accessmanager</dc:subject>     
          <dc:subject>community</dc:subject>     
          <dc:subject>identity</dc:subject>     
          <dc:subject>identitymanagement</dc:subject>     
          <dc:subject>security</dc:subject>     
          <dc:subject>semweb</dc:subject>     
          <dc:subject>web</dc:subject>     
          <dc:subject>web2.0</dc:subject>     
                    <content:encoded>&lt;p&gt;Following on my previous post &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/rdfauth_sketch_of_a_buzzword&quot;&gt;RDFAuth: sketch of a buzzword compliant authentication protocol&lt;/a&gt;, &lt;a href=&quot;http://tobyinkster.co.uk/&quot;&gt;Toby Inkster&lt;/a&gt; &lt;a href=&quot;http://www.w3.org/mid/m2g9c5-eqe.ln1@ophelia.g5n.co.uk&quot;&gt;came up with a brilliantly simple scheme&lt;/a&gt; that builds very neatly on top of the Secure Sockets Layer of https. I describe the protocol shortly here, and will describe an implementation of it in my next post. &lt;/a&gt;
&lt;p&gt;Simple global ( passwordless if using a device such as the &lt;a href=&quot;http://www.startssl.com/&quot;&gt;Aladdin USB e-Token&lt;/a&gt;  ) authentication around the web would be extremely valuable. I am currently crumbling under the number of sites asking me for authentication information, and for each site I need to remember a new id and password combination. I am not the only one with this problem as &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/data_portability_the_video&quot;&gt;the data portability video&lt;/a&gt; demonstrates. OpenId solves the problem but the &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/the_openid_sequence_diagram&quot;&gt;protocol consumes a lot of ssl connections&lt;/a&gt;. For hyperdata user agents this could be painfully slow.  This is because they may need access to just a couple of resources per server as they jump from service to service. 
&lt;/p&gt;
&lt;p&gt;
As before we have a very simple scenario to consider. Romeo wants to find out where Juliette is. Juliette&apos;s hyperdata Address Book updates her location on a regular basis by PUTing information to a protected resource which she only wants her friends and their friends to have access to. Her server knows from her &lt;a href=&quot;http://xmlns.com/foaf/spec/#term_PersonalProfileDocument&quot;&gt;foaf:PersonalProfileDocument&lt;/a&gt; who her friends are. She identifies them via dereferenceable URLs, &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/i_have_a_foaf_file&quot;&gt;as I do&lt;/a&gt;, which themselves usually (the web is flexible) return more &lt;a href=&quot;http://xmlns.com/foaf/spec/#term_PersonalProfileDocumenti&quot;&gt;foaf:PersonalProfileDocuments&lt;/a&gt; describing them, and pointing to further such documents. In this way the list of people able to find out her location can be specified in a flexible and distributed  manner. So let us imagine that Romeo is a friend of a friend of Juliette&apos;s and he wishes to talk to her. The following sequence diagram continues the story...
&lt;/p&gt;
&lt;img src=&quot;http://blogs.sun.com/bblfish/resource/2008/SequenceDiagram_withSSL.png&quot; alt=&quot;sequence diagram of RDF+SSL&quot;/&gt;
&lt;p&gt;
The stages of the diagram are listed below:
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;First Romeo&apos;s User Agent HTTP GETs Juliette&apos;s public foaf file located at &lt;code&gt;http://juliette.net/&lt;/code&gt;. The server returns a representation ( in &lt;a href=&quot;http://www.w3.org/TR/xhtml-rdfa-primer/&quot;&gt;RDFa&lt;/a&gt; perhaps ) with the same semantics as the following &lt;a href=&quot;http://en.wikipedia.org/wiki/Notation_3&quot;&gt;N3&lt;/a&gt;:&lt;/p&gt;
&lt;code&gt;
&lt;pre&gt;
@prefix : &amp;lt;#&amp;gt; . 
@prefix foaf: &amp;lt;http://xmlns.com/foaf/0.1/&amp;gt; .
@prefix rdfs: &amp;lt;http://www.w3.org/2000/01/rdf-schema#&amp;gt; .
@prefix todo: &amp;lt;http://eg.org/todo#&amp;gt; .
@prefix openid: &amp;lt;http://eg.org/openid/todo#&amp;gt; .

&amp;lt;&amp;gt; a foaf:PersonalProfileDocument;
   foaf:primaryTopic :juliette ;
   openid:server &amp;lt;https://aol.com/openid/service&amp;gt;; # see &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/the_openid_sequence_diagram&quot;&gt;The Openid Sequence Diagram&lt;/a&gt; .

:juliette a foaf:Person;
   foaf:name &quot;Juliette&quot;;
   foaf:openid &amp;lt;&amp;gt;;
   foaf:blog &amp;lt;/blog&amp;gt;;    
   rdfs:seeAlso &amp;lt;https://juliette.net/protected/location&amp;gt;; 
   foaf:knows &amp;lt;http://bblfish.net/people/henry/card#me&amp;gt;,
              &amp;lt;http://www.w3.org/People/Berners-Lee/card#i&amp;gt; .

&amp;lt;https://juliette.net/protected/location&amp;gt; a todo:LocationDocument .
&lt;/pre&gt;
&lt;/code&gt;
&lt;p&gt;
Romeo&apos;s user agent receives this representation and decides to follow the https protected resource because it is a todo:LocationDocument. 
&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;The todo:LocationDocument is at an &lt;a href=&quot;http://en.wikipedia.org/wiki/Https&quot;&gt;https&lt;/a&gt; URL, so Romeo&apos;s User Agent connects to it via &lt;a href=&quot;http://en.wikipedia.org/wiki/Secure_Sockets_Layer&quot;&gt;a secure socket&lt;/a&gt;. Juliette&apos;s server, who wishes to know the identity of the requestor,  sends out a Certificate Request, to which Romeo&apos;s user agent responds with an &lt;a href=&quot;http://en.wikipedia.org/wiki/X.509&quot;&gt;X.509 certificate&lt;/a&gt;. This is all part of the SSL protocol. 
&lt;/p&gt;
&lt;p&gt;In the communication in stage 2, Romeo&apos;s user agent also passes along his foaf id. This can be done either by:
&lt;ul&gt;
&lt;li&gt;Sending in the HTTP header of the request an &lt;code&gt;Agent-Id&lt;/code&gt; header pointing to the foaf Id of the user. Like this:
&lt;code&gt;
&lt;pre&gt;
Agent-Id: http://romeo.net/#romeo
&lt;/pre&gt;
&lt;/code&gt;
This would be similar to the current &lt;code&gt;&lt;a href=&quot;http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.22&quot;&gt;From:&lt;/a&gt;&lt;/code&gt; header, but instead of requiring an email address, a direct name of the agent would be required. (An email address is only an indirect identifier of an agent).
&lt;/li&gt;
&lt;li&gt;
The Certificate could itself contain the Foaf ID of the Agent in the X509v3 extensions section:
&lt;code&gt;
&lt;pre&gt;
        X509v3 extensions:
           ...
           X509v3 Subject Alternative Name: 
                           URI:http://romeo.net/#romeo
&lt;/pre&gt;
&lt;/code&gt;
&lt;p&gt;
I am not sure if it would be correct use of the X509 Alternative names field. So this would require more standardization work with the X509 community. But it shows a way where the two communities could meet. The advantage of having the id as part of the certificate is that this could add extra weight to the id, depending on the trust one gives the Certificate Authority that signed the Certificate.
&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;
At this point Juliette&apos;s web server knows of the requestor (Romeo in this case):
&lt;ul&gt;
&lt;li&gt; his alleged  foaf Id
&lt;li&gt; his Certificate ( verified during the ssl session )
&lt;/ul&gt;
&lt;p&gt;
If the Certificate is signed by a CA that Juliette trusts and the foaf id is part of the certificate, then she will trust that the owner of the User Agent is the entity named by that id. She can then jump straight to step 6 if she knows enough about Romeo that she trusts him. &lt;/p&gt;
&lt;p&gt;Having Certificates signed by CA&apos;s is expensive though. The protocol described here will work just as well with self signed certificates, which are easy to generate.
&lt;/li&gt;
&lt;li&gt;Juliette&apos;s hyperdata server then GETs the foaf document associated with the foaf id, namely &lt;code&gt;&amp;lt;http://romeo.net/&amp;gt;&lt;/code&gt; . Romeo&apos;s foaf server returns a document containing a graph of relations similar to the graph described by the following N3:
&lt;code&gt;
&lt;pre&gt;
@prefix : &amp;lt;#&amp;gt; . 
@prefix foaf: &amp;lt;http://xmlns.com/foaf/0.1/&amp;gt; .
@prefix rdfs: &amp;lt;http://www.w3.org/2000/01/rdf-schema#&amp;gt; .
@prefix wot: &amp;lt;http://xmlns.com/wot/0.1/&amp;gt; .
@prefix wotodo: &amp;lt;http://eg.org/todo#&amp;gt; .

&amp;lt;&amp;gt; a foaf:PersonalProfileDocument;
    foaf:primaryTopic :romeo .

:romeo a foaf:Person;
    foaf:name &quot;Romeo&quot;;
    is wot:identity of [ a wotodo:X509Certificate;
                         wotodo:dsaWithSha1Sig &quot;&quot;&quot;30:2c:02:14:78:69:1e:4f:7d:37:36:a5:8f:37:30:58:18:5a:
                                             f6:10:e9:13:a4:ec:02:14:03:93:42:3b:c0:d4:33:63:ae:2f:
                                             eb:8c:11:08:1c:aa:93:7d:71:01&quot;&quot;&quot; ;
                       ] ;
    foaf:knows &amp;lt;http://bblfish.net/people/henry/card#me&amp;gt; .
&lt;/pre&gt;
&lt;/code&gt;
&lt;li&gt;By querying the semantics of the returned document with a &lt;a href=&quot;http://www.w3.org/TR/rdf-sparql-query/&quot;&gt;SPARQL query&lt;/a&gt; such as
&lt;code&gt;
&lt;pre&gt;
PREFIX wot: &amp;lt;http://xmlns.com/wot/0.1/&amp;gt; 
PREFIX wotodo: &amp;lt;http://eg.org/todo#&amp;gt; 

SELECT { ?sig }
WHERE {
    [] a wotodo:X509Certificate;
      wotodo:signature ?sig;
      wot:identity &amp;lt;http://romeo.net/#romeo&amp;gt; .
}
&lt;/pre&gt;
&lt;/code&gt;
&lt;p&gt;
Juliette&apos;s web server can discover the certificate signature and compare it with the one sent by Romeo&apos;s user agent. If the two are identical, then Juliette&apos;s server knows that the User Agent who has access to the private key of the certificate sent to it, and who claims to be the person identified by the URI &lt;code&gt;http://romeo.net/#romeo&lt;/code&gt;, is in agreement as to the identity of the certificate with the person who has write access to the foaf file &lt;code&gt;http://romeo.net/&lt;/code&gt;. So by proving that it has access to the private key of the certificate sent to the server, the User Agent has also proven that it is the person described by the foaf file.
&lt;li&gt;Finally, now that Juliette&apos;s server knows an identity of the User Agent making the request on the protected resource, it can decide whether or not to return the representation. In this case we can imagine that my foaf file says that
&lt;code&gt;
&lt;pre&gt;
 @prefix foaf: &amp;lt;http://xmlns.com/foaf/0.1/&amp;gt; .

 &amp;lt;http://bblfish.net/people/henry/card#me&amp;gt; foaf:knows &amp;lt;http://romeo.net/#romeo&amp;gt; .  
 &lt;/pre&gt;
 &lt;/code&gt;

As a result of the policy of allowing all friends of Juliette&apos;s friends to be able to read the location document, the server sends out a document containing relations such as the following:

&lt;code&gt;
&lt;pre&gt;
@prefix contact: &amp;lt;http://www.w3.org/2000/10/swap/pim/contact#&amp;gt; .
@prefix : &amp;lt;http://juliette.org/#&amp;gt; .

:juliette 
    contact:location [ 
          contact:address [ contact:city &quot;Paris&quot;;
                            contact:country &quot;France&quot;;
                            contact:street &quot;1 Champs Elysees&quot; ]
                     ] .
&lt;/pre&gt;
&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;


&lt;h3&gt;Todo&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Create an ontology for X509 certificates.
&lt;li&gt;test this. Currently there is some implementation work going on in the &lt;a href=&quot;https://sommer.dev.java.net/&quot;&gt;so(m)mer repository&lt;/a&gt; in the misc/FoafServer directory.
&lt;li&gt;Can one use the Subject Alternative name of an X509 certificate as described here?
&lt;li&gt;For self signed certificates, what should the X509 Distinguished Name (DN) be? The DN is really being replaced here by the foaf id, since that is where the key information about the user is going to be located. Can one ignore the DN in a X509 cert, as one can in RDF with blank nodes? One could I imagine create a dummy DN where one of the elements is the foaf id. These would at least, as opposed to DN, be guaranteed to be unique.
&lt;li&gt;what standardization work would be needed to make this
&lt;/ul&gt;

&lt;h3&gt;Discussion on the Web&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;Peter Williams is very positive, in &lt;a href=&quot;http://openid.net/pipermail/general/2008-April/004686.html&quot;&gt;his response on the OpenId mailing list&lt;/a&gt; where he gives a short overview of the history of the URI Subject Alternative name in the X509 spec. &lt;/li&gt;
&lt;li&gt;Paul Madsen gives a &lt;a href=&quot; http://groups.google.com/group/dataportability-public/browse_thread/thread/3867241744def900?hl=en&quot;&gt;short description of how this would be implemented in the Liberty stack&lt;/a&gt;.
&lt;/ul&gt;
</content:encoded>
       </item>
  <item rdf:about="http://blogs.sun.com/bblfish/entry/the_openid_sequence_diagram">        
     <title>The OpenId Sequence Diagram</title>
     <link>http://blogs.sun.com/bblfish/entry/the_openid_sequence_diagram</link>
     <dct:modified>2008-04-23T23:30:15-07:00</dct:modified> 
     <dc:date>2008-04-18T09:31:48-07:00</dc:date> 
     <dc:creator>Henry Story</dc:creator>
     <foaf:maker xmlns:foaf="http://xmlns.com/foaf/0.1/">
        <foaf:Person rdf:about="http://bblfish.net/people/henry/card#me">
          <foaf:name>Henry Story</foaf:name>
        </foaf:Person>
     </foaf:maker>
          <dc:subject>SemWeb</dc:subject>
               <dc:subject>identity</dc:subject>     
          <dc:subject>identitymanagement</dc:subject>     
          <dc:subject>security</dc:subject>     
          <dc:subject>semweb</dc:subject>     
          <dc:subject>web</dc:subject>     
          <dc:subject>web2.0</dc:subject>     
                    <content:encoded>&lt;p&gt;&lt;a href=&quot;http://openid.net/&quot;&gt;OpenId&lt;/a&gt; very neatly solves the global identity problem within the constraints of working with legacy browsers. It is a complex protocol though as the following sequence diagram illustrates, and this may be a problem for automated agents that need to jump around the web from hyperlink to hyperlink, as hyperdata agents tend to do.&lt;/p&gt;
&lt;p&gt;The diagram illustrates the following scenario. Romeo wants to find the current location of Juliette. So his semantic web user agent GET&apos;s her current foaf file. But Juliette wants to protect information about her current whereabouts and reveal it only to people she trusts, so she configures her server to require the user agent to authenticate itself in order to get more information. If the user agent can prove that is is owned by one of her trusted friends, and Romeo in particular, she will deliver the information to it (and so to him).
&lt;/p&gt;

&lt;img src=&quot;http://blogs.sun.com/bblfish/resource/2008/SequenceDiagram_OpenId.png&quot; title=&quot;OpenId Sequence Diagram&quot;/&gt;


&lt;p&gt;The steps numbered in the sequence diagram are as follows:
&lt;ol&gt;
&lt;li&gt;A User Agent fetches a web page that requires authentication. OpenId was designed with legacy web browsers in mind, for which it would return a page containing an OpenId login box such as the one to the right. &lt;img align=&quot;right&quot; src=&quot;http://blogs.sun.com/bblfish/resource/2008/OpenId-login.png&quot; alt=&quot;openid login box&quot;/&gt;
In the case of a hyperdata agent as in our use case, the agent would GET a public foaf file, which might contain a link to an OpenId authentication endpoint. Perhaps with some rdf such as the following N3:
&lt;code&gt;
&lt;pre&gt;&amp;lt;&amp;gt; openid:login &amp;lt;/openidAuth.cgi&amp;gt; .
&lt;/pre&gt;
&lt;/code&gt;
Perhaps some more information would indicate which resources were protected.
&lt;li&gt;
In current practice a human user notices the login box and types his identifying URL in it, such as  &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/http_openid_sun_com_bblfish&quot;&gt;http://openid.sun.com/bblfish&lt;/a&gt; This is the brilliant invention of OpenId: getting hundreds of millions of people to find it natural to identify themselves via a URL, instead of an email. The user then clicks the &quot;Login button&quot;. &lt;br&gt;
In our semantic use case the hyperdata agent would notice the above openid link and would deduce that it needs to login to the site to get more information. Romeo&apos;s Id ( &lt;code&gt;http://romeo.net/&lt;/code&gt; perhaps ) would then be POSTed to the &lt;code&gt;/openidAuth.cgi&lt;/code&gt; authentication endpoint. 
&lt;/li&gt;
&lt;li&gt;The OpenId authentication endpoint then fetches the web page by GETing Romeo&apos;s url &lt;code&gt;http://romeo.net/&lt;/code&gt;. This returned representation contains a link in the header of the page pointing Romeo&apos;s OpenId server url. If the representation returned is html then this would contain the following in the header
&lt;code&gt;
&lt;pre&gt;
 &amp;lt;link rel=&quot;openid.server&quot; href=&quot;https://openid.sun.com/openid/service&quot; /&amp;gt;
&lt;/pre&gt;
&lt;/code&gt;
&lt;li&gt;The representation returned in step 3, could contain a lot of other information too. A link to a foaf file may not be a bad idea as I described in &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/foaf_openid&quot;&gt;foaf and openid&lt;/a&gt;. The returned representation in step 3 could even be &lt;a href=&quot;http://www.w3.org/TR/xhtml-rdfa-primer/&quot;&gt;RDFa extended html&lt;/a&gt;, in which case this step may not even be necessary. For a hyperdata server the information may be useful, as it may suggest a connection Romeo could have to some other people that would allow it to decide whether it wishes to continue the login process. 
&lt;/li&gt;
&lt;li&gt;Juliette&apos;s OpenId authentication endpoint then sends a redirect to Romeo&apos;s user agent, directing it towards his OpenId Identity Provider. The redirect also contains the URL of the OpenId authentication cgi, so that in step 8 below the Identity Provider can redirect a message back.
&lt;/li&gt;
&lt;li&gt;Romeo user agent dutifully redirects romeo to the identity provider, which then returns a form with a username and password entry box.
&lt;li&gt;Romeo&apos;s user agent could learn to fill the user name password pair in automatically and even skip the previous step 6 . In any case given the user name and password, the Identity Provider then sends back some cryptographic tokens to the User Agent to have it redirect to the OpenId Authentication cgi at &lt;code&gt;http://juliette.net/openidAuth.cgi&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Romeo&apos;s Hyperdata user agent then dutifully redirects back to the OpenId authentication endpoint 
&lt;/li&gt;
&lt;li&gt;The authentication endpoint sends a request to the Openid Identity provider to verify that the cryptographic token is authentic. If it is, a conventional answer is sent back.&lt;/li&gt;
&lt;li&gt;The OpenId authentication endpoint finally sends a response back with a session cookie, giving access to various resources on Juliette&apos;s web site. Perhaps it even knows to redirect the user agent to a protected resource, though that would have required some information concerning this to have been sent in stage 2.&lt;/li&gt;
&lt;li&gt;Finally Romeo&apos;s user agent can GET Juliette&apos;s protected information if Juliette&apos;s hyperdata web server permits it. In this case it will, because Juliette loves Romeo.
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;All of the steps above could be automatized, so from the user&apos;s point of view they may not be complicated. The user agent could even learn to fill in the user name and password required by the Identity Provider. But there are still a very large number of connections between the User Agent and the different services. If these connections are to be secure they would need to  protected by SSL (as hinted at by the double line arrows). And SSL connections are not cheap. So the above may be unacceptably slow. On the other hand it would work with a protocol that is growing fast in acceptance.
&lt;/p&gt;
&lt;p&gt;It is is certainly worth comparing this sequence diagram with  the very light weight one presented in &quot;&lt;a href=&quot;http://blogs.sun.com/bblfish/entry/foaf_ssl_creating_a_global&quot;&gt;FOAF &amp; SLL: creating a global decentralised authentication protocol&lt;/a&gt;&quot;. &lt;/p&gt;
&lt;p&gt;Thanks again to &lt;a href=&quot;http://bnode.org/&quot;&gt;Benjamin Nowack&lt;/a&gt; for bringing the discussion on &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/rdfauth_sketch_of_a_buzzword&quot;&gt;RDFAuth&lt;/a&gt; to thinking about using the OpenId protocol directly as described above. See his &lt;a href=&quot;http://www.w3.org/mid/PM-GA.20080401214244.43454.1.1D@semsol.com&quot;&gt;post on the semantic web mailing list&lt;/a&gt;. Benjamin also pointed to the &lt;a href=&quot;http://wiki.openid.net//OpenID_HTTP_Authentication&quot;&gt;HTTP OpenID Authentication&lt;/a&gt; proposal, which shows how some of the above can be simplified if certain assumptions about the capabilities of the client are made. It would be worth making a sequence diagram of that proposal too.&lt;/p&gt;
</content:encoded>
       </item>
  <item rdf:about="http://blogs.sun.com/bblfish/entry/semantic_camp_paris">        
     <title>semantic camp paris</title>
     <link>http://blogs.sun.com/bblfish/entry/semantic_camp_paris</link>
     <dct:modified>2008-04-24T01:45:46-07:00</dct:modified> 
     <dc:date>2008-04-17T02:45:02-07:00</dc:date> 
     <dc:creator>Henry Story</dc:creator>
     <foaf:maker xmlns:foaf="http://xmlns.com/foaf/0.1/">
        <foaf:Person rdf:about="http://bblfish.net/people/henry/card#me">
          <foaf:name>Henry Story</foaf:name>
        </foaf:Person>
     </foaf:maker>
          <dc:subject>SemWeb</dc:subject>
               <dc:subject>addressbook</dc:subject>     
          <dc:subject>conference</dc:subject>     
          <dc:subject>semweb</dc:subject>     
                    <content:encoded>&lt;a href=&quot;http://www.flickr.com/photos/tags/semwebcamp20080404/&quot;&gt;&lt;img align=&quot;right&quot; src=&quot;http://farm4.static.flickr.com/3077/2400044957_6d46b02865_m.jpg&quot; alt=&quot;picture of Karima Rafes&quot;&gt;&lt;/a&gt;
&lt;p&gt;A couple of weeks ago I attended the &lt;a href=&quot;http://websemantique.org/SemWebCamp20080404&quot;&gt;second Semantic Bar Camp&lt;/a&gt; which took place at the &lt;a href=&quot;http://www.orange.com/en_EN/group/global_footprint/countries/france/france-lab.html&quot;&gt;Orange research labs&lt;/a&gt; at Issy les Moulineaux, near Paris. This was a great opportunity to meet many of the French researchers in the Semantic Web space, to take part in the French debate, and to help convince interested parties of the reality of the technology. &lt;/p&gt;
&lt;p&gt;Jean Rohmer of the large &lt;a href=&quot;http://www.thalesgroup.com/&quot;&gt;French defense group Thales&lt;/a&gt; played the role of the devil&apos;s advocate, arguing that the Semantic Web was just pie in the sky theory without practical applications. We delved into various aspects of the theory of the Semantic Web, and I  underlined how &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/language_is_a_virus&quot;&gt;the biological/evolutionary aspect of language&lt;/a&gt;, the &lt;a href=&quot;http://www.academie-francaise.fr/&quot;&gt;Academie Francaise&lt;/a&gt; notwithstanding,  was a key aspect in understanding &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/ufo_s_seen_growing_on&quot;&gt;the evolution of the web of data&lt;/a&gt;. But the best argument was a simple demonstration of the &lt;a href=&quot;https://sommer.dev.java.net/AddressBook.html&quot;&gt;Beatnik Address Book&lt;/a&gt;, which showed how &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/hyperdata_and_folktologies&quot;&gt;hyperdata&lt;/a&gt; could solve &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/2008_the_rise_of_linked&quot;&gt;the serious problem of 2008&lt;/a&gt;: the growing number of closed social networks. At the next camp I hope we will be able to delve much more deeply into how to build real practical applications. 
&lt;/p&gt;
&lt;p&gt;Many thanks to Karima Rafes for organizing this well attended bar camp ( &lt;a href=&quot;http://www.flickr.com/photos/tags/semwebcamp20080404/&quot;&gt;pictures&lt;/a&gt; ). &lt;a href=&quot;http://flickr.com/photos/bblfish/2400878124/&quot;&gt;Stephane Lauriere&lt;/a&gt; from &lt;a href=&quot;http://www.xwiki.com/&quot;&gt;XWiki&lt;/a&gt; and who is on the &lt;a href=&quot;http://nepomuk.semanticdesktop.org/&quot;&gt;Nepomuk Semantic Desktop project&lt;/a&gt;, also posted &lt;a href=&quot;http://flickr.com/photos/21829050@N04/sets/72157604420113036/&quot;&gt;some photos&lt;/a&gt;. And I would like to recommend &lt;a href=&quot;http://apassant.net/blog/&quot;&gt;Alexandre Passant&apos;s blog&lt;/a&gt; to all french speaking readers.
&lt;/p&gt;</content:encoded>
       </item>
  <item rdf:about="http://blogs.sun.com/bblfish/entry/kiwi_knowledge_in_a_wiki">        
     <title>KiWi: Knowledge in a Wiki</title>
     <link>http://blogs.sun.com/bblfish/entry/kiwi_knowledge_in_a_wiki</link>
     <dct:modified>2008-04-17T09:56:04-07:00</dct:modified> 
     <dc:date>2008-04-17T01:00:22-07:00</dc:date> 
     <dc:creator>Henry Story</dc:creator>
     <foaf:maker xmlns:foaf="http://xmlns.com/foaf/0.1/">
        <foaf:Person rdf:about="http://bblfish.net/people/henry/card#me">
          <foaf:name>Henry Story</foaf:name>
        </foaf:Person>
     </foaf:maker>
          <dc:subject>SemWeb</dc:subject>
               <dc:subject>java</dc:subject>     
          <dc:subject>kiwiknows</dc:subject>     
          <dc:subject>netbeans</dc:subject>     
          <dc:subject>opensource</dc:subject>     
          <dc:subject>semweb</dc:subject>     
          <dc:subject>social</dc:subject>     
          <dc:subject>web2.0</dc:subject>     
          <dc:subject>wiki</dc:subject>     
                    <content:encoded>&lt;a href=&quot;http://www.kiwi-project.eu/&quot;&gt;&lt;img src=&quot;http://www.kiwi-project.eu/skins/common/images/kiwi_logo.png&quot; alt=&quot;KiWi logo&quot; align=&quot;right&quot;/&gt;&lt;/a&gt;
&lt;p&gt;Last month I attended the &lt;a href=&quot;http://www.kiwi-project.eu/&quot;&gt;European Union KiWi&lt;/a&gt; project startup meeting in Salzburg, to which Sun Microsystems Prague is contributing some key use cases.&lt;/p&gt;

&lt;p&gt;KiWi is a project to build an Open Source Semantic Wiki. It is based on the &lt;a href=&quot;http://ikewiki.salzburgresearch.at/&quot;&gt;IkeWiki [don&apos;t follow this link if you have Safari 3.1]&lt;/a&gt; Java wiki, which uses the &lt;a href=&quot;http://jena.sourceforge.net/&quot;&gt;Jena Semantic Web frameworks&lt;/a&gt;, the &lt;a href=&quot;http://dojotoolkit.org/&quot;&gt;Dojo toolkit&lt;/a&gt; for the Web 2.0 functionality, and any one of the Databases Jena can connect to, such as &lt;a href=&quot;http://www.postgresql.org/&quot;&gt;PostgreSQL&lt;/a&gt;. KiWi is in many ways similar to &lt;a href=&quot;http://freebase.com/&quot;&gt;Freebase&lt;/a&gt; in its hefty use of JavaScript, and its emphasis on structured data. But instead of being a closed source platform, KiWi is open source, and builds upon the Semantic Web standards. In my opinion it currently overuses JavaScript features, to the extent that all clicks lead to dynamic page rewrites that do not change the URL of the browser page. This I feel unRESTful, and the &lt;u&gt;permalink&lt;/u&gt; link in the socialise toolbar to the right does not completely remove my qualms. Hopefully this can be fixed in this project. It would be great also if KIWI could  participate fully in the &lt;a href=&quot;http://en.wikipedia.org/wiki/Linked_Data&quot;&gt;Linked Data&lt;/a&gt; movement. &lt;/p&gt;

&lt;p&gt;The meeting was very well organized by &lt;a href=&quot;http://www.schaffert.eu/en/index_html&quot;&gt;Sebastian Schaffert&lt;/a&gt; and his team. It was 4 long days of meetings that made sure that everyone was on the same page, understood the rules of the EU game, and most of all got to know each other. (see  &lt;a href=&quot;http://www.flickr.com/photos/bblfish/tags/kiwiknows/&quot;&gt;kiwiknows tagged pictures on flickr&lt;/a&gt; ). Many thanks also to &lt;a href=&quot;http://blogs.sun.com/peterreiser/&quot;&gt;Peter Reiser&lt;/a&gt; for moving and shaking the various Sun decision makers to sign the appropriate papers, and dedicate the resources for us to be part of this project.
&lt;/p&gt;
&lt;p&gt;You can follow the evolution of the project on the &lt;a href=&quot;http://planet.kiwi-project.eu/&quot;&gt;Planet Kiwi&lt;/a&gt; page. &lt;/p&gt;

&lt;p&gt;Anyway, here is a video that shows the resourceful kiwi mascot in action:&lt;/p&gt;
&lt;p&gt;
&lt;object width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/sdUUx5FdySs&amp;hl=en&quot;&gt;&lt;/param&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;&gt;&lt;/param&gt;&lt;embed src=&quot;http://www.youtube.com/v/sdUUx5FdySs&amp;hl=en&quot; type=&quot;application/x-shockwave-flash&quot; wmode=&quot;transparent&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;/p&gt;
</content:encoded>
       </item>
  <item rdf:about="http://blogs.sun.com/bblfish/entry/rdfauth_sketch_of_a_buzzword">        
     <title>RDFAuth: sketch of a  buzzword compliant authentication protocol</title>
     <link>http://blogs.sun.com/bblfish/entry/rdfauth_sketch_of_a_buzzword</link>
     <dct:modified>2008-04-24T02:02:42-07:00</dct:modified> 
     <dc:date>2008-03-28T08:09:25-07:00</dc:date> 
     <dc:creator>Henry Story</dc:creator>
     <foaf:maker xmlns:foaf="http://xmlns.com/foaf/0.1/">
        <foaf:Person rdf:about="http://bblfish.net/people/henry/card#me">
          <foaf:name>Henry Story</foaf:name>
        </foaf:Person>
     </foaf:maker>
          <dc:subject>SemWeb</dc:subject>
               <dc:subject>addressbook</dc:subject>     
          <dc:subject>community</dc:subject>     
          <dc:subject>identity</dc:subject>     
          <dc:subject>identitymanagement</dc:subject>     
          <dc:subject>networking</dc:subject>     
          <dc:subject>openid</dc:subject>     
          <dc:subject>rest</dc:subject>     
          <dc:subject>security</dc:subject>     
          <dc:subject>semweb</dc:subject>     
          <dc:subject>web</dc:subject>     
          <dc:subject>web2.0</dc:subject>     
          <dc:subject>web3.0</dc:subject>     
                    <content:encoded>&lt;p&gt;Here is a proposal for an authentication scheme that is even simpler than OpenId ( &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/the_openid_sequence_diagram&quot;&gt;see sequence diagram&lt;/a&gt; ),  more secure, more RESTful, with fewer points of failure and fewer points of control, that is needed in order to make Open Distributed Social Networks with privacy controls possible.&lt;p&gt;
&lt;h3&gt;Update&lt;/h3&gt;
The following sketch led to the even simpler protocol described in &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/foaf_ssl_creating_a_global&quot;&gt;Foaf and SSL creating a global decentralized authentication protocol&lt;/a&gt;. It is very close to what is proposed here but builds very closely on SSL, so as to reduce what is new down to nearly nothing.
&lt;h3&gt;Background&lt;/h3&gt;
&lt;p&gt;Ok, so now I have your attention, I would like to first mention that I am a great fan of OpenId. I have blogged about it &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/openid_for_blogs_sun_com&quot;&gt;numerous&lt;/a&gt; &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/http_openid_sun_com_bblfish&quot;&gt;times&lt;/a&gt; and &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/foaf_openid&quot;&gt;enthusiastically&lt;/a&gt; in this space. I came across the idea I will develop below, not because I thought OpenId needed improving, but because I have chosen to follow some very strict architectural guidelines:  it had to satisfy &lt;a href=&quot;http://bblfish.net/blog/page1.html#10&quot;&gt;RESTful&lt;/a&gt;, &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/restful_web_services_the_book&quot;&gt;Resource oriented&lt;/a&gt; &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/hyperdata_and_folktologies&quot;&gt;hyperdata&lt;/a&gt; constraints. With the &lt;a href=&quot;https://sommer.dev.java.net/AddressBook.html&quot;&gt;Beatnik Address Book&lt;/a&gt; I have proven - to myself at least - that the creation of an  Open Distributed Social Network (a hot topic at the moment, see the Economist&apos;s recent article &lt;a href=&quot;http://www.economist.com/business/displaystory.cfm?story_id=10880936&quot;&gt;on Online social network&lt;/a&gt;) is  feasible and easy to do. What was missing is a way for people to keep some privacy, clearly a big selling point for the large Social Network Providers such as Facebook.  So I went on the search of a solution to create a  Open Distributed Social Network with privacy controls. And initially I had thought of using OpenId.
&lt;/p&gt;
&lt;h3&gt;OpenId Limitations&lt;/h3&gt;
&lt;p&gt;But OpenId has a few problems:
&lt;ul&gt;
&lt;li&gt;First it is really designed to work with the limitations of current web browsers. It is partly because of this that there is a lot of hopping around from the service to the Identity Provider with HTTP redirects. As &lt;a href=&quot;https://sommer.dev.java.net/AddressBook.html&gt;Beatnik&lt;/a&gt; is a new type of Semantic Web Application this feature of OpenId feels a lot like a limitation. It would be awkward if every time Beatnik downloads a new protected foaf file it would have to jump through all these hoops just in order to try gain access to a protected resource which it may in fact be denied access to. Something simpler was needed. Something that would work for the new Semantic Web Applications such as &lt;a href=&quot;http://dig.csail.mit.edu/2005/ajar/ajaw/About.html&quot;&gt;the Tabulator&lt;/a&gt;, &lt;a href=&quot;http://knowee.org/&quot;&gt;Knowee&lt;/a&gt; or &lt;a href=&quot;https://sommer.dev.java.net/AddressBook.html&quot;&gt;Beatnik&lt;/a&gt;.
&lt;li&gt;Parts of OpenId 2, and especially the &lt;a href=&quot;http://openid.net/specs/openid-attribute-exchange-1_0.html&quot;&gt;Attribute Exchange spec&lt;/a&gt; really don&apos;t feel very RESTful. There is a method for PUTing new property values in a database and a way to remove them that does not use either the HTTP PUT method or the DELETE method. 
&lt;li&gt;The OpenId Attribute Exchange is nice but not very flexible. It can keep some basic information about a person, but it does not make use of hyperdata. And the way it is set up, it would only be able to do so with great difficulty. A RESTfully published foaf file can give the same information, is a lot more flexible and extensible, whilst also making use of Linked Data, and as it happens also solves &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/2008_the_rise_of_linked&quot;&gt;the Social Network Data Silo problems&lt;/a&gt;. Just that!
&lt;li&gt;OpenId requires an Identity Server. There are a couple of problems with this:
&lt;ul&gt;&lt;li&gt;This server provides a Dynamic service but not a RESTful one. Ie. the representations sent back and forth to it, cannot be cached.  
&lt;li&gt;The service is a control point. Anyone owning such a service will know which sites you authenticate onto. True, you can set up your own service, but that is clearly not what is happening. The big players are offering their customers OpenIds tied to particular authentication servers, and that is what most people will accept. 
&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
As I found out by developing what I am here calling RDFAuth, for want of a better name, none of these restrictions are necessary.
&lt;/p&gt;
&lt;h3&gt;RDFAuth, a sketch&lt;/h3&gt;
&lt;p&gt;So following my strict architectural guidelines, I came across what I am just calling RDFAuth, but like everything else here this is a sketch and open to change. I am not a security specialist nor an HTTP specialist. I am like someone who comes to an architect in order to build a house on some land he has, with some sketch of what he would like the house to look like, some ideas of what functionality he needs and what the price he is willing to pay is. What I want here is something very simple, that can be made to work with a few perl scripts.&lt;/p&gt;
&lt;p&gt; Let me first present the actors and the resources they wish to act upon.
&lt;ul&gt;
&lt;li&gt;Romeo has a Semantic Web Address Book, his User Agent (UA). He is looking for the whereabouts of Juliette.
&lt;li&gt;Juliette has a URL identifier ( &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/i_have_a_foaf_file&quot;&gt;as I do&lt;/a&gt; ) which returns a public foaf representation and links to a protected resource.
&lt;li&gt;The protected resource contains information she only wants some people to know, in this instance Romeo. It contains information as to her current whereabouts.
&lt;li&gt;Romeo also has a public foaf file. He may have a protected one too, but it does not make an entrance in this scene of the play. His public foaf file links to a public PGP key. I described how that is done in &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/cryptographic_web_of_trust&quot;&gt;Cryptographic Web of Trust&lt;/a&gt;. 
&lt;li&gt;Romeo&apos;s  Public key is RESTfully stored on a server somewhere, accessible by URL.
&lt;/ul&gt;
&lt;/p&gt;
&lt;p&gt;So Romeo wants to find out where Juliette is, but Juliette only wants to reveal this to Romeo. Juliette has told her server to only allow Romeo, identified by his URL, to view the site. She could have also have had a more open policy, allowing any of her or Romeo&apos;s friends to have access to this site, as specified by their foaf file. The server could then crawl their respective foaf files at regular intervals to see if it needed to add anyone to the list of people having access to the site. This is what the &lt;a href=&quot;http://dig.csail.mit.edu/breadcrumbs/node/206&quot;&gt;DIG group did in conjunction with OpenId&lt;/a&gt;. Juliette could also have a policy that decides Just In Time, as the person presents herself, whether or not to grant them access. She could use the information in that person&apos;s foaf file and relating it to some trust metric to make her decision. How Juliette specifies who gets access to the protected resource here is not part of this protocol. This is completely up to Juliette and the policies she chooses her agent to follow.
&lt;/p&gt;
&lt;p&gt;So here is the sketch of the sequence of requests and responses.&lt;/p&gt;
&lt;img src=&quot;http://blogs.sun.com/bblfish/resource/2008/SequenceDiagram2.png&quot;/&gt;
&lt;ol&gt;
&lt;li&gt;First Romeo&apos;s user Agent knows that Juliette&apos;s foaf name is &lt;code&gt;http://juliette.org/#juliette&lt;/code&gt; so it  sends an HTTP GET request to Juliette&apos;s foaf file located of course at &lt;code&gt;http://juliette.org/&lt;/code&gt;&lt;br&gt;
The server responds with a public foaf file containing a link to the protected resource perhaps with the N3
&lt;pre&gt;
  &amp;lt;&amp;gt; rdfs:seeAlso &amp;lt;protected/juliette&amp;gt; .
&lt;/pre&gt;
Perhaps this could also contain some relations describing that resource as protected, which groups may access it, etc... but that is not necessary.
&lt;li&gt;Romeo&apos;s User Agent then decides it wants to check out &lt;code&gt;protected/juliette&lt;/code&gt;. It sends a GET request to that resource but this time receives a variation of the &lt;a href=&quot;http://en.wikipedia.org/wiki/Basic_access_authentication&quot;&gt;Basic Authentication Scheme&lt;/a&gt;, perhaps something like:
&lt;pre&gt;
HTTP/1.0 401 UNAUTHORIZED
Server: Knowee/0.4
Date: Sat, 1 Apr 2008 10:18:15 GMT
WWW-Authenticate: RdfAuth realm=&quot;http://juliette.org/protected/*&quot; nonce=&quot;ILoveYouToo&quot;
&lt;/pre&gt;
The idea is that Juliette&apos;s server returns a nonce (in order to avoid replay attacks), and a realm over which this protection will be valid.
But I am really making this up here. Better ideas are welcome.
&lt;li&gt;Romeo&apos;s web agent then encrypts some string (the realm?)  and the nonce with Romeo&apos;s private key. Only an agent trusted by Romeo can do this.
&lt;li&gt;The User Agent then sends a new GET request with the encrypted string, and his identifier, perhaps something like this
&lt;pre&gt;
GET /protected/juliette HTTP/1.0
Host: juliette.org
Authorization: RdfAuth id=&quot;http://romeo.name/#romeo&quot; key=&quot;THE_REALM_AND_NONCE_ENCRYPTED&quot;
Content-Type: application/rdf+xml, text/rdf+n3
&lt;/pre&gt;
Since we need an identifier, why not just use Romeos&apos; foaf name? It happens to also point to his foaf file. All the better.
&lt;li&gt;Because Juliette&apos;s web server can then use Romeo&apos;s foaf name to GET his public foaf file, which contains a link to his public key, as explained in &quot;&lt;a href=&quot;http://blogs.sun.com/bblfish/entry/cryptographic_web_of_trust&quot;&gt;Cryptographic Web of Trust&lt;/a&gt;&quot;.
&lt;li&gt;Juliette&apos;s web server can then query the returned representation, perhaps meshed with some other information in its database, with something equivalent to the following SPARQL query
&lt;pre&gt;
PREFIX wot: &amp;lt;http://xmlns.com/wot/0.1/&amp;gt;
SELECT ?pgp
WHERE {
     [] wot:identity &amp;lt;http://romeo.name/#romeo&amp;gt;;
        wot:pubkeyAddress ?pgp .
} 
&lt;/pre&gt;
The nice thing about working at the semantic layer, is that it decouples the spec a lot from the representation returned. Of course &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/language_is_a_virus&quot;&gt;as usage grows&lt;/a&gt; those representations that are understood by the most servers will create a de facto convention. Intially I suggest using RDF/XML of course. But it could just as well be N3, &lt;a href=&quot;http://www.w3.org/TR/xhtml-rdfa-primer/&quot;&gt;RDFa&lt;/a&gt;, perhaps even some microformat dialect, or even some GRDDLable XML, as the &lt;a href=&quot;http://www.w3.org/TR/2008/WD-powder-dr-20080317/&quot;&gt;POWDER&lt;/a&gt; working group is proposing to do.
&lt;li&gt;Having found the URL of the PGP key, Juliette&apos;s server, can GET it - and as with much else in this protocol cache it for future use. 
&lt;li&gt;Having the PGP key, Juliette&apos;s server can now decrypt the encrypted string sent to her by Romeo&apos;s User Agent. If the decrypted string matches the expected string, Juliette will know that the User Agent has access to Romeo&apos;s private key. So she decides this is enough to trust it.
&lt;li&gt;As a result Juliette&apos;s server returns the protected representation.
&lt;/ol&gt;
Now Romeo&apos;s User Agent knows where Juliette is, displays it, and Romeo rushes off to see her.
&lt;/p&gt;
&lt;h3&gt;Advantages&lt;/h3&gt;
&lt;p&gt;It should be clear from the sketch what the numerous advantages of this system are over OpenId. (I can&apos;t speak of other authentication services as I am not a security expert).
&lt;ul&gt;
&lt;li&gt;The User Agent has no redirects to follow. In the above example it needs to request one resource &lt;code&gt;http://juliette.org/&lt;/code&gt; twice (2 and 4) but that may only be necessary the first time it accesses this resource. The second time the UA can immediately jump to step 3. [but see problem with  replay attacks raised in the &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/rdfauth_sketch_of_a_buzzword#comments&quot;&gt;comments by Ed Davies&lt;/a&gt;, and my reply] Furthermore it may be possible - this is a question to HTTP specialists - to merge step 1 and 2. Would it be possible for a request 1. to return a 20x code with the public representation, plus a WWWAuthenticate header, suggesting that the UA can get a more detailed representation of the same resource if authenticated? In any case the redirect rigmarole of OpenId, which is really there to overcome the limitations of current web browsers, in not needed.
&lt;li&gt;There is no need for an Attribute Exchange type service. Foaf deals with that in a clear and extensible RESTful manner. This simplifies the spec dramatically.
&lt;li&gt;There is no need for an identity server, so one less point of failure, and one less point of control in the system. The public key plays that role in a clean and simple manner
&lt;li&gt;The whole protocol is RESTful. This means that all representations can be cached, meaning that steps 5 and 7 need only occur once per individual.
&lt;li&gt;As RDF is built for extensibility, and we are being architecturally very clean, the system should be able to grow cleanly.
&lt;/ul&gt;
&lt;h3&gt;Contributions&lt;/h3&gt;
&lt;p&gt;I have been quietly exploring these ideas on the foaf and semantic web mailing lists, where I received a lot of excellent suggestions and feedback.
&lt;ul&gt;
&lt;li&gt;In January I asked on foaf dev list how one should cut up a foaf file in order to be able to protect parts of the information, in a thread entitled &quot;&lt;a href=&quot;http://lists.foaf-project.org/pipermail/foaf-dev/2008-January/008793.html&quot;&gt;for more information please log in&lt;/a&gt;&quot;. This lead to an initial proposal by Dave Brondsema &lt;a href=&quot;http://lists.foaf-project.org/pipermail/foaf-dev/2008-January/008820.html&quot;&gt;which I summarized on Jan 18&lt;/a&gt;.
&lt;li&gt;This week I started out the conversation again, and extended it to the semantic web mailing list to get some wider interest with a thread entitled &quot;&lt;a href=&quot;http://www.w3.org/mid/5D8E6844-7021-4006-B35B-B26313BA6BD4@bblfish.net&quot;&gt;privacy and open data&lt;/a&gt;&quot;. 
&lt;li&gt;The above thread led me to sketch out more clearly the functioning of this protocol, with a post entitled &quot;&lt;a href=&quot;http://www.w3.org/mid/26D4ABDA-7CBE-4C40-B81B-DA7466DD5D5F@bblfish.net&quot;&gt;RDFAuth: an initial sketch&lt;/a&gt;&quot;, that developed into a very useful thread.  I tried to take account  some of the suggestions put forward there in writing this post. Others suggestions, such as the idea by Renato Gollin &lt;a href=&quot;http://www.w3.org/mid/47EBA849.8070004@ebi.ac.uk&quot;&gt;to work into this a three way challenge response&lt;/a&gt; are very interesting and should be looked into, but are way over my head.
&lt;li&gt;I had a &lt;a href=&quot;http://chatlogs.planetrdf.com/swig/2008-03-26.html#T15-46-40&quot;&gt;very useful discussion with Benjamin Nowack (a.k.a. bengee) on #swig&lt;/a&gt; where he pointed me to some initial work he had done on the same subject. He had sketched this out &lt;a href=&quot;http://esw.w3.org/topic/SweoIG/TaskForces/CommunityProjects/knowee/Brainstorming&quot;&gt;on the swig wiki&lt;/a&gt; and called it RDFAuth. Since this was clearly going in the same direction I took us to be working on the same project. The next day I found that we may have &lt;a href=&quot;http://chatlogs.planetrdf.com/swig/2008-03-27.html#T16-49-43&quot;&gt;slightly different views&lt;/a&gt; on how this should go. Bengee &lt;a href=&quot;http://www.w3.org/mid/PM-GA.20080327174434.E583A.2.1D@semsol.com&quot;&gt;seems to think we need a token server&lt;/a&gt;. I hope we really don&apos;t. The big advantage of using Public Key cryptography is that it massively simplifies the protocol. I still think I can convince him :-), so I have kept the name.
&lt;li&gt;Toby Inkster, &lt;a href=&quot;http://www.w3.org/mid/62649.81.2.120.180.1206622777.squirrel@goddamn.co.uk&quot;&gt;suggested a way to link this in with HTTPS&lt;/a&gt; which would be fabulous. I missed the post, and he reminded me by &lt;a href=&quot;http://www.w3.org/mid/m2g9c5-eqe.ln1@ophelia.g5n.co.uk&quot;&gt;summarising it here&lt;/a&gt;. Not being an https expert (yet) I can&apos;t comment. I have been reading up on this and it does seem to be an even better solution. See the thread on the &lt;a href=&quot;http://lists.w3.org/Archives/Public/ietf-http-wg/2008AprJun/0017.html&quot;&gt;HTTP-WG mailing list&lt;/a&gt;. It is really a brilliant idea. I am working on this and will post an update as soon as I have something working. 
&lt;li&gt;&lt;a href=&quot;http://www.rapattoni.com/cont/default.asp&quot;&gt;Peter Williams&lt;/a&gt; &lt;a href=&quot;http://lists.usefulinc.com/pipermail/foaf-dev/2008-March/009139.html&quot;&gt;suggested&lt;/a&gt; looking at &lt;a href=&quot;http://www.ietf.org/rfc/rfc2617.txt&quot;&gt;RFC 2617: on Basic and Digest Authentication&lt;/a&gt; and the less successful &lt;a href=&quot;http://tools.ietf.org/html/rfc2693&quot;&gt;RFC 2693 SPKI Certificate Theory&lt;/a&gt;.
&lt;/ul&gt;
&lt;h3&gt;Finally&lt;/h3&gt;
&lt;p&gt;So I suppose I am now looking for feedback from a wider community. PGP experts, security experts, REST and HTTP experts, semantic web and linked data experts, only you can help this get somewhere. I will never have the time to learn these fields in  enough detail by myself. In any case all this is absolutely obviously simple, and so completely unpatentable :-)&lt;/p&gt;
&lt;p&gt;Thanks for taking the time to read this&lt;/p&gt;

 &lt;/body&gt;
&lt;/html&gt;

</content:encoded>
       </item>
  <item rdf:about="http://blogs.sun.com/bblfish/entry/why_binary_relations_beat_tuples">        
     <title>how binary relations beat tuples</title>
     <link>http://blogs.sun.com/bblfish/entry/why_binary_relations_beat_tuples</link>
     <dct:modified>2008-03-21T05:14:12-07:00</dct:modified> 
     <dc:date>2008-03-20T05:40:09-07:00</dc:date> 
     <dc:creator>Henry Story</dc:creator>
     <foaf:maker xmlns:foaf="http://xmlns.com/foaf/0.1/">
        <foaf:Person rdf:about="http://bblfish.net/people/henry/card#me">
          <foaf:name>Henry Story</foaf:name>
        </foaf:Person>
     </foaf:maker>
          <dc:subject>SemWeb</dc:subject>
               <dc:subject>database</dc:subject>     
          <dc:subject>databases</dc:subject>     
          <dc:subject>java</dc:subject>     
          <dc:subject>kiwiknows</dc:subject>     
          <dc:subject>lisp</dc:subject>     
          <dc:subject>mysql</dc:subject>     
          <dc:subject>semweb</dc:subject>     
          <dc:subject>web2.0</dc:subject>     
                    <content:encoded>&lt;p&gt;Last week I was handed a puzzle by &lt;a href=&quot;http://www.pms.ifi.lmu.de/mitarbeiter/bry/&quot;&gt;Francois Bry&lt;/a&gt;: &quot;Why does &lt;a href=&quot;http://www.w3.org/2007/02/turtle/primer/&quot;&gt;RDF&lt;/a&gt; limit itself to binary relations? Why this deliberate lack of expressivity?&quot;. 

&lt;h3&gt;Logical Equivalence Reply&lt;/h3&gt;
My initial answer was that all tuples could be reduced to binary relations. So take a simple table like this:
&lt;/p&gt;
&lt;code&gt;
&lt;table border=&quot;1&quot;&gt;
&lt;thead&gt;
  &lt;tr&gt;&lt;td&gt;User ID&lt;/td&gt;&lt;td&gt;name&lt;/td&gt;&lt;td&gt;address&lt;/td&gt;&lt;td&gt;birthday&lt;/td&gt;&lt;td&gt;course&lt;/td&gt;&lt;td&gt;homepage&lt;/td&gt;&lt;/tr&gt;
&lt;tbody&gt;
  &lt;tr&gt;&lt;td&gt;1234&lt;/td&gt;&lt;td&gt;Henry Story&lt;/td&gt;&lt;td&gt;21 rue Saint Honor&#233;&lt;br&gt; Fontainebleau&lt;br&gt;France&lt;/td&gt;&lt;td&gt;29 July&lt;/td&gt;&lt;td&gt;philosophy&lt;/td&gt;&lt;td&gt;http://bblfish.net/&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;1235&lt;/td&gt;&lt;td&gt;Danny Ayers&lt;/td&gt;&lt;td&gt;Loc. Mozzanella, 7&lt;br&gt; Castiglione di Garfagnana&lt;br&gt;Lucca&lt;br&gt;Italy&lt;/td&gt;&lt;td&gt;14  Jan&lt;/td&gt;&lt;td&gt;semweb&lt;/td&gt;&lt;td&gt;http://dannyayers.com&lt;/td&gt;&lt;/tr&gt;  
&lt;/thead&gt;
&lt;/table&gt;
&lt;/code&gt;
&lt;p&gt;
The first row in the above column can be expressed as a set of binary relations as shown in this graph:
&lt;/p&gt;
&lt;img src=&quot;http://blogs.sun.com/bblfish/resource/2008/row1asGraph.png&quot;/&gt;
&lt;p&gt;The same can clearly be done for the second row. &lt;/p&gt;
&lt;p&gt;Since the two models express equivalent information I would opt aesthetically for the graph over the tuples, since it requires less primitives, which tends to make things simpler and clearer. Perhaps that can already be seen in the way the above table is screaming out for refactoring: a person may easily have more than one homepage. Adding a new homepage relation is easy, doing this in a table is a lot less so.&lt;/p&gt;
&lt;p&gt;But this line of argument will not convince a battle worn database administrator. Both systems do the same thing. One is widely deployed, the other not. So that is the end of the conversation. Furthermore it seems clear that retrieving a row in a table is quick and easy. If you need chunks of information to be together that beats the join that seems to be required in the graph version above. Pragmatics beats aesthetics hands down it seems.
&lt;/p&gt;

&lt;h3&gt;Global Distributed Open Data&lt;/h3&gt;
&lt;p&gt;The database engineer might have won the battle, but he will not win the war [1]. Wars are fought at a much higher level, on a global scale. The problem the Semantic Web is attacking is global data, not local data. On the Semantic Web, the web is the database and data is distributed and linked together. On the Semantic Web use case the data  &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/business_intelligence&quot;&gt;won&apos;t all be managed in one database by a few resource constrained superusers&lt;/a&gt; but distributed in different places and managed by the stake holder of that information. In our example we can imagine three stake holders of different pieces of information: Danny Ayers for his personal information, Me for mine, and the university for its course information. This information will then be available as resources on the web, returning different representations, which in one way or another may encode graphs such as the ones below. Note that duplication of information is a good thing in a distributed network. 
&lt;/p&gt;
&lt;img src=&quot;http://blogs.sun.com/bblfish/resource/2008/distributed-graphs.png&quot;&gt;
&lt;p&gt;
By working with the most simple binary relations, it is easy to cut information up down to their most atomic unit, publish them anywhere on the web, distributing the responsibility to different owners. This atomic nature of relations also makes it easy to merge information again. Doing this with tuples would be unnecessarily complex. Binary relations are a consequence of taking &lt;a href=&quot;http://en.wikipedia.org/wiki/Open_world_assumption&quot;&gt;the open world assumption&lt;/a&gt; seriously in a global space. By using Universal Resource Identifiers (URIs), it is possible for different documents to co-refer to the same entitities, and to link together entities in a global manner.
&lt;/p&gt;

&lt;h3&gt;The Verbosity critique&lt;/h3&gt;
&lt;p&gt;Another line of attack similar to the first could be that rdf is just too verbose. Imagine  the relation &lt;code&gt;children&lt;/code&gt; which would relate a person to a list of their children. If one sticks just with binary relations this is going to be very awkward to write out. In a graph it would look like this.
&lt;/p&gt;
&lt;img alt=&quot;image of a simple list as a graph&quot; src=&quot;http://blogs.sun.com/bblfish/resource/2008/list.png&quot;/&gt;
&lt;p&gt;Which in Turtle would give something like this:
&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
:Adam :children 
     [ a rdf:List;
       rdf:first :joe;
       rdf:rest [ a rdf:List;
            rdf:first :jane;
            rdf:rest rdf:nil ];
     ] .
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;
which clearly is a bit unnecessarily verbose. But that is not really a problem. One can, and Turtle has, developed a notation for writing out lists. So that one can write much more simply:
&lt;/p&gt;
&lt;code&gt;&lt;pre&gt;
:Adam :children ( :joe :jane ) .
&lt;/pre&gt;&lt;/code&gt;
&lt;p&gt;This is clearly much easier to read and write than the previous way (not to speak about the equivalent in rdf/xml). RDF is a structure developed at the semantic level. Different notations can be developed to express the same content. The reason it works is because it uses URIs to name things.&lt;/p&gt;

&lt;h3&gt;Efficiency Considerations&lt;/h3&gt;
&lt;p&gt;So what about the implementation question: with tables oft accessed data is closely gathered together. This it seems to me is an implementation issue. One can easily imagine RDF databases that would optimize the layout in memory of their data at run time in a Just in Time manner, depending on the queries received. Just as the Java JIT mechanism ends up in a overwhelming number of cases to be faster than hand crafted C, because the JIT can take advantage of local factors such as the memory available on the machine, the type of cpu, and other issues, which a statically compiled C binary cannot do. So in the case of the list structure shown above there is no reason why the database could not just place the :joe and jane in an array of pointers.&lt;/p&gt;
&lt;p&gt;In any case, if one wants distributed decentralised data, there is no other way to do it. Pragamatism does have the last word.
&lt;/p&gt;
&lt;h4&gt;Notes&lt;/h4&gt;
&lt;ol&gt;&lt;li&gt;Don&apos;t take the battle/war analogy too far please. Both DB technologies and Semantic Web ones can easily work together as demonstrated by tools such as &lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/d2rq/&quot;&gt;D2RQ&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
</content:encoded>
       </item>
  <item rdf:about="http://blogs.sun.com/bblfish/entry/semantic_web_for_the_working">        
     <title>Semantic Web for the Working Ontologist</title>
     <link>http://blogs.sun.com/bblfish/entry/semantic_web_for_the_working</link>
     <dct:modified>2008-03-19T11:30:25-07:00</dct:modified> 
     <dc:date>2008-03-19T04:41:30-07:00</dc:date> 
     <dc:creator>Henry Story</dc:creator>
     <foaf:maker xmlns:foaf="http://xmlns.com/foaf/0.1/">
        <foaf:Person rdf:about="http://bblfish.net/people/henry/card#me">
          <foaf:name>Henry Story</foaf:name>
        </foaf:Person>
     </foaf:maker>
          <dc:subject>SemWeb</dc:subject>
               <dc:subject>book</dc:subject>     
          <dc:subject>database</dc:subject>     
          <dc:subject>databases</dc:subject>     
          <dc:subject>java</dc:subject>     
          <dc:subject>semweb</dc:subject>     
          <dc:subject>web2.0</dc:subject>     
          <dc:subject>web3.0</dc:subject>     
                    <content:encoded>&lt;a href=&quot;http://www.amazon.com/Semantic-Web-Working-Ontologist-Effective/dp/0123735564/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1205922828&amp;sr=8-1&quot;&gt;&lt;img align=&quot;right&quot; src=&quot;http://blogs.sun.com/bblfish/resource/2008/SemanticWebForTheWorkingOntologist.jpg&quot;&gt;&lt;/a&gt;
&lt;p&gt;I am really excited to see that Dean Allemang and Jim Hendler&apos;s book &quot;&lt;a href=&quot;http://www.amazon.com/Semantic-Web-Working-Ontologist-Effective/dp/0123735564/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1205922828&amp;sr=8-1&quot;&gt;Semantic Web for the Working Ontologist&lt;/a&gt;&quot; is now available for pre-order on Amazon&apos;s web site.  When &lt;a href=&quot;http://dallemang.typepad.com/my_weblog/2007/06/swiss-java.html&quot;&gt;I met Dean at Jazoon 2007&lt;/a&gt; he let me have a peek at  an early copy of this book[1]: it was exactly what I had been waiting a long time for. A very easy introduction to the Semantic Web and reasoning that does not start with the unnecessarily complex RDF/XML [2] but with the one-cannot-be-simpler triple structure of RDF, and through a series of practical examples brings the reader step by step to a full view of all of &lt;a href=&quot;http://www.w3.org/2007/03/layerCake.png&quot;&gt;the tools in the Semantic Web stack&lt;/a&gt;, without a hitch, without a problem, fluidly. I was really impressed. Getting going in the Semantic Web is going to be a lot easier when this book is out. It should remove the serious problem current students are facing of having to find a way through a huge number of &lt;a href=&quot;http://www.w3.org/2001/sw/&quot;&gt;excellent but detailed specs&lt;/a&gt;, some of which are no longer relevant. One does not learn Java by reading &lt;a href=&quot;http://java.sun.com/docs/books/jvms/&quot;&gt;the Java Virtual Machine specification&lt;/a&gt; or even the &lt;a href=&quot;http://java.sun.com/docs/books/jls/&quot;&gt;Java Language Specification&lt;/a&gt;. Those are excellent tools to use once one has read many of the excellent introductory books such as the unavoidable &lt;a href=&quot;http://java.sun.com/docs/books/tutorial/index.html&quot;&gt;Java Tutorial&lt;/a&gt; or Bruce Eckel&apos;s &lt;a href=&quot;http://www.mindview.net/Books/TIJ/&quot;&gt;Thinking in Java&lt;/a&gt;. Dean Allemang and Jim Hendler&apos;s books are going to play the same role for the Semantic Web. Help get millions of people introduced to what has to be the most revolutionary development in computer science since the development of the web itself. Go and pre-order it. I am going to do this right now.
&lt;/p&gt;
&lt;h4&gt;Notes&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;the draft I looked at 9 months ago had introductions to ntriples, turtle, OWL explained via rules,  SPARQL, some simple well known ontologies such as  &lt;a href=&quot;http://www.w3.org/2004/02/skos/&quot;&gt;skos&lt;/a&gt; and &lt;a href=&quot;http://xmlns.com/foaf/0.1/&quot;&gt;foaf&lt;/a&gt;, and a lot more.&lt;/li&gt;
&lt;li&gt;The W3C has recently published a new &lt;a href=&quot;http://www.w3.org/2007/02/turtle/primer/&quot;&gt;RDF Primer in Turtle&lt;/a&gt; in recognition of the difficulty of getting going when the first step requires understanding RDF/XML.&lt;/li&gt;
&lt;/ol&gt;</content:encoded>
       </item>
  <item rdf:about="http://blogs.sun.com/bblfish/entry/drupal_s_future_is_the">        
     <title>Drupal’s future is the semantic web</title>
     <link>http://blogs.sun.com/bblfish/entry/drupal_s_future_is_the</link>
     <dct:modified>2008-03-19T10:29:36-07:00</dct:modified> 
     <dc:date>2008-03-07T08:45:50-08:00</dc:date> 
     <dc:creator>Henry Story</dc:creator>
     <foaf:maker xmlns:foaf="http://xmlns.com/foaf/0.1/">
        <foaf:Person rdf:about="http://bblfish.net/people/henry/card#me">
          <foaf:name>Henry Story</foaf:name>
        </foaf:Person>
     </foaf:maker>
          <dc:subject>SemWeb</dc:subject>
               <dc:subject>php</dc:subject>     
          <dc:subject>semweb</dc:subject>     
                    <content:encoded>&lt;p&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Dries_Buytaert&quot;&gt;Dries Buytaert&lt;/a&gt; the author of the PHP based &lt;a href=&quot;http://en.wikipedia.org/wiki/Drupal&quot;&gt;Drupal&lt;/a&gt; content management system, gave a very interesting presentation at &lt;a href=&quot;http://drupalcon.org/&quot;&gt;DrupalCon 2008&lt;/a&gt; where he layed out how the future of Drupal in the Semantic Web. See this very interesting Google video for some very clear explanation:&lt;/p&gt;
&lt;embed style=&quot;width:400px; height:326px;&quot; id=&quot;VideoPlayback&quot; type=&quot;application/x-shockwave-flash&quot; src=&quot;http://video.google.com/googleplayer.swf?docId=8487255297768440860&amp;hl=en&quot; flashvars=&quot;&quot;&gt; &lt;/embed&gt;
&lt;p&gt;
More information from:
&lt;ul&gt;
&lt;li&gt;Talis blog: &lt;a href=&quot;http://blogs.talis.com/n2/archives/37&quot;&gt;Drupal and the opportunity of RDF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;David Peterson&apos;s blog: &lt;a href=&quot;http://blogs.talis.com/n2/archives/37&quot;&gt;Drupal 7 - a living breathing Semantic Web citizen&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;the &lt;a href=&quot;http://ia341032.us.archive.org/3/items/DrupalconBoston2008-TheStateOfDrupal/05_Drupalcon_Boston_2008.mp3&quot;&gt;full DrupalCon talk&lt;/a&gt; as mp3&lt;/li&gt;
&lt;li&gt;Danny Ayers on Nodalities points to an interesting email in &quot;&lt;a href=&quot;http://blogs.talis.com/nodalities/2008/03/developers_calling_semantic_we.php&quot;&gt;Drupal calling Semantic Web..!&lt;/a&gt;&quot;&lt;/li&gt;
&lt;li&gt;The Semantic Web School in Austria has a &lt;a href=&quot;http://blog.semantic-web.at/?p=46&quot;&gt;diagram of a discussion they had on this subject&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/p&gt;</content:encoded>
       </item>
  <item rdf:about="http://blogs.sun.com/bblfish/entry/opening_sesame_with_networked_graphs">        
     <title>Opening Sesame with Networked Graphs</title>
     <link>http://blogs.sun.com/bblfish/entry/opening_sesame_with_networked_graphs</link>
     <dct:modified>2008-04-24T01:47:05-07:00</dct:modified> 
     <dc:date>2008-03-05T08:40:41-08:00</dc:date> 
     <dc:creator>Henry Story</dc:creator>
     <foaf:maker xmlns:foaf="http://xmlns.com/foaf/0.1/">
        <foaf:Person rdf:about="http://bblfish.net/people/henry/card#me">
          <foaf:name>Henry Story</foaf:name>
        </foaf:Person>
     </foaf:maker>
          <dc:subject>Java</dc:subject>
               <dc:subject>addressbook</dc:subject>     
          <dc:subject>databases</dc:subject>     
          <dc:subject>java</dc:subject>     
          <dc:subject>semweb</dc:subject>     
                    <content:encoded>&lt;a href=&quot;http://www.flickr.com/photos/bblfish/2199774712/&quot;&gt;&lt;img align=&quot;right&quot; src=&quot;http://farm3.static.flickr.com/2136/2199774712_264f7da7fd_m.jpg&quot;&gt;&lt;/a&gt;
&lt;a href=&quot;http://www.uni-koblenz.de/~sschenk/&quot;&gt;Simon Schenk&lt;/a&gt; just recently gave me an update to his &lt;a href=&quot;http://isweb.uni-koblenz.de/Research/NetworkedGraphs&quot;&gt;Networked Graphs&lt;/a&gt; library for the &lt;a href=&quot;http://openrdf.org/&quot;&gt;Sesame RDF Framework&lt;/a&gt;. Even though it is in early alpha state the jars have already worked wonders on my &lt;a href=&quot;https://sommer.dev.java.net/&quot;&gt;Beatnik Address Book&lt;/a&gt;. With &lt;a href=&quot;https://sommer.dev.java.net/source/browse/sommer/trunk/misc/AddressBook/src/net/java/sommer/addressbook/rules/networkedGraphRules.n3?rev=261&amp;view=markup&quot;&gt;four simple SPARQL rules&lt;/a&gt; I have been able to tie together most of the loose ends that appear between foaf files, as each one often uses different ways to refer to the same individual. &lt;p&gt;
&lt;h3&gt;Why inferencing is needed&lt;/h3&gt;
&lt;p&gt;So for example in my &lt;a href=&quot;http://bblfish.net/people/henry/card/&quot;&gt;foaf file&lt;/a&gt; I link to &lt;a href=&quot;http://www.webmink.net/&quot;&gt;Simon Phipps&lt;/a&gt;-  Sun&apos;s very popular Open Source Officer - with the following &lt;a href=&quot;http://www.w3.org/2000/10/swap/doc/&quot;&gt;N3&lt;/a&gt;:
&lt;code&gt;&lt;pre&gt;
 :me foaf:knows   [ a foaf:Person;
                    foaf:mbox_sha1sum &quot;4e377376e6977b765c1e78b2d0157a933ba11167&quot;;
                    foaf:name &quot;Simon Phipps&quot;;
                    foaf:homepage &amp;lt;http://www.webmink.net/&amp;gt;;
                    rdfs:seeAlso &amp;lt;http://www.webmink.net/foaf.rdf&amp;gt;;
                  ] .
&lt;/pre&gt;&lt;/code&gt;
For those who still don&apos;t know N3 (where have you been hiding?) this says that I know a foaf:Person named &quot;Simon Phipps&quot; whose homepage is specified and for which more information can be found at the &lt;a href=&quot;http://www.webmink.net/foaf.rdf&quot;&gt;http://www.webmink.net/foaf.rdf&lt;/a&gt; rdf file. Now the problem is that the person in question is identified by a &apos;[&apos; which represents a blank node. Ie we don&apos;t have a name (URI) for Simon. So when the Beatnik Address Book gets Simon&apos;s foaf file, by following the &lt;code&gt;rdfs:seeAlso&lt;/code&gt; relation, it gets among others something like
&lt;code&gt;&lt;pre&gt;
[] a foaf:Person;
   foaf:name &quot;Simon Phipps&quot;;
   foaf:nick &quot;webmink&quot;;
   foaf:homepage &amp;lt;/&amp;gt;;
   foaf:knows [ a foaf:Person;
                foaf:homepage &amp;lt;http://www.buzzword-compliant.com/&amp;gt;;
                rdfs:seeAlso &amp;lt;http://www.buzzword-compliant.com/foaf.rdf&amp;gt;;
             ] .
&lt;/pre&gt;&lt;/code&gt;
This file then contains at least two people. Which one is the same person? Well a human being would guess that the person named &quot;Simon Phipps&quot; is the same in both cases. Networked Graphs helps Beatnik make a similar guess by noting that the &lt;a href=&quot;http://xmlns.com/foaf/0.1/homepage&quot;&gt;foaf:homepage&lt;/a&gt; relation is an &lt;a href=&quot;http://www.w3.org/TR/owlref/#InverseFunctionalProperty-def&quot;&gt;owl:InverseFunctionalProperty&lt;/a&gt;.  
&lt;/p&gt;
&lt;h3&gt;Some simple rules&lt;/h3&gt;
&lt;p&gt;After downloading Simon Phipps&apos;s foaf file and mine and placing the relations found in them  in their own Named Graph, we can in Sesame 2.0 create a  merged view of both these graphs just by creating a graph that is the union of the triples of each .
&lt;p&gt;
The Networked Graph layer can then do some interesting inferencing  by defining a graph with the following &lt;a href=&quot;http://www.w3.org/TR/rdf-sparql-query/&quot;&gt;SPARQL&lt;/a&gt; rules
&lt;code&gt;&lt;pre&gt;
#foaf:homepage is inverse functional
grph: ng:definedBy &quot;&quot;&quot;
  CONSTRUCT { ?a &amp;lt;http://www.w3.org/2002/07/owl#sameAs&amp;gt; ?b .  } 
  WHERE { 
       ?a &amp;lt;http://xmlns.com/foaf/0.1/homepage&amp;gt; ?pg .
       ?b &amp;lt;http://xmlns.com/foaf/0.1/homepage&amp;gt; ?pg .
      FILTER ( ! SAMETERM (?a , ?b))   
 } &quot;&quot;&quot;^^ng:Query .
&lt;/pre&gt;&lt;/code&gt;
This is simply saying that if two names for things have the same homepage, then these two names refer to the same thing. I could be more general by writing rules at the &lt;a href=&quot;http://www.w3.org/2001/sw/WebOnt/&quot;&gt;owl level&lt;/a&gt;, but those would be but more complicated, and I just wanted to test out the Networked Graph sail to start with. So the above will add a bunch of owl:sameAs relations to our NetworkedGraph view on the Sesame database.&lt;/p&gt;
&lt;p&gt;The following two rules then just complete the information.
&lt;code&gt;&lt;pre&gt;
# owl:sameAs is symmetric
#if a = b then b = a 
grph: ng:definedBy &quot;&quot;&quot;
  CONSTRUCT { ?b &amp;lt;http://www.w3.org/2002/07/owl#sameAs&amp;gt; ?a . } 
  WHERE { 
     ?a &amp;lt;http://www.w3.org/2002/07/owl#sameAs&amp;gt; ?b . 
     FILTER ( ! SAMETERM(?a , ?b) )   
  } &quot;&quot;&quot;^^ng:Query .

# indiscernability of identicals
#two identical things have all the same properties
grph: ng:definedBy &quot;&quot;&quot;
  CONSTRUCT { ?b ?rel ?c . } 
  WHERE { ?a &amp;lt;http://www.w3.org/2002/07/owl#sameAs&amp;gt; ?b .
          ?a ?rel ?c . 
     FILTER ( ! SAMETERM(?rel , &amp;lt;http://www.w3.org/2002/07/owl#sameAs&amp;gt;) )   
  } &quot;&quot;&quot;^^ng:Query .
&lt;/pre&gt;&lt;/code&gt;
They make sure that when two things are found to be the same, they have the same properties. I think these two rules should probably be hard coded in the database itself, as they seem so fundamental to reasoning that there must be some very serious optimizations available.
&lt;/p&gt;
&lt;h3&gt;Advanced rules&lt;/h3&gt;
&lt;p&gt;Anyway the above illustrates just how simple it is to write some very clear inferencing rules. Those are just the simplest that I have bothered to write at present. Networked Graphs allows one to write much more interesting rules, which should help me solve the problems I explained in &quot;&lt;a href=&quot;http://blogs.sun.com/bblfish/entry/beatnik_change_your_mind&quot;&gt;Beatnik: change your mind&lt;/a&gt;&quot; where I argued that even a simple client application like an address book needs to be able to make judgements on the quality of information. Networked Graphs would allow one to write rules that would amount to &quot;only believe consequences of statements written by people you trust a lot&quot;. Perhaps this could be expressed in &lt;a href=&quot;http://www.w3.org/TR/rdf-sparql-query/&quot;&gt;SPARQL&lt;/a&gt; as 
&lt;code&gt;&lt;pre&gt;
CONSTRUCT { ?subject  ?relation ?object . }
WHERE {
    ?g tr:trustlevel ?tl .
    GRAPH ?g { ?subject ?relation ?object . }
    FILTER ( ?tl &amp;gt; 0.5 )
}
&lt;/pre&gt;&lt;/code&gt;

Going from the above it is easy to start imagining very interesting uses of Networked Graph rules. For example we may want to classify some ontologies as trusted and only do reasoning on relations over those ontologies. The inverse functional rule could then be generalized to

&lt;code&gt;&lt;pre&gt;
  PREFIX owl: &amp;lt;http://www.w3.org/2002/07/owl#&amp;gt;
  PREFIX : &amp;lt;https://sommer.dev.java.net/ontologies/beatnik#&gt;

  CONSTRUCT { ?a owl:sameAs ?b .  } 
  WHERE { 
      GRAPH ?g { ?inverseFunc a owl:InverseFunctionalProperty . }
      ?g a :TrustedOntology .

       ?a ?inverseFunc ?pg .
       ?b ?inverseFunc ?pg .
      FILTER ( ! SAMETERM (?a , ?b))   
 }
&lt;/pre&gt;&lt;/code&gt;
&lt;/p&gt;
&lt;h3&gt;Building the So(m)mer Address Book&lt;/h3&gt;
&lt;p&gt;I will be trying these out later. But for the moment you can already see the difference inferencing brings to an application by downloading &lt;a href=&quot;https://sommer.dev.java.net/AddressBook.html&quot;&gt;the Address Book&lt;/a&gt; from subversion at &lt;a href=&quot;https://sommer.dev.java.net/AddressBook.html&quot;&gt;sommer.dev.java.net&lt;/a&gt; and running the following commands (leave the password to the svn checkout blank)
&lt;pre&gt;&lt;code&gt;
&amp;gt; svn checkout https://sommer.dev.java.net/svn/sommer/trunk sommer --username guest
&amp;gt; cd sommer
&amp;gt; ant jar
&amp;gt; cd misc/AddressBook/
&amp;gt; ant run
&lt;/code&gt;&lt;/pre&gt;
Then you can just drag and drop the foaf file on this page into the address book, and follow the distributed social network by pressing the space bar to get foaf files. To enable inferencing you currently need to set it in the &lt;code&gt;File&amp;gt;Toggle Rules&lt;/code&gt; menu. You will see things coming together suddenly when inferencing is on.&lt;p&gt;
&lt;a href=&quot;http://www.flickr.com/photos/bblfish/2312034119/sizes/o/&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3105/2312034119_8513ab143c.jpg?v=0&quot;&gt;&lt;/a&gt;
&lt;p&gt;There are still a lot of bugs in this software. But you are welcome to post bug reports, or help out in any way you can.&lt;/p&gt;
&lt;h3&gt;Where this is leading&lt;/h3&gt;
&lt;p&gt;Going further it seems to me clear that Networked Graphs is starting to realise what &lt;a href=&quot;http://en.wikipedia.org/wiki/Ramanathan_V._Guha&quot;&gt;Guha&lt;/a&gt;, one of the pioneers of the semantic web, wrote about in this thesis &lt;a href=&quot;http://www-formal.stanford.edu/guha/&quot;&gt;&quot;Contexts: A Formalization and Some Applications&quot;&lt;/a&gt;, which I wrote a short note on &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/it_s_all_about_context&quot;&gt;Keeping track of Context in Life and on the Web&lt;/a&gt; a couple of years ago. That really helped me get a better understanding of the possibilities of the semantic web.
&lt;/p&gt;
</content:encoded>
       </item>
  <item rdf:about="http://blogs.sun.com/bblfish/entry/sparqling_calling_codes">        
     <title>sparqling international calling codes</title>
     <link>http://blogs.sun.com/bblfish/entry/sparqling_calling_codes</link>
     <dct:modified>2008-02-29T03:11:15-08:00</dct:modified> 
     <dc:date>2008-02-28T13:20:58-08:00</dc:date> 
     <dc:creator>Henry Story</dc:creator>
     <foaf:maker xmlns:foaf="http://xmlns.com/foaf/0.1/">
        <foaf:Person rdf:about="http://bblfish.net/people/henry/card#me">
          <foaf:name>Henry Story</foaf:name>
        </foaf:Person>
     </foaf:maker>
          <dc:subject>Java</dc:subject>
               <dc:subject>databases</dc:subject>     
          <dc:subject>semweb</dc:subject>     
                    <content:encoded>&lt;p&gt;The other day I was looking for a list of international calling codes. Since most of them are listed in Wikipedia, it occurred to me it would be easy to get all that information in a nice easy to use format by querying &lt;a href=&quot;http://dbpedia.org/&quot;&gt;DBPedia&lt;/a&gt; with &lt;a href=&quot;http://www.w3.org/TR/rdf-sparql-query/&quot;&gt;SPARQL&lt;/a&gt;. So I wrote a very light weight SPARQL client (&lt;a href=&quot;https://sommer.dev.java.net/source/browse/sommer/trunk/misc/Utils/src/net/java/dev/sommer/tools/Sparql.java?rev=277&amp;view=markup&quot;&gt;source code available here&lt;/a&gt;). &lt;a href=&quot;https://sommer.dev.java.net/source/browse/sommer/trunk/misc/Utils/Sparql.jar?rev=278&amp;view=log&quot;&gt;Download the jar&lt;/a&gt; and you can then run the following query:

&lt;pre&gt;
hjs@bblfish:0$ java -jar Sparql.jar &amp;gt; results.n3
&lt;font color=&quot;blue&quot;&gt;
PREFIX dbp: &amp;lt;http://dbpedia.org/property/&amp;gt;
PREFIX rdfs: &amp;lt;http://www.w3.org/2000/01/rdf-schema#&amp;gt; 

CONSTRUCT {  ?cntry dbp:callingCode ?code ;
                    rdfs:label ?name . 
} WHERE {
        ?cntry dbp:callingCode ?code .
        OPTIONAL { ?cntry rdfs:label ?name . }
}

&lt;/font&gt;
^d
&lt;/pre&gt;
That is after typing the command line &lt;code&gt;java -jar Sparrql.jar &amp;gt; results.n3&lt;/code&gt; I pasted the SPARQL query (in blue above) and ended the input with control-d, which on unix is the end-of-file character.
This sent the query to DBPedia, and returned a long list of answers which were place in &lt;code&gt;results.n3&lt;/code&gt; of which the first set is
&lt;pre&gt;
&amp;lt;http://dbpedia.org/resource/Abu_Dhabi_%28emirate%29&amp;gt; &amp;lt;http://www.w3.org/2000/01/rdf-schema#label&amp;gt; &quot;\u963F\u5E03\u624E\u6BD4\u914B\u957F\u56FD\&quot;&quot;@zh ,
		&quot;Abu Dhabi (emirate)&quot;@en ,
		&quot;Abu Dhabi (emirato)&quot;@it ,
		&quot;\u0410\u0431\u0443-\u0414\u0430\u0431\u0438 (\u044D\u043C\u0438\u0440\u0430\u0442)\&quot;&quot;@ru ;
	&amp;lt;http://dbpedia.org/property/callingCode&amp;gt; &quot;971-2&quot;@en .
&lt;/pre&gt;
&lt;p&gt;
In the above case the calling code should proabaly not be tagged with an @en. So the data still needs to be cleaned up a little at present. It would be nice to be able to quickly fix the data when one notices something like this. Most of the other results are in xsd:integer format, which I think is also not quite right. The literal string is a better representation of a calling code I think.&lt;/p&gt;
&lt;p&gt;Anyway the data is easy to clean up. And we have  an example of a very simple but useful query.&lt;/p&gt;
</content:encoded>
       </item>
  <item rdf:about="http://blogs.sun.com/bblfish/entry/semantic_bar_camp_london_and">        
     <title>Semantic Bar Camp London and Flue</title>
     <link>http://blogs.sun.com/bblfish/entry/semantic_bar_camp_london_and</link>
     <dct:modified>2008-04-24T02:03:52-07:00</dct:modified> 
     <dc:date>2008-02-25T04:17:18-08:00</dc:date> 
     <dc:creator>Henry Story</dc:creator>
     <foaf:maker xmlns:foaf="http://xmlns.com/foaf/0.1/">
        <foaf:Person rdf:about="http://bblfish.net/people/henry/card#me">
          <foaf:name>Henry Story</foaf:name>
        </foaf:Person>
     </foaf:maker>
          <dc:subject>SemWeb</dc:subject>
               <dc:subject>addressbook</dc:subject>     
          <dc:subject>art</dc:subject>     
          <dc:subject>conference</dc:subject>     
          <dc:subject>semweb</dc:subject>     
          <dc:subject>travel</dc:subject>     
                    <content:encoded>&lt;a href=&quot;http://www.flickr.com/photos/bblfish/2290424269/sizes/l/&quot;&gt;&lt;img align=&quot;right&quot; src=&quot;http://farm4.static.flickr.com/3040/2290424269_cf4df2abf4_m.jpg&quot;&gt;&lt;/a&gt;
&lt;p&gt;Last Saturday early early morning I took the train to London to go to the weekend &lt;a href=&quot;http://semanticcamp.tommorris.org/&quot;&gt;Semantic Bar Camp that was held at Imperial College&lt;/a&gt;, in the computer science department I studied in. I arrived, late, because I had missed the train in Paris by one minute, and so missed getting an overview of the event. On arrival I was asked to  put my name down for a presentation and stick the paper on the board on the first empty slot available. 15 minutes later I improvised a talk on Linked Data. I did not realize that there were a lot of microformats people in the audience with little semantic web experience, so I did not take care enough to lay some important foundations, and show how microformats information should be able to work well with information in an RDF database [1]. I demonstrated &lt;a href=&quot;https://sommer.dev.java.net/AddressBook.html&quot;&gt;the Beatnik Address Book&lt;/a&gt; and gave an overview of why this was now filling a really important gap, enabling distributed social networks, a topic on which I have written a lot recently. It inspired Dan Brickley who has been working on &lt;a href=&quot;http://blog.dbtune.org/post/2008/02/25/Playing-with-SPARQL-and-XMPP&quot;&gt;SPARQL over XMPP&lt;/a&gt; to give me some code and show how this could be integrated into Beatnik... It seems pretty easy to do. What would the use case be though...&lt;/p&gt;
&lt;p&gt;
There were a number of very interesting talks over the weekend.  Daniel Lewis &lt;a href=&quot;http://vanirsystems.com/danielsblog/2008/02/22/semanticcamp-some-blog-posts/&quot;&gt;collected a few of the blogs covering the event&lt;/a&gt;. Ian Davis presented the work he has been leading on &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/open_data_licences&quot;&gt;Open Data Licences&lt;/a&gt; (&lt;a href=&quot;http://www.flickr.com/photos/bblfish/2291197252/&quot;&gt;pic&lt;/a&gt;).  Yves Raimond and his team presented some interesting work on semantics and music and an advanced inferencing engine based on SWI Prolog called &lt;a href=&quot;http://code.google.com/p/km-rdf/&quot;&gt;Henry&lt;/a&gt; (&lt;a href=&quot;http://www.flickr.com/photos/bblfish/2290397141/&quot;&gt;picture&lt;/a&gt;)&lt;/a&gt;. &lt;a href=&quot;http://www.linkedin.com/in/tomshelley&quot;&gt;Tom Shelley&lt;/a&gt;  from the Economist got us all asking questions on the pros and cons of personal knowledge in a short presentation (&lt;a href=&quot;http://www.flickr.com/photos/bblfish/2291204162/&quot;&gt;picture&lt;/a&gt;). The more information is known on us the better services can be offered, but also what are the risks? Is this not a reason one may end up needing agent technology: ie one may prefer programs to move rather than data to move? Georgi Kobilarov gave a nice overview of the very  useful Linked Data project &lt;a href=&quot;http://dbpedia.org/&quot;&gt;DBPedia&lt;/a&gt; (&lt;a href=&quot;http://www.flickr.com/photos/bblfish/2290400995/&quot;&gt;picture&lt;/a&gt;)...&lt;/p&gt;
&lt;p&gt;All during the weekend I felt very tired which I put down for a while to the trip from Paris. On Monday morning as my condition had gotten much worse it became clear that that I had caught a virus. For two days I could hardly get out of bed, struck by a vicious flue, which has only just left me today. On Friday I was too tired to do any thinking work, so I went to see the Du Champ, Man Ray and Picabia exhibition at the Tate Modern, where you can see Du Champ&apos;s irreverent rendition of the Mona Lisa - below the picture are written the letters &quot;L.H.O.O.Q&quot; which if pronounced speedily enough sounds like &quot;Elle a chaud au cul&quot;.&lt;/p&gt;
&lt;h3&gt;Notes&lt;/h3&gt;
&lt;ol&gt;&lt;li&gt;All I need is some XSLT or Xquery transform to turn microformatted html into RDF (any well known format will do). Mind you, at a later microformat talks it turns out that this may not be quite so easy, as it seems that that the microformat community has not yet agreed on a clear grammar...
&lt;/ol&gt;</content:encoded>
       </item>
  <item rdf:about="http://blogs.sun.com/bblfish/entry/proof_data_portability_requires_linked">        
     <title>Proof: Data Portability requires Linked Data</title>
     <link>http://blogs.sun.com/bblfish/entry/proof_data_portability_requires_linked</link>
     <dct:modified>2008-02-21T04:35:36-08:00</dct:modified> 
     <dc:date>2008-02-15T12:29:09-08:00</dc:date> 
     <dc:creator>Henry Story</dc:creator>
     <foaf:maker xmlns:foaf="http://xmlns.com/foaf/0.1/">
        <foaf:Person rdf:about="http://bblfish.net/people/henry/card#me">
          <foaf:name>Henry Story</foaf:name>
        </foaf:Person>
     </foaf:maker>
          <dc:subject>SemWeb</dc:subject>
               <dc:subject>community</dc:subject>     
          <dc:subject>identity</dc:subject>     
          <dc:subject>semweb</dc:subject>     
          <dc:subject>web</dc:subject>     
          <dc:subject>web2.0</dc:subject>     
          <dc:subject>web3.0</dc:subject>     
                    <content:encoded>&lt;p&gt;&lt;a href=&quot;http://blogs.sun.com/bblfish/entry/data_portability_the_video&quot;&gt;Data Portability&lt;/a&gt; requires &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/hyperdata_and_folktologies&quot;&gt;Linked Data&lt;/a&gt;. 
To show this let me take a concrete and topical example that is the core use case of the Data Portability movement: Jane wants to move her account from social network A to social network B. And she wants to do this in a way that entails the minimal loss of information. 
&lt;/p&gt;
&lt;p&gt;Let us suppose Jane wants to make a rich copy, and that she wants to do this without &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/hyperdata_and_folktologies&quot;&gt;hyperdata&lt;/a&gt;. Ideally she would like  to have exactly the same information in the new space as she had in the old space. So if Jane had a network of friends in social network A she would like to have the same network of friends in B.  But this implies moving all the information about all her friends from A to B, including their social network too. For after all the great thing about one&apos;s friends is how they can help us make new friends. But then would one not want to move all the social network of one&apos;s friends too? Where does it stop? As William Blake said so well in &lt;a href=&quot;http://www.artofeurope.com/blake/bla3.htm&quot;&gt;Auguries of Innocence&lt;/a&gt;

&lt;blockquote&gt;&lt;pre&gt;
        To see a world in a grain of sand,
	And a heaven in a wild flower,
	Hold infinity in the palm of your hand,
	And eternity in an hour.
&lt;/pre&gt;
&lt;/blockquote&gt;

the problem is that everything is linked in some way, and so it is impossible to move one thing and all its relations from one place to another using just copy by value, without moving everything. A full and rich copy is therefore impossible.&lt;/p&gt;
&lt;p&gt;So what about pragmatically limiting ourselves to some subset of the information? We have to reduce our ambitions. So let us limit the data Jane can move to just her personal data and closest social network. So she copies some subset of the information about her friends over to network B. Nice, but who is going to keep that information up to date? When Jane&apos;s friend Jack moves house, how is Jane going to know about this in her new social network? Would Jack not have to keep his information on social Network B up to date too? And now if every one of Jack&apos;s 1000 friends moves to a different social network, won&apos;t he have to now keep 1000 identities up to date on each of those networks? Making it easy for Jane to move social network is going to make life hell for Jack it seems. Well of course not: Jack is never going to keep the information about himself up to date on these other social networks, however limited it is going to be. And so if Jane moves social network she is going to have to leave her friends behind.&lt;/p&gt;
&lt;p&gt;The solution of course is not to try to copy the information about one&apos;s friends from one social network to another, but rather to move one&apos;s own information over and then link back to one&apos;s friends in their preferred social network. By linking by reference to one&apos;s friends identity one reduces to a minimum the information that needs to be ported whilst maintaining all the relationships that existed previously. Thus one can move one&apos;s identity without loss. &lt;/p&gt;
&lt;p&gt;The rest follows nearly immediately from these observations. Since the only way to refer to resources in a global namespace is via URIs ( and the most practical way currently is to do this with URLs ), URI&apos;s  will play the role of pointers in our space. This is the key architectural decision of the semantic web. So by giving people URLs as names we can point to our friends wherever they are, and even move our data without loss. All we need to do when we move our &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/i_have_a_foaf_file&quot;&gt;foaf file&lt;/a&gt; is to have the web server serve up a HTTP redirect message at the old URL, and all links to our old file will be redirected to our new home.
&lt;/p&gt;

&lt;h3&gt;Notes&lt;/h3&gt;
&lt;ul&gt;&lt;li&gt;This article came out of an &lt;a href=&quot;http://groups.google.com/group/dataportability-public/browse_thread/thread/8075d4f98d94b2c7?hl=en&quot;&gt;email to the data portability group&lt;/a&gt;.
&lt;li&gt;For a very good tutorial introduction to hyperdata see &quot;&lt;a href=&quot;http://www4.wiwiss.fu-berlin.de/bizer/pub/LinkedDataTutorial/&quot;&gt;How to Publish Linked Data on the Web&lt;/a&gt;&quot; by Chris Bizer, Richard Cyganiak, and Tom Heath .
&lt;/ul&gt;
</content:encoded>
       </item>
  <item rdf:about="http://blogs.sun.com/bblfish/entry/replacing_ant_with_rdf">        
     <title>replacing ant with rdf</title>
     <link>http://blogs.sun.com/bblfish/entry/replacing_ant_with_rdf</link>
     <dct:modified>2008-02-06T06:34:10-08:00</dct:modified> 
     <dc:date>2008-02-06T02:39:38-08:00</dc:date> 
     <dc:creator>Henry Story</dc:creator>
     <foaf:maker xmlns:foaf="http://xmlns.com/foaf/0.1/">
        <foaf:Person rdf:about="http://bblfish.net/people/henry/card#me">
          <foaf:name>Henry Story</foaf:name>
        </foaf:Person>
     </foaf:maker>
          <dc:subject>Java</dc:subject>
               <dc:subject>java</dc:subject>     
          <dc:subject>netbeans</dc:subject>     
          <dc:subject>semweb</dc:subject>     
                    <content:encoded>&lt;p&gt;Tim Boudreau just recently asked &quot;&lt;a href=&quot;http://weblogs.java.net/blog/timboudreau/archive/2008/01/what_if_we_buil.html&quot;&gt;What if we built Java code with...Java?&lt;/a&gt;&quot;. Why not replace Ant or Maven xml build documents with Java (Groovy/Jruby/jpython/...) scripts? It could be a lot easier to program for Java programmers, and much easier to understand for them too. Why go through xml, when things could be done more simply in a universal language like Java? Good question. But I think it depends on what types of problem one wants to solve. Moving to Java makes the procedural aspect of a build easier to program for a certain category of people. But is that a big enough advantage to warrant a change? Probably not. If we are looking for an improvement, why not explore something really new, something that might resolve some as yet completely unresolved problems at a much higher level? Why not explore what a &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/hyperdata_and_folktologies&quot;&gt;hyperdata&lt;/a&gt; build system could bring to us? Let me start to sketch out some ideas here, very quickly, because I am late on a few other projects I am meant to be working on.&lt;/p&gt;
&lt;p&gt;The answer to software becoming more complicated has been to create clear interfaces between the various pieces, and have people specialise in building components to the interfaces. It&apos;s the &quot;small is beautiful&quot; philosophy of Unix. As a result though, as software complexity builds up, every piece of software requires more and more pieces of other software, leading us from a system of independent software pieces to networked software. Let me be clear. The software industry has been speaking a lot about software containing networked components and being deployed on the network. This is not what I am pointing to here. No I want to emphasise that the software itself is built of components on the network. Ie. we need more and more a networked build system. This should be a big clue as to why hyperdata can bring something to the table that other systems cannot. Because RDF is a language whose pointer system is build on the Universal Resource Identifier (URI) it eats networked components for lunch, breakfast and dinner. (&lt;a href=
&quot;http://blogs.sun.com/bblfish/entry/jazoon_web_3_0&quot;&gt;see my Jazoon presentation&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Currently my &lt;a href=&quot;https://sommer.dev.java.net/&quot;&gt;subversion repository&lt;/a&gt; consists of a lot of lib subdirectories  full of jar files taken from other projects. Would it not be better if I referred to these libraries by URL instead? The URL where they can be HTTP gotten from of course? Here are a few advantages:
&lt;ul&gt;
&lt;li&gt;it would use up less space in my SubVersion repository. A pointer just takes up less space than an executable in most cases.
&lt;li&gt;it would use up less space on the hard drive of people downloading my code. Why? Because I am referring to the jar via a universal name, a clever IDE will be able to use the local cached version already downloaded for another tool.
&lt;li&gt;it would make setting up IDE&apos;s a lot easier. Again because each component now has a Universal Name, it will be possible to link up jars to their source code once only.
&lt;li&gt;the build process, describing as it does how the code relates to the source, can be used by IDEs to jump to the source (also identified via URLs) when debugging a library on the network. (see some work I started on a bug ontology called &lt;a href=&quot;http://code.google.com/p/baetle/&quot;&gt;Baetle&lt;/a&gt;)
&lt;li&gt;Doap files can be then used to tie all these pieces together, allowing people to just drag and drop projects from a web site onto their IDE, as &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/doap_bean_available&quot;&gt;I demonstrated with Netbeans&lt;/a&gt;
&lt;li&gt; as IDE gain knowledge of which components are successors to which other components, from such DOAP files, it is easy to imagine them developing RSS like functionality, where it scans the web for updates to your software components, and alerts you to those updates which you can then test out quickly yourself.
&lt;li&gt;The system can be completely decentralised, making it a WEB 3.0 system, rather than a web 2.0 system. It should be as easy as having to place your components and your RDF file on a web server served up with the correct mime types.
&lt;li&gt;It will be easy to link up jars or source code ( referred to as usual by URLs ) to bugs (described via something like &lt;a href=&quot;http://code.google.com/p/baetle/&quot;&gt;Baetle&lt;/a&gt; ). Making it easy to describe how bugs in one project depend on bugs in other projects.
&lt;/ul&gt;
&lt;p&gt;So here are just a few of the advantages that a hyperdata based build system could bring. They seem important enough in my opinion to justify exploring this in more detail. Ok. Well, let me try something here. When compiling files one needs the following: a classpath and a number of source files.
&lt;pre&gt;
@prefix java: &amp;lt;http://rdf.sun.com/java/&amp;gt; .

_:cp a java:ClassPath;
       java:contains ( &amp;lt;http://apache.multidist.com/cocoon/2.1.11&amp;gt; &amp;lt;http://openrdf.org/sesame/2.0/&amp;gt; ) .

_:outputJar a java:Jar;
       java:buildFrom &amp;lt;src&amp;gt;;
       java:classpath _:cp .

_:outputJar 
        :pathtemplate &quot;dist/${date}/myprog.jar&quot;;
        :fullList &amp;lt;outputjars.rdf&amp;gt; .
&lt;/pre&gt;

If the publication mechanism is done correctly the relative URLs should work on the file system just as well as they do on the http view of the repository.  Making a jar would then be a matter of some program following the URLs to download all the pieces (if needed), put them in place and use that to build the code. Clearly this is just a sketch. Perhaps someone else has already had thoughts on this?
&lt;/p&gt;</content:encoded>
       </item>
  <item rdf:about="http://blogs.sun.com/bblfish/entry/3_semantic_web_talks_for">        
     <title>3 semantic web talks for JavaOne 2008</title>
     <link>http://blogs.sun.com/bblfish/entry/3_semantic_web_talks_for</link>
     <dct:modified>2008-04-24T01:47:37-07:00</dct:modified> 
     <dc:date>2008-02-01T09:44:36-08:00</dc:date> 
     <dc:creator>Henry Story</dc:creator>
     <foaf:maker xmlns:foaf="http://xmlns.com/foaf/0.1/">
        <foaf:Person rdf:about="http://bblfish.net/people/henry/card#me">
          <foaf:name>Henry Story</foaf:name>
        </foaf:Person>
     </foaf:maker>
          <dc:subject>Java</dc:subject>
               <dc:subject>addressbook</dc:subject>     
          <dc:subject>conference</dc:subject>     
          <dc:subject>javaone</dc:subject>     
          <dc:subject>semweb</dc:subject>     
                    <content:encoded>&lt;p&gt;At least 3 semantic web talks were accepted for &lt;a href=&quot;http://java.sun.com/javaone/sf/&quot;&gt;JavaOne 2008&lt;/a&gt;, taking place on May 6-9 in San Francisco. There may be more, but the following I am sure of:
&lt;ul&gt;&lt;li&gt;A talk by &lt;a href=&quot;http://dallemang.typepad.com/&quot;&gt;Dean Allemang&lt;/a&gt; on practical ontology writing based on his soon to be published book &quot;The Working Ontologist&quot;. I am really looking forward to it coming out, as it is  a book that should help cut down the learning curve dramatically. 
&lt;li&gt;&#220;ber programmer &lt;a href=&quot;http://weblogs.java.net/blog/timboudreau/&quot;&gt;Tim Boudreau&lt;/a&gt; and I will be presenting &lt;a href=&quot;http://sommer.dev.java.net/&quot;&gt;Beatnik: Building an Open Social Network Browser&lt;/a&gt; at a Birds of a Feather session. We will look at both the client and server side components and how the theory developed by Dean can turn into a practical product that solves real problems: the data silo effect of current social networking sites.
&lt;li&gt;Finally some key players will be joining the  &quot;Developing Semantic Web Applications on the Java&#8482; Platform&quot; panel where we will hopefully start a discussion and get feedback on what can be done to bring many many more of the 5 million Java developers on board the semantic web. This panel discussion ( the list of panelists is not complete yet ) will be hosted by Rob Frost of BEA and I.
&lt;/ul&gt;  
&lt;p&gt;Hopefully this should allow the 20 thousand or so attendees joining us at JavaOne to get a good overview of the the practical developments in this area. And if they like it, the &lt;a href=&quot;http://semanticconference.com/&quot;&gt;Semantic Conference&lt;/a&gt; in San Jose will be taking place a week later from the 18th to the 22nd of May where they will be able meet many of the leading companies and researchers in this area.
&lt;/p&gt;
&lt;p&gt;For detailed session information &lt;a href=&quot;http://blogs.sun.com/bblfish/entry/three_semantic_web_talks_at&quot;&gt;see my later post&lt;/a&gt;.
&lt;/p&gt;</content:encoded>
       </item>
</rdf:RDF> 
