DOAP and the Linked Data Web

From the LOD mailing-list, I discovered and browsed doapspace.org, that aims to build a DOAP repository. Contrary to doap:store that fetches RDF files from the Web thanks to PTSW, one of the nice feature of doapspace is that it creates DOAP files from services that do not offer such meta-data for their projects, such as SourceForge or FreshMeat.

Rob already scrapped about 45000 DOAP files ! And should be able in a few days to ping PTSW to inform it about new files, that can the be crawled into doap:store, browsed… and SPARQLed - let’s hope my box can support such amount of data and queries…

As discussed on the mailing-list, this service could be a great way to make DOAP enter one step further into the Linked Data Web. What’s currently missing is URIs, for projects and people. I noticed when creating doap:store that many projects don’t have an URI (and are just blank nodes), which makes impossible to link to them from external files, as FOAF profiles.

Now, imagine that doapspace scrapper creates URI for all people and projects, based on the service name and user / project id on the original service. Using owl:sameAs and rdfs:seeAlso, anyone could add something like this in its FOAF profile:

<foaf:Person rdf:about="#me">
  <owl:sameAs
    rdf:resource="http://doapspace.org/user/sf/terraces"
    rdf:seeAlso="http://doapspace.org/user/sf/terraces/rdfview"/>
  <owl:sameAs
    rdf:resource="http://doapspace.org/user/fm/terraces"
    rdf:seeAlso="http://doapspace.org/user/fm/terraces/rdfview"/>
</foaf:Person>

Then, by reading my FOAF profile with Tabulator or any Linked Data Browser I can easilly browse my profiles on doapspace, that would ideally list all projects (with their URIs) I’m into and that I can browse again, thanks again to seeAlso links.

Another advantage is that I don’t have to mention the projects I maintain in my FOAF file, but let doapspace do the job for me, since using owl:sameAs will tell that these different URIs identify the same person (= me). Then using a single SPARQL query on these files with an engine that supports owl:sameAs, I can easilly find all projects I’m into, whereas it comes from:

select ?project
where {
  ?project doap:maintainer <my_foaf_URI>
}

The final step would be to query only my FOAF profile, and let the engine discover / identify doapspace URIs and retrieve profiles to add them in its files to query, as the Semantic Web Client library does, but I don’t know if it currently supports owl:sameAs or not.

Retrieving FOAF profile from OpenID

Following Dan Brickley’s experiments, I’ve just setup an OpenID plug-in for this weblog, allowing anyone to register using OpenID, since users now need to register to comment.

Actually, one of the reason I installed it is that I thaught it would be an easy way to retrieve a FOAF profile for any registered user on this weblog. I’m using auto-discovery to get it from the OpenID URL. I don’t know if there’s any OpenID provider that have such a feature, but it can easilly be done if you’re delegating your OpenID to your own webpage, by adding the auto-discovery line in the header of your OpenID URL (check the source of this page if needed). BTW, WP users, here’s another plugin that helps to delegate your OpenID to your weblog.

The method I used to retrieve the profile is the following:

function fetch_foaf_profile($url) {
  $html = file_get_contents($url);
  preg_match_all('/<head.*<link.*rel="meta".*title="foaf".*href="(.*)".*\/>.*<\/head>/Usi', $html, $links);
  if($links) {
    if($foaf = $links[1][0]) {
      $ex = parse_url($foaf);
      if($ex['scheme']) return $foaf;
      elseif(substr($ex['path'], 0, 1) == '/') {
        $ex = parse_url($url);
        return $ex['scheme'].'://'.$ex['host'].$foaf;
      }
      else return $url.$foaf;
    }
  }
  return null;
}

Then, the profile is added to wp_usermeta table. The complete svn diff for the latest version of the plug-in is available here.

So, now that I can have FOAF profiles for users, I’ll be able to experiment the FOAF-avatar idea I had a long time ago. Other steps would be to combine people URIs with Morten Frederiksen’s FOAF output plugin (cannot find how to make it work with WP2.3) , using owl:sameAs to link users’ URIs created from this weblog to their profiles URI, and also to use it in the SIOC output plugin.

Regarding social networking Dan is talking about, I think that would be a great way answer questions as: do people commenting this blog already know themself in the SemWeb world ? Are they friends re. their FOAF profile ? re. Facebook ? Do they share interests ?

So, If you have FOAF and OpenID connected thanks to auto-discovery, I’ll be happy you try it so that I can start experimenting some of these ideas.

Update: The script now also retrieve SIOC profile if available.

AllegroGraph v2.2

While answering a comment on my latest post about some SW tools I’m - almost daily - using, I saw that a new release of AllegroGraph has just been set.

Actually, I tried it last week while looking for triple stores that support the following requirements:

Even if it was relatively fast, I had to remove it from my shortlist as the needed inference capabilities were supported only with its own query language.

But … according to its changelog regarding this new release:

Get-triples and SPARQL now both work with AllegroGraph’s RDFS++ reasoner

Wow ! Plus other cool features as freetext indexing and SPARQL over HTTP support… let’s try it again !

Quelques outils pour découvrir le Web Sémantique

Suite à différents billets francophones sur le Web Sémantique (dont un revenant), voici une petite liste d’outils et services que j’utilise régulièrement pour manipuler ce genre de données. Si vous voulez vous mettre à RDF, RDFS et/ou OWL, vous trouverez sans doute de quoi vous amuser un peu.

Si vous avez besoin d’un vocabulaire précis pour gérer vos données, et avant de vous lancer dans une phase plus ou moins longue de modélisation, assurez vous que vos besoins ne sont pas couverts par une ontologie déjà existante. Swoogle et SchemaWeb permettent ainsi de trouver un vocabulaire en fonction des classes que vous souhaitez utiliser. Par exemple, une recherche sur “Person” vous amènera logiquement - entre autres - vers FOAF. Vous pouvez également consulter la liste des 100 espaces de nom RDF les plus utilisés sur le Web, et les recommendations du projet Linking Open Data sur les vocabulaires “de référence“.

Si rien ne vous convient, à vous de créer votre ontologie. Protégé est l’outil de référence dans le domaine. De nombreux plug-ins, un support des différents niveaux de OWL …, le tout en open-source. Il ne supporte cependant que la sérialisation XML des données RDF. Par contre, Protégé permet de partir d’une ontologie existante lors de la création d’un nouveau modèle, et d’utiliser ainsi les notions de sous-classes (rdfs:subClassOf) et de sous-propriétés (rdfs:subPropertyOf) entre ontologies (comme peut le faire SIOC avec FOAF via sioc:User), ce qui vous permettra par la suite de bénéficier des possibilités d’inférence de certains moteurs SPARQL. De façon générale, c’est une bonne pratique que d’affiner des vocabulaires existants (en terme de classes ou de propriétés) plutôt que de repartir de zéro, dans une perspective d’interconnection des données.

Une fois l’ontologie en place, vous pouvez à nouveau utiliser Protégé pour créer les instances correspondantes, ou passer simplement par un éditeur de texte. Cependant, Protégé vous permettra de réduire les erreurs, et vous pouvez même l’associer à un raisonneur pour éviter les incohérences (par exemple, éviter créer une instance qui ne respecte pas certaines contraintes que vous avez définies une ontologie OWL).

Dans le cas d’une édition manuelle, et pour un fichier serialisé en XML, vous pouvez utiliser le validateur du W3. Attention, celui-ci ne vérifiera pas que les données sont conformes aux ontologies utilisées, mais juste que le fichier est bien formé, avec en prime une représentation graphique.

Une fois vos différents fichiers RDF en main, comment les manipuler et les interroger ? Ici ma préférence va à Redland, ses différents outils en ligne de commande, et ses bindings Python. La manipulation des triplets et l’interrogation via SPARQL est également très simple. Puisqu’on parle de SPARQL, c’est le langage inévitable pour interroger des données RDF, mais aussi les reformater en utilisant CONSTRUCT.

Du côté de PHP, les librairies RAP et ARC proposent aussi la manipulation et l’interrogation de données RDF. Dans les deux cas, l’implémentation d’un entrepôt RDF en ligne se fait rapidement, et RAP a la bonne idée de proposer un moteur d’inférence. Pour un entrepôt de données plus puissant, j’utilise régulièrement 3store, qui supporte aussi certaines règles RDFS, avec l’avantage que celles-ci sont automatiquement déduites des ontologies importées dans l’entrepôt. Il est assez rapide mais nécessite une phase de compilation et donc un serveur sur lequel vous avez la main. Virtuoso est aussi prometteur, mais je n’ai pas encore eu l’occasion de faire des comparaisons avec 3store.

Enfin, si vous voulez simplement visualiser des données RDF sans passer par un entrepôt de donnés, vous pouvez utiliser Exhibit, dont la version 2.0 vient tout juste de sortir en bêta, et jeter un oeil par la même occasion aux différents outils du projet SIMILE.

Pour finir, et pour un inventaire plus complet d’outils dédiés au Web Sémantique, vous pouvez consulter cette liste de plus de 500 outils, dont l’interface utilise d’ailleurs Exhibit.