Apprendre RDF par l'exemple avec FOAF

Julien Plu

Les principes de RDF sont assez difficiles à comprendre et le meilleur moyen de les découvrir est encore de l'utiliser pour diverses applications. Dans cet article, je vais vous montrer comment faire votre CV en version RDF ainsi qu'en version RDFa. Commentez ici cet article Commentez .

- Titre : Apprendre RDF par l'exemple avec FOAF

- Auteur : Julien Plu

- Parution : 28 mai 2011

- Mise à jour : 6 janvier 2016

- Public visé :

- Licence : Copyright ® 2011-2016 Julien Plu. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Le principe de RDF

- II. Qu'est-ce que FOAF ?

- III. Création du fichier FOAF

- IV. Version en RDFa

- V. Remerciements

I - Le principe de RDF

RDF (Ressource Description Framework) offre des outils pour décrire des données, qui peuvent être de n'importe quel type, à partir du moment où le sujet est une URI. RDF est basé sur un principe de triplets <sujet><prédicat><objet>. Prenons un exemple pour illustrer ce format. Notre sujet est https://www.developpez.com et nous allons émettre un certain nombre de <predicat> afin de le représenter. Voici une petite liste de prédicats :

- titre ;

- description ;

- langue.

Et respectivement les objets de ces prédicats :

- Developpez.com ;

- le club Developpez.com est la plus grande communauté internationale des professionnels en informatique de langue française (France, Belgique, Luxembourg, Suisse, Canada, Afrique et Asie francophone, etc.) ;

- français.

Typiquement, ce que je viens de faire, c'est une description du site de developpez.com. Il existe un vocabulaire RDF pour décrire toutes les ressources numériques (site Web, documents, etc.), ce vocabulaire est Dublin Core, c'est une norme de métadonnées que l'on peut aussi inclure dans du XHTML, comme vous pouvez le voir dans ce tutoriel sur le RDFa.

RDF, contrairement à XML, est représenté par un graphe, même si la syntaxe est semblable à ce qui représente clairement les liaisons entre les données. Actuellement, le vocabulaire le plus connu et le plus utilisé est FOAF (Friend of a Friend). Je vais d'ailleurs vous montrer comment créer un fichier RDF en utilisant ce vocabulaire.

II - Qu'est-ce que FOAF ?

FOAF est un vocabulaire RDF qui permet de décrire de manière structurée une personne et ses relations. Ainsi, ces informations ont l'avantage de pouvoir être traitées de manière informatique, car c'est écrit en RDF. Un fichier FOAF peut contenir diverses informations comme :

- état civil ;

- surnom ;

- adresse ;

- numéro de téléphone ;

- profession.

Voici un schéma représentatif du vocabulaire FOAF :

On peut voir que FOAF se situe à la croisée du Web sémantique et du réseau social. Grâce aux métadonnées, il est possible d'associer à un document Web le profil FOAF de son auteur et ainsi d'en enrichir le sens. Les moteurs de recherche, dont un des défis majeurs actuellement est d'améliorer la pertinence des résultats qu'ils fournissent, pourraient tirer parti de ces informations.

III - Création du fichier FOAF

Je vais ici décrire mon fichier RDF. Il vous suffira de remplacer mes informations par les vôtres. Tout d'abord, comme je l'ai déjà dit, RDF dérive du XML, aussi la première ligne d'un fichier RDF coule de source :

<?xml version="1.0" encoding="UTF-8"?>

Prochaine étape, définir l'élément racine, le document RDF lui-même. C'est dans cet élément racine que nous définissons toutes les ontologies (vocabulaires) que nous allons utiliser dans notre fichier RDF, en indiquant un espace de noms, afin de ne pas trop encombrer notre fichier RDF avec de la syntaxe inutile.

<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:bio="http://purl.org/vocab/bio/0.1/"
xmlns:dc="http://purl.org/dc/terms/"
xmlns:lang="http://purl.org/net/inkel/rdf/schemas/lang/1.1#"
xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
xmlns:doac="http://ramonantonio.net/doac/0.1/"
xmlns:menow="http://schema.peoplesdns.com/menow/"
xmlns:sioc="http://rdfs.org/sioc/ns#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:admin="http://webns.net/mvcb/"
xmlns:rel="http://purl.org/vocab/relationship/">

Il faut savoir une chose aussi sur l'importation des ontologies : même si certaines ontologies importées ne sont pas utilisées, il faut quand même les importer, car elles sont utilisées par des ontologies que l'on utilise. Il y a donc un système récursif.

On va maintenant décrire un élément foaf:Person en décrivant l'URI de notre sujet. Si l'URI n'est pas spécifiée, c'est l'URL du document RDF courant qui lui sera attribuée.

<foaf:Person rdf:ID="http://www.pipm.fr/foaf/foaf.rdf">
</foaf:Person>

On va maintenant remplir cet élément. Avant de continuer, il faut préciser une chose : il existe une norme de notation pour les ontologies. Si un élément de cette ontologie commence par une majuscule, c'est une classe ; si c'est une minuscule, c'est une propriété. Maintenant, remplissons cet élément :

<foaf:name>Julien Plu</foaf:name>
<foaf:title>M.</foaf:title>

<foaf:givenname>Julien</foaf:givenname>
<foaf:family_name>Plu</foaf:family_name>
<foaf:nick>SnaKe</foaf:nick>
<foaf:mbox_sha1sum>d14930bd11472c1b9d3b5604aa7c3d231a69a030</foaf:mbox_sha1sum>
<foaf:dateOfBirth>1987-06-19</foaf:dateOfBirth>
<foaf:homepage rdf:resource="http://jplu.developpez.com/" dc:title="Page personnelle"/>

<foaf:weblog rdf:resource="http://blog.developpez.com/jplu/"/>
<foaf:img rdf:resource="http://www.pipm.fr/foaf/moi.jpg"/>
<foaf:schoolHomepage rdf:resource="http://www.univ-montp2.fr/"/>
<foaf:gender>male</foaf:gender>

Ainsi, avec toutes ces informations, on peut connaître mon site personnel, ma date de naissance, une photo, mon nom, mon surnom, etc. Mon adresse email, elle, est hachée par l'algorithme SHA-1. Mais comment interpréter ces informations sous forme de triplets, comme dit au début de l'article ? Eh bien, c'est simple, voyons ça avec mon nom et mon site personnel. D'abord avec mon nom :

- sujet : http://www.pipm.fr/foaf/foaf.rdf ;

- prédicat : foaf:name ;

- objet : Julien Plu.

Et maintenant mon site personnel :

- sujet : http://www.pipm.fr/foaf/foaf.rdf ;

- prédicat : foaf:homepage ;

- objet : http://jplu.developpez.com.

Mais, dans ce dernier, il y a deux informations, on y trouve aussi le titre de mon site personnel, mais sous quelle forme ?

- sujet : http://www.pipm.fr/foaf/foaf.rdf ;

- prédicat : dc:title ;

- objet : page personnelle.

Ainsi vous pouvez voir que l'on peut définir des données dans des données. Maintenant, voyons les centres d'intérêt :

<foaf:interest rdf:resource="http://dbpedia.org/page/Scuba_diving"/>
<foaf:interest rdf:resource="http://dbpedia.org/page/Semantic_Web"/>
<foaf:interest rdf:resource="http://dbpedia.org/page/Artificial_intelligence"/>
<foaf:interest rdf:resource="http://dbpedia.org/page/Tennis"/>
<foaf:interest rdf:resource="http://dbpedia.org/page/Association_football"/>
<foaf:interest rdf:resource="http://dbpedia.org/resource/Linked_Data"/>
<foaf:interest rdf:resource="http://dbpedia.org/page/Video_game"/>

Mes coordonnées géographiques :

<foaf:based_near>
<geo:Point>
<geo:lat>43.402</geo:lat>
<geo:long>3.697</geo:long>
</geo:Point>
</foaf:based_near>

Mes expériences professionnelles :

<doac:experience>
<doac:Experience>
<doac:title>Intership in software development</doac:title>
<doac:location>Dialonics</doac:location>
<doac:date-starts>2010-07-01</doac:date-starts>
<doac:date-ends>2010-08-31</doac:date-ends>
<doac:activity>
Look for computer vision algorithms and implement them in C++ in an existing application.
Specifically, from a public entertainment robot (Meccano Spykee) which with the Dialonics
technology allows dialogue in natural language, I used the onboard camera to add features
to detect and track objects and colors.
</doac:activity>
</doac:Experience>
</doac:experience>
<doac:experience>
<doac:Experience>
<doac:title>Intership in application testing</doac:title>
<doac:location>Orange Labs</doac:location>
<doac:date-starts>2005-02-09</doac:date-starts>
<doac:date-ends>2005-02-18</doac:date-ends>
<doac:activity>Testing a search engine.</doac:activity>
</doac:Experience>
</doac:experience>

Mon parcours scolaire :

<doac:education>
<doac:Education>
<foaf:organization>University of Montpellier</foaf:organization>
<doac:title>Master in Artificial intelligence</doac:title>
<doac:date-starts>2010-09-01</doac:date-starts>
</doac:Education>
</doac:education>
<doac:education>
<doac:Education>
<foaf:organization>University of Montpellier</foaf:organization>
<doac:title>Licence in Computer sciences with congratulations</doac:title>
<doac:date-starts>2007-09-01</doac:date-starts>
<doac:date-ends>2010-06-30</doac:date-ends>
</doac:Education>
</doac:education>

Mes comptes sur divers sites :

<foaf:holdsAccount>
<foaf:OnlineAccount rdf:about="https://www.facebook.com/Plu.Julien">
<foaf:accountServiceHomepage rdf:resource="https://www.facebook.com/"/>
<foaf:accountName>Plu.Julien</foaf:accountName>
<foaf:name>Facebook</foaf:name>
<foaf:thumbnail rdf:resource="http://www.lequotidien.lu/themes/TheSite-newlayout/img/facebook_favicon.GIF"/>
</foaf:OnlineAccount>
</foaf:holdsAccount>

<foaf:holdsAccount>
<foaf:OnlineAccount rdf:about="https://twitter.com/#!/julienplu">
<foaf:accountServiceHomepage rdf:resource="http://www.twitter.com/"/>
<foaf:accountName>julienplu</foaf:accountName>
<foaf:name>Twitter</foaf:name>
<foaf:thumbnail rdf:resource="http://a1.twimg.com/a/1283191627/images/favicon.ico"/>
</foaf:OnlineAccount>
</foaf:holdsAccount>

<foaf:holdsAccount>
<foaf:OnlineAccount rdf:about="http://www.linkedin.com/pub/julien-plu/29/6b/703">
<foaf:accountServiceHomepage rdf:resource="http://www.linkedin.com/"/>
<foaf:accountName>julien-plu</foaf:accountName>
<foaf:name>LinkedIn</foaf:name>
<foaf:thumbnail rdf:resource="http://www.llworldtour.com/wp-content/uploads/2010/04/linkedin-favicon.png"/>
</foaf:OnlineAccount>
</foaf:holdsAccount>

<foaf:holdsAccount>
<foaf:OnlineAccount rdf:about="http://www.youtube.com/user/snake264">
<foaf:accountServiceHomepage rdf:resource="http://www.youtube.com/"/>
<foaf:accountName>snake264</foaf:accountName>
<foaf:name>Youtube</foaf:name>
<foaf:thumbnail rdf:resource="http://products.lowepro.com/App_Themes/default/images/youtube_favicon.jpg"/>
</foaf:OnlineAccount>
</foaf:holdsAccount>

<foaf:holdsAccount>
<foaf:OnlineAccount rdf:about="http://www.dailymotion.com/snake264">
<foaf:accountServiceHomepage rdf:resource="http://www.dailymotion.com/"/>
<foaf:accountName>snake264</foaf:accountName>
<foaf:name>Daily Motion</foaf:name>
<foaf:thumbnail rdf:resource="http://www.captainaruto.com/images/social/dailymotion.png"/>
</foaf:OnlineAccount>
</foaf:holdsAccount>

<foaf:holdsAccount>
<foaf:OnlineAccount rdf:about="http://www.developpez.net/forums/u125580/snake264">
<foaf:accountServiceHomepage rdf:resource="http://www.developpez.com/"/>
<foaf:accountName>snake264</foaf:accountName>
<foaf:name>Developpez.com</foaf:name>
<foaf:thumbnail rdf:resource="http://website.informer.com/favicons/6b/a5/8d3c98d6b0ec7a01405c99f8f84775d24944.ico?domain=developpez.com"/>
</foaf:OnlineAccount>
</foaf:holdsAccount>

Mes contacts :

<foaf:knows>
<foaf:Person rdf:about="http://www.scharffe.fr/foaf.rdf">
<foaf:name>Francois Scharffe</foaf:name>
<foaf:depiction rdf:resource="http://www.scharffe.fr/pics/profil.png" dc:title="Au bureau"/>
</foaf:Person>
</foaf:knows>

Petite précision pour ce bout de code : si vous voulez ajouter un contact, il faut absolument qu'il ait un fichier FOAF en RDF. Sinon, cela ne servira à rien d'indiquer un contact.

Voilà, on a pu voir une partie de ce que peut contenir la balise foaf:Person. On peut y ajouter pas mal d'autres informations, à vous de jouer. Maintenant, pour voir le résultat que cela peut donner : http://www.pipm.fr/foaf/foaf.rdf

D'après mes tests le lien n'affiche une page HTML que si votre navigateur est Firefox ou Opéra. Si vous utilisez un navigateur Chrome ou Internet Explorer vous allez télécharger mon fichier RDF. Pour ce qui concerne les autres navigateurs je n'ai pas testé donc dites-le-moi sur le post de cet article, merci.

Le rendu en HTML est fait par un fichier XSL, prenant en compte les informations contenues dans mon fichier RDF. Pour le fichier XSL, je me suis inspiré de celui que l'on peut trouver sur le site de Gautier Poupeau.

IV - Version en RDFa

Maintenant que nous savons comment créer un fichier RDF, interprétable de manière informatique, il faudrait pouvoir l'afficher dans un navigateur, cela est quand même beaucoup plus pratique à lire pour un humain. Il y a deux solutions pour avoir un tel résultat : soit un script XSL qui analyse le fichier RDF pour en faire un rendu HTML, soit un fichier HTML. C'est le rôle de RDFa. Pour cela, il y a deux articles sur le sujet pour vous apprendre à le faire :

- Web sémantique : introduction au RDFa ;

- Pour aller plus loin avec RDFa.

Vous pouvez en avoir un exemple sur mon site. J'ai retranscrit toutes les informations contenues dans mon fichier RDF en RDFa. Si vous faites du RDFa, vous devez aussi utiliser un site qui vous dira si les informations contenues dans votre page RDFa sont bien formées.

V - Remerciements

Merci à dourouc05 pour son aide à la rédaction de cet article. Ainsi qu'à ClaudeLELOUP et jacques_jean pour leur correction orthographique.