utilisation d’un vocabulaire RDF – le cas de FOAF

Je commence une série de tutoriels axés web sémantique. Dans le cadre de mes travaux je dois utiliser des vocabulaires RDF-OWL pour représenter des données et les échanger entre des applications.

Du coup, je me suis dit en voyant le peu de tutoriels en français sur le web que ça vaudrait le coup d’en faire un moi-même.

Ce premier tutoriel concerne l’utilisation d’un vocabulaire existant. En particulier le vocabulaire FOAF qui permet de décrire des personnes et le réseau de connaissances de ces personnes.

Nous allons dans ce premier tutoriel utiliser une syntaxe RDF/XML. Ce n’est pas la seule solution possible mais c’est celle qui m’a semblé “la plus propre”, la plus simple à lire par un humain. Je reviendrai peut-être dans d’autres tutoriels sur d’autres syntaxes.

Le mieux étant de s’appuyer sur l’usage, je vais m’appuyer sur la construction du RDF FOAF permettant de me décrire.

Début du document

Un document RDF/XML est avant tout un document XML. Donc vous pouvez déclarer la version d’xml utilisée et l’encodage :

<?xml version =”1.0″ encoding =”utf-8″?>

Vous pouvez aussi lui associer un style.

Ensuite, vous allez devoir dans votre RDF faire référence aux vocabulaires existants que vous utilisez. Par exemple, FOAF est défini à l’url http://xmlns.com/foaf/0.1/

A chaque fois que vous allez utiliser une classe de FOAF, vous allez devoir taper http://xmlns.com/foaf/0.1/:ClasseAUtiliser

Mais heureusement vous pouvez déclarer au début de votre RDF que vous allez utiliser ce vocabulaire et lui associer un alias. Cette déclaration peut se faire dans la balise <rdf:RDF> signalant le début de votre document RDF. Mais notez que vous pouvez déclarer un alias pour un vocabulaire dans n’importe quel noeud. L’alias n’étant alors valable que pour les noeuds fils.

Exemple pour FOAF en début de document :

<rdf:RDF xmlns:foaf=”http://xmlns.com/foaf/0.1/”>

On a associé l’alias foaf au vocabulaire défini à l’url http://xmlns.com/foaf/0.1/

On aura aussi besoin de quelques éléments du vocabulaire RDF de base donc le début de document devient :

<rdf:RDF xmlns:rdf=”http://www.w3.org/1999/02/22-rdf-syntax-ns#” xmlns:rdfs=”http://www.w3.org/2000/01/rdf-schema#” xmlns:foaf=”http://xmlns.com/foaf/0.1/”>

Nous ajouterons d’autres vocabulaires par la suite dans ce tutoriel. Mais je ne reviendrai pas sur la déclaration des alias.

Principes de RDF

Avant de nous intéresser au corps du document, nous allons faire un petit rappel sur le principe de base de RDF.

RDF permet d’écrire des triplets Sujet Prédicat Objet.

Un sujet, un prédicat et un objet sont des ressources identifiées par des URI. Une URI étant censée être unique pour une ressource. Par exemple, une URL est une URI.

Afin de permettre de réifier un triplet en concept, il est possible d’associer une URI à un triplet. Ces triplets réifiés sont appelés des Statement.

Les Objets et Sujets sont des instances de classes RDF. Les prédicats sont des propriétés RDF. Dans les spécifications, pour chaque propriété est précisé son Domaine (le type ou la classe du Sujet) et son Range (le type ou la classe de l’Objet).

Corps du document

Nous allons dans ce document décrire ma personne Natoine. Nous allons utiliser la classe foaf:Person. Le début de la déclaration :

<foaf:Person rdf:about=”http://www.natoine.fr/#me”>

  • foaf:Person, je fais une instance de Person.
  • rdf:about=”http://www.natoine.fr/#me” , je précise l’URI de la ressource. En l’occurence j’utilise une URL existante, la page d’accueil de mon domaine à laquelle je concaténe #me. Il existe d’autres façons de faire référence à une ressource. Par exemple, au lieu de rdf:about on peut utiliser rdf:ID. Dans ce cas, la valeur prise est concaténée à l’URL du document pour constituer l’URI ou bien concaténée à une URI précisée par xml:base. Par exemple :

<rdf:RDF xmlns:foaf=”http://xmlns.com/foaf/0.1/” xml:base=”http://www.natoine.fr”>

<foaf:Person rdf:ID=”me”>

</foaf:Person>

</rdf:RDF>

On parle toujours de la personne identifiée par l’URI http://www.natoine.fr/#me. rdf:ID ajoute un #. Notez aussi que rdf:about=”#me” serait totalement équivalent. Si rdf:about ne précise pas une URI compléte, celle-ci est construite par concaténation.

Foaf Basics

Maintenant que peut-on dire sur ma personne?  FOAF définit un ensemble de propriétés. Je ne vais pas toutes les détailler. Il suffit d’aller regarder les spécifications de FOAF.

Mais pour l’exemple je vais préciser mon nom, prénom, surnom,… En gros les Basics de FOAF. Que du très simple pour l’instant. On utilise des Strings ou des références à des ressources web.

<foaf:Person rdf:about=”http://www.natoine.fr/#me”>

<!– FOAF Basics –>

<foaf:name xml:lang=”fr”>Antoine Seilles</foaf:name>

<foaf:nick>Natoine</foaf:nick>

<foaf:surname>Natoine</foaf:surname>

<foaf:familyName>Seilles</foaf:familyName>

<foaf:firstName>Antoine</foaf:firstName>

<foaf:title>phD Student</foaf:title>

<foaf:homepage rdf:resource=”http://www.natoine.fr/”/>

<foaf:img rdf:resource=”/natoine.ico”/>

<foaf:depiction rdf:resource=”/natoine.ico”/>

<foaf:depiction rdf:resource=”http://www.imagilab.fr/wp-content/gallery/RiviereTournage/01.JPG”/>

<foaf:depiction rdf:resource=”http://www.imagilab.fr/wp-content/gallery/RiviereTournage/02.JPG”/>

<foaf:depiction rdf:resource=”http://www.imagilab.fr/wp-content/gallery/RiviereTournage/07.JPG”/>

<foaf:depiction rdf:resource=”http://www.imagilab.fr/wp-content/gallery/RiviereTournage/08.JPG”/>

<foaf:depiction rdf:resource=”http://www.imagilab.fr/wp-content/gallery/RiviereTournage/13.JPG”/>

<foaf:depiction rdf:resource=”http://www.imagilab.fr/wp-content/gallery/RiviereTournage/18.JPG”/>

<foaf:depiction rdf:resource=”http://www.imagilab.fr/wp-content/gallery/RiviereTournage/19.JPG”/>

<foaf:depiction rdf:resource=”http://www.imagilab.fr/wp-content/gallery/RiviereTournage/20.JPG”/>

</foaf:Person>

Notez l’utilisation de rdf:resource pour faire référence à des ressources existantes. Il est possible de faire des références absolues, ou relatives (celles-ci obéissent aux mêmes règles que rdf:ID).

Pour des ressources présentes sur internet, vous pouvez vous contenter de préciser l’URL. Mais je vous encourage à en dire un peu plus quand c’est possible. Par exemple pour des images, il est possible d’utiliser la classe foaf:Image. Je détaille l’utilisation de foaf:Image un peu plus loin dans ce tutoriel.

Foaf Personal Info

Attaquons-nous maintenant aux informations personnelles (Personal Info), tout en restant sur des ressources internet ou des String.

Voilà ce que je rajoute comme infos me concernant :

<!– FOAF Personal Info –>

<foaf:weblog rdf:resource=”/wordpress”/>

<foaf:currentProject rdf:resource=”http://www.imagilab.fr”/>

<foaf:currentProject rdf:resource=”http://www.blackpad.fr”/>

<foaf:currentProject rdf:resource=”http://intermed.csregistry.org/tiki-index.php”/>

<foaf:workplaceHomepage rdf:resource=”http://www.lirmm.fr/”/>

<foaf:workInfoHomepage rdf:resource=”http://www.lirmm.fr/”/>

<foaf:schoolHomepage rdf:resource=”http://lycee-pompidou-34.org/”/>

<foaf:schoolHomepage rdf:resource=”http://www.univ-montp2.fr/”/>

<foaf:publications rdf:resource=”/publications”/>

Venons-en maintenant aux centres d’intèrets. L’un de mes centres d’interêt est l’Intelligence Artificielle. Dans les spécifications de FOAF, il est dit que la propriété interst a pour range un foaf:Document.

Une syntaxe minimale pour dire que je suis intéressé par l’intelligence artificielle serait :

<foaf:interest rdf:resource=”http://fr.wikipedia.org/wiki/Intelligence_artificielle”/>

Mais on peut faire mieux grâce à la classe foaf:Document :

<foaf:interest>

<foaf:Document rdf:about=”http://fr.wikipedia.org/wiki/Intelligence_artificielle”/>

</foaf:interest>

Cependant on peut avoir envie d’en dire un peu plus au sujet de ce centre d’intérêt que de faire référence à une page wikipedia. Pour l’exemple, on va dire que la page en question a pour titre Intelligence Artificielle, qu’elle est la page française de wikipedia au sujet de l’intelligence artificielle.

On va utiliser les propriétés title et description du vocabulaire Dublin Core et la propriété foaf:topic de FOAF.

Il faut ajouter l’alias à dublin core : xmlns:dc=”http://purl.org/dc/elements/1.1/”

et notre foaf interest devient :

<foaf:interest>

<foaf:Document rdf:about=”http://fr.wikipedia.org/wiki/Intelligence_artificielle”>

<dc:title>Intelligence Artificielle</dc:title>

<dc:description>French Artificial Intelligence page on wikipedia</dc:description>

<foaf:topic>Artificial Intelligence</foaf:topic>

</foaf:Document>

</foaf:interest>

De la même façon on peut donner plus d’information sur les foaf:Image utilisées comme foaf:depiction. Par exemple, j’ai enrichi les infos concernant mes photos de la façon suivante :

<foaf:depiction>

<foaf:Image rdf:about=”http://www.imagilab.fr/wp-content/gallery/RiviereTournage/01.JPG”>

<dc:title>Antoine et Erik</dc:title>

<dc:description>Picture of Natoine and Erik during “La riviere” shooting</dc:description>

<dc:format>image/jpg</dc:format>

<foaf:maker rdf:resource=”http://www.vincentrok.com/”/>

</foaf:Image>

</foaf:depiction>

J’utilise à la fois le vocabulaire Dublin Core et le vocabulaire FOAF. La propriété foaf:maker est équivalente à la propriété Dublin Core dc:creator. Elle permet de préciser qui est l’auteur d’une ressource. En l’occurence, les photos sont prises par Vincent Rok.

foaf:maker est censé être une foaf:Person. Donc comme toujours, je peux me contenter d’une URL ou je peux créer une foaf:Person. Ce qui donne à minima:

<foaf:maker>

<foaf:Person rdf:about=”http://www.vincentrok.com/”/>

</foaf:maker>

Cependant, il se trouve que je connais Vincent Rok et donc je déclarerai Vincent Rok comme une personne quand je déclarerai mes connaissances. Du coup je peux me contenter de la ligne <foaf:maker rdf:resource=”http://www.vincentrok.com”/> .

Lien à DBPedia

Bien sûr on pourrait faire encore mieux. Surtout qu’un topic foaf est “A thing” (la super classe) pour RDF. Du coup on pourrait faire de topic n’importe quoi d’autre, comme un tag par exemple, ou une discipline. Mais il faudrait s’appuyer sur un autre vocabulaire. Gardez en tête que une URL est souvent la meilleure information à donner. Surtout si par cette URL on peut à nouveau récupérer du RDF. Pensez à DBPedia par exemple. Au lieu de décrire dans mon profil ce qu’est mon centre d’intérêt en utilisant le vocabulaire de Dublin Core, je pourrai mettre une url à laquelle on trouvera une description de ce centre d’intérêt.

Un autre de mes centres d’intérêt est la Réalité virtuelle. Il existe une page Wikipedia française et un équivalent anglais. Je pourrai faire un simple lien vers l’une de ces deux URL ou, un peu mieux, mettre l’une de ces URL comme Document avec un petit peu d’informations supplémentaires. Sauf qu’il y a encore mieux: DBpedia permet pour chaque page de Wikipedia version anglaise de récupérer un RDF décrivant cette ressource.

L’URL Wikipedia de la réalité virtuelle en anglais est : http://en.wikipedia.org/wiki/Virtual_reality

Du coup, il existe une page DBpedia : http://dbpedia.org/page/Virtual_reality

Et pour récupérer le RDF/xml l’url est : http://dbpedia.org/data/Virtual_reality.rdf

Ce qui donne dans mon RDF :

<foaf:interest rdf:resource=”http://dbpedia.org/data/Virtual_reality.rdf”/>

Si vous allez regarder le contenu de ce RDF, vous verrez qu’il y a des infos super pratique comme l’utilisation de owl:sameAs qui permet de dire que cette ressource est la même que d’autres ressources, et puis surtout l’utilisation de foaf:page et foaf:depiction. Donc DBpedia réutilise des vocabulaires existant comme le vocabulaire FOAF.

Déclarez vos connaissances

Ensuite, viennent les “connaissances”, ces personnes que je connais. FOAF ne permet que de déclarer des connaissances grâce à la propriété knows.

Je vais déclarer que je connais Vincent Rok le photographe et Julien Cotret mon collègue de bureau.

<foaf:knows>

<foaf:Person rdf:about=”http://www.vincentrok.com/”>

<foaf:nick>Vincent Rok</foaf:nick>

<foaf:homepage rdf:resource=”http://www.vincentrok.com/”/>

<foaf:gender>male</foaf:gender>

<foaf:currentProject rdf:resource=”http://www.imagilab.fr”/>

</foaf:Person>

</foaf:knows>

<foaf:knows>

<foaf:Person rdf:about=”http://www.natoine.fr/#Julien_Cotret”>

<foaf:name xml:lang=”fr”>Julien Cotret</foaf:name>

<foaf:familyName>Cotret</foaf:familyName>

<foaf:firstName>Julien</foaf:firstName>

<foaf:title>phD Student</foaf:title>

<foaf:gender>male</foaf:gender>

<foaf:currentProject rdf:resource=”http://intermed.csregistry.org/tiki-index.php”/>

</foaf:Person>

</foaf:knows>

Mais je ne connais pas Julien de la même façon que je connais Vincent. Et Foaf ne me permet pas d’en dire plus sur ces relations. Cependant, il est possible d’étendre FOAF (comme tout autre vocabulaire) et de définir des relations plus spécifiques.

Enrichissement d’un vocabulaire

Par exemple nous allons définir une relation de collégue de travail.

Cette tâche demande que l’on crée un rdf de description du vocabulaire enrichi puis qu’on ajoute un alias à ce vocabulaire.

Appelons notre nouveau vocabulaire totoFoaf.

<rdf:RDF

xmlns:rdf=”http://www.w3.org/1999/02/22-rdf-syntax-ns#”

xmlns:rdfs=”http://www.w3.org/2000/01/rdf-schema#”

xmlns:foaf=”http://xmlns.com/foaf/0.1/”

xmlns:dc=”http://purl.org/dc/elements/1.1/”

xml:base=”http://www.natoine.fr/totoFoaf.rdf”>

<rdf:Description rdf:about=””>

<dc:author rdf:resource=””/>

<dc:title>Sample Relationships Schema</dc:title>

<dc:description>Schema for Defining Relationships in FOAF</dc:description>

</rdf:Description>

<!–property–>

<rdf:Description rdf:about=”http://www.natoine.fr/totoFoaf.rdf/Colleague”>

<rdf:type rdf:resource=”http://www.w3.org/1999/02/22-rdf-syntax-ns#Property”/>

<rdfs:subPropertyOf rdf:resource=”http://xmlns.com/foaf/0.1/knows”/>

<rdfs:label>Colleague</rdfs:label>

</rdf:Description>

</rdf:RDF>

Du coup en modifiant mon rdf on peut dire que Julien Cotret est un collégue de travail.

<totoFoaf:colleague>

<foaf:Person rdf:about=”http://www.natoine.fr/#Julien_Cotret”>

<foaf:name xml:lang=”fr”>Julien Cotret</foaf:name>

<foaf:familyName>Cotret</foaf:familyName>

<foaf:firstName>Julien</foaf:firstName>

<foaf:title>phD Student</foaf:title>

<foaf:gender>male</foaf:gender>

<foaf:currentProject rdf:resource=”http://intermed.csregistry.org/tiki-index.php”/>

</foaf:Person>

</totoFoaf:colleague>

Mes comptes sur le web

Il reste un dernier point. L’une des problèmatiques du web actuel avec la prolifération des applications de social networking est l’identité fragmentée des utilisateurs. Etant utilisateur de Facebook, de twitter, d’un blog, de plusieurs forums, je me retrouve avec autant de comptes utilisateurs différent que d’applications web que j’utilise. Du coup, j’ai envie de dire que tout ces comptes me sont associés. Il est possible de le faire grâce à la propriété foaf:account.

Par exemple je déclare mon compte twitter :

<foaf:account>

<foaf:OnlineAccount>

<foaf:accountServiceHomepage rdf:resource=”http://www.twitter.com”/>

<foaf:accountName>natoine</foaf:accountName>

</foaf:OnlineAccount>

</foaf:account>

Pour conclure ce turoriel, vous trouverez mon FOAF complet en ligne. Vous pouvez l’explorer avec FOAF explorer qui permet d’explorer de proches en proches le réseau. Et essentiel pour tester votre RDF/XML, il existe un validateur w3C.

One thought on “utilisation d’un vocabulaire RDF – le cas de FOAF”

Leave a Reply

Your email address will not be published. Required fields are marked *