Vous devez activer Javascript pour accéder à ce site
 

Semaine

RECHERCHE

Introduction au RDF

Introduction

Le Resource Description Framework (RDF) est un langage pour les métadonnées sur le web, c'est-à-dire un langage pour énoncer ce que l'on sait sur quelque chose ou quelqu'un. Par exemple, le RDF est idéal pour indiquer qui est l'auteur d'un document ou quel est le titre du document. De plus, le langage RDF est prévu pour être à la fois simple (mais tout est relatif), suffisamment puissant pour « tout » décrire, et facilement utilisable par des logiciels. Dans le deuxième texte que nous proposons, nous verrons quelques applications intéressantes. Pour l'instant, nous ne présentons dans ce texte que les concepts de base.

Notions de base

Le RDF a été normalisé en 1999 (par une recommandation W3C) et est un effort commun de plusieurs experts. Le RDF se veut suffisamment riche pour représenter de façon formelle la connaissance tout en étant simple à utiliser. Une des prémisses du format RDF est que tout peut être énoncé en utilisant des triplets : sujet, verbe et objet. Notez que certains auteurs utiliseront le terme « prédicat » au lieu du terme « verbe ». Par exemple, pour décrire « Jean », nous dirons que « Jean est un garçon » et nous décomposerons ainsi cette affirmation : (Jean)(est)(garçon)]]>, ou l'afficherons dans un tableau :

SujetVerbeObjet
Jeanestgarçon

Nous ne faisons pas de la grammaire, mais bien de la représentation : le verbe n'a pas à être un verbe de la langue française ou anglaise. L'important est que le verbe soit un lien, une relation, entre une première chose (sujet) et une seconde (objet). Par exemple, si nous voulons affirmer que le titre de la page web « http://lemire.me/ » est « Daniel Lemire's blog », nous pouvons le faire à l'aide du tableau suivant :

SujetVerbeObjet
http://lemire.me/titreDaniel Lemire's blog

Ces exemples de représentation ne sont pas encore des exemples de données « RDF », car en RDF, le verbe doit être un « URI ». Le RDF, tout comme le XML, est fait pour être traité par des machines et les machines sont bêtes. Elles ne savent pas ce que signifie le mot « titre » dans le tableau précédent. Est-ce un titre à la Bourse, le titre d'une fonction (comme docteur) ou le titre d'une page? Pour régler ce problème, il faut utiliser des URI (Uniform Resource Identifier), c'est-à-dire des adresses fictives qui identifient une ressource Internet.

Un URI contient un protocole (http, mailto, ftp, etc.), un domaine comme « fichiers.com » et un chemin comme « /mesfichiers/index.html ». Dans ce cours, nous adoptons la norme RFC2396 et nous permettons que les URI comportent le symbole du dièse ( # ), comme « ftp://fichiers.com#maman » : tout ce qui apparaît après ce symbole forme le « fragment ». Notons que les accents ne peuvent pas être utilisés dans un URI; ainsi, « http://école.com » n'est pas un URI valable. Un protocole particulier, « urn », est parfois utilisé dans les URI. Par exemple, pour identifier un livre par son code ISBN, nous pouvons utiliser l'URI « urn:ISBN:0-123-12345-1 ». La casse est significative dans un URI sauf pour le nom du protocole (HTTP ou http) et le nom du domaine (xerox.com ou XEROX.COM).

Toutes les URL (Uniform Resource Locator) utilisées sur le web, comme « http://www.google.com », « mailto:bill@microsoft.com », « ftp://fichiers.com », ainsi que d'autres adresses ayant la même syntaxe, mais qui ne pointent pas nécessairement vers une ressource Internet existante, sont des exemples d'URI. Ainsi, si l'on vous donne l'URI « http://www.mydomain.com/daniel », il n'est pas certain qu'une page web se trouve à cette adresse. Le seul but des URI est d'identifier des ressources. Le mot « ressource » a un sens très, très large : tout peut être considéré comme une ressource. Par exemple, pour identifier l'humoriste « Daniel Lemire », nous pouvons adopter l'URI « http://www.daniellemire.com/luimeme »; ce sera un bon choix si l'humoriste en question est propriétaire du nom de domaine (daniellemire.com) et compte le garder longtemps. Par ailleurs, on pourra utiliser l'URI « http://lemire.me/fr/ » pour identifier le professeur « Daniel Lemire » qui est responsable d'un cours portant sur le XML. Dans ce dernier exemple, l'URI est aussi un URL qui pointe vers la page personnelle du professeur. Nous voyons immédiatement l'avantage des URI : alors que l'ordinateur ne saura pas toujours faire la différence entre « Daniel Lemire » l'humoriste et « Daniel Lemire » le professeur, nous pourrons, en utilisant des URI, analyser automatiquement l'information, à la condition que tous utilisent le même URI pour représenter la même ressource. Pour distinguer les individus, nous pourrions utiliser leur numéro d'assurance sociale... Mais comme le concept de ressource est général, il faut aussi pouvoir distinguer les différentes significations que peuvent prendre le mot « titre », et ainsi de suite. La langue française (ou anglaise) permet à un mot d'avoir plusieurs sens, alors que chaque URI représente un concept et un concept seulement.

L'URI n'a pas en soit un sens particulier. C'est un nom. Ainsi « http://google.com/2000/jacques/ » peut ne rien à voir avec l'an 2000 ou une personne appelée Jacques... tout comme un homme appelé Pierre n'a pas à travailler sur des pierres ou qu'une personne appelée Meunier n'a pas à être meunier.

Supposons maintenant que nous voulions décrire l'affirmation suivante en RDF : « Il y a une personne appelée Daniel Lemire dont l'adresse de courriel est lemire@gmail.com et qui est professeur. » Cette phrase peut être très difficile à analyser par un ordinateur. Commençons par la décomposer en affirmations simples : sujet/verbe/objet. D'abord, pour qu'il n'y ait pas de confusion, nous allons identifier l'individu s'appelant Daniel Lemire par l'URI « http://lemire.me/fr/ ».

  • http://lemire.me/fr/ est une personne.
  • http://lemire.me/fr/ s'appelle Daniel Lemire.
  • http://lemire.me/fr/ peut être joint par courriel à lemire@gmail.com.
  • http://lemire.me/fr/ a le titre de professeur.

Rappelons ici que tous les verbes et tous les sujets doivent être identifiés par des URI. En ce qui nous concerne, il n'y a qu'un seul sujet identifié par « http://lemire.me/fr/ ». Il reste à trouver des URI pour les verbes et certains objets. Prenons d'abord la première affirmation : « http://lemire.me/fr/ est une personne ». Le verbe « être », dans cette phrase, associe la classe « personne » (au même sens que dans la programmation orientée objet) à la ressource « http://lemire.me/fr/ ». Nous pourrions inventer un URI ayant ce sens, mais il en existe déjà un : « http://www.w3.org/1999/02/22-rdf-syntax-ns#type ». Chaque fois que nous rencontrons cet URI, cela signifie qu'une ressource appartient à une certaine classe. Quant à l'objet « personne », il existe au moins un URI pour noter la classe « personne », soit « http://www.w3.org/2000/10/swap/pim/contact#Person ». Nous verrons que dans d'autres contextes, d'autres URI peuvent être utilisés avec un sens similaire.

Finalement, l'affirmation « http://lemire.me/fr/ est une personne » peut s'écrire comme ceci :

SujetVerbeObjet
http://lemire.me/ fr/http://www.w3.org/1999/ 02/22-rdf-syntax-ns#typehttp://www.w3.org/2000/ 10/swap/pim/contact#Person

Passons maintenant à la deuxième affirmation : « http://lemire.me/fr/ s'appelle Daniel Lemire ». Le verbe « s'appelle » peut être identifié par l'URI « http://www.w3.org/2000/10/swap/pim/contact#fullName ». Encore une fois, nous aurions pu inventer notre propre URI, en autant que nous utilisons toujours le même avec la même signification. L'objet, « Daniel Lemire », n'a pas de signification particulière et n'est qu'une chaîne de caractères; nous ne sommes donc pas tenus d'utiliser un URI. Cela n'est vrai que pour les objets : les sujets et les verbes doivent toujours être représentés par des URI en RDF. Nous obtenons le tableau suivant :

SujetVerbeObjet
http://lemire.me/ en/http://www.w3.org/2000/ 10/swap/pim/contact#fullName "Daniel Lemire"

Nous notons les chaînes de caractères avec les guillemets : alors que « http://www.unuri.org » est un URI, « "http://www.unuri.org" » est une chaîne de caractères.

Dans l'affirmation « http://lemire.me/fr/ peut être joint par courriel à lemire@gmail.com », nous pouvons remplacer le verbe par « http://www.w3.org/2000/10/swap/pim/contact#mailbox ». Quant à l'objet « lemire@gmail.com », c'est une adresse de courriel; afin qu'un ordinateur puisse comprendre qu'il s'agit d'une adresse de courriel et non d'une chaîne de caractères, nous utiliserons l'URL « mailto:lemire@gmail.com » pour le représenter. Nous avons donc le tableau suivant :

SujetVerbeObjet
http://lemire.me/ en/ http://www.w3.org/2000/ 10/swap/pim/contact#mailbox mailto:lemire@gmail.com

L'affirmation « http://lemire.me/fr/ a le titre de professeur » se traite de la même manière, de telle sorte que nous obtenons finalement le tableau suivant :

SujetVerbeObjet
http://lemire.me/ en/http://www.w3.org/1999/ 02/22-rdf-syntax-ns#typehttp://www.w3.org/2000/ 10/swap/pim/contact#Person
http://lemire.me/ en/http://www.w3.org/2000/ 10/swap/pim/contact#fullName "Daniel Lemire"
http://lemire.me/ en/ http://www.w3.org/2000/ 10/swap/pim/contact#mailbox mailto:lemire@gmail.com
http://lemire.me/ en/ http://www.w3.org/2000/ 10/swap/pim/contact#personalTitle "Professeur"

Précisons qu'en RDF, l'ordre des affirmations est sans importance. Ainsi, l'ordre des rangées dans le tableau est sans importance.

Ce tableau est une description formelle de notre phrase d'origine « Il y a une personne appelée Daniel Lemire dont l'adresse de courriel est lemire@gmail.com et qui est professeur. »; cette description peut être traitée par un ordinateur.

Comme nous le verrons plus loin, ce tableau RDF peut s'écrire en XML de la façon suivante :

<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:contact="http://www.w3.org/2000/10/swap/pim/contact#">
   <contact:Person rdf:about="http://lemire.me/fr/">
      <contact:fullName>Daniel Lemire</contact:fullName>
      <contact:mailbox rdf:resource="mailto:lemire@gmail.com"/>
      <contact:personalTitle>Professeur</contact:personalTitle> 
   </contact:Person>
</rdf:RDF>

On peut aussi représenter graphiquement le tableau RDF :

../module5/dlprof.pdf http://www.daniel-lemire.com/fr/ http://www.daniel-lemire.com/fr/ Person Person http://www.daniel-lemire.com/fr/->P erson Type Daniel Lemire Daniel Lemire http://www.daniel-lemire.com/fr/->D aniel Lemire fullName lemire@gmail.com lemire@gmail.com http://www.daniel-lemire.com/fr/->d lemire@teluq.ca mailbox Professeur Professeur http://www.daniel-lemire.com/fr/->P rofesseur personalTitle

Nous pouvons également spécifier dans quelle langue une chaîne de caractères est écrite; par exemple, le mot « professeur » n'a de sens qu'en français. Pour ce faire, nous utiliserons un attribut « xml:lang » ayant pour valeur un code ISO à deux caractères pour représenter la langue : « fr » pour français, « en » pour anglais, et ainsi de suite. Notre exemple modifié se lit comme suit :

<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:contact="http://www.w3.org/2000/10/swap/pim/contact#">
   <contact:Person rdf:about="http://lemire.me/fr/">
      <contact:fullName>Daniel Lemire</contact:fullName>
      <contact:mailbox rdf:resource="mailto:lemire@gmail.com"/>
      <contact:personalTitle xml:lang="fr">Professeur</contact:personalTitle> 
   </contact:Person>
</rdf:RDF>

Le choix de la langue ne constitue pas une nouvelle relation RDF, mais vient simplement annoter l'objet : dans un tableau sujet/verbe/objet, nous nous contenterons, par exemple, de remplacer « "Professeur" » par « "Professeur" (français) ».

Nous pouvons résumer le RDF comme ceci :

  • Le RDF peut être utilisé pour représenter tout objet, tant un site web qu'un individu.
  • Le RDF peut être traité par une machine.
  • Le RDF est composé de triplets : sujet/verbe/objet.
  • Le sujet est toujours identifié par un URI; mais dans certains cas, on peut omettre l'URI et alors, un URI factice sera généré dynamiquement.
  • Le verbe est toujours identifié par un URI, sans aucune exception.
  • L'objet est soit un URI, soit une valeur explicite (une chaîne de caractères, par exemple).
  • Le RDF peut être représenté en XML.

Le RDF en XML

Avertissement.- Tous les contenus RDF ne peuvent être représentés en XML selon la méthode que nous venons de présenter. La grande majorité du contenu RDF peut l'être, mais il y a des exceptions. Pour éviter les problèmes, nous supposerons ici que l'URI du verbe prend la forme « http://www.domaine.com/blabla/bla#vvv ». En d'autres termes, l'URI du verbe contient le symbole du dièse ( # ) et le texte après ce symbole est un nom XML valable (pouvant être utilisé comme balise).

Il existe plusieurs façons de représenter le RDF en XML, mais nous n'étudierons que l'approche préconisée par le W3C, qui est l'approche la plus courante. Par ailleurs, nous n'étudierons pas toute la syntaxe RDF/XML, mais seulement ce qui est nécessaire pour comprendre la majorité du RDF qui se trouve actuellement sur le web.

En règle générale, les documents XML représentant du contenu RDF n'ont pas de DTD, mais utilisent les espaces de noms. Nous commençons habituellement un document par une déclaration XML qui sera soit « <?xml version="1.0"?> », soit « <?xml version="1.0" encoding="ISO-8859-1"?> » pour permettre l'utilisation des accents français. Ensuite, viendra toujours l'élément RDF comme élément-racine. Ainsi, un des documents XML les plus simples possibles représentant du contenu RDF est :

<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
</rdf:RDF>

Observez l'utilisation de l'espace de noms identifié par l'URI « http://www.w3.org/1999/02/22-rdf-syntax-ns# ». Le fait de noter l'espace de noms par les trois lettres « rdf » est sans conséquence et nous pourrions aussi écrire :

<?xml version="1.0" encoding="ISO-8859-1"?>
<nimportequoidautre:RDF 
xmlns:nimportequoidautre="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
</nimportequoidautre:RDF>

L'important, c'est que l'élément-racine RDF soit dans l'espace de nom « http://www.w3.org/1999/02/22-rdf-syntax-ns# ». Supposons maintenant que nous voulions décrire l'affirmation RDF suivante :

SujetVerbeObjet
http://lemire.me/fr/ http://www.w3.org/2000/ 10/swap/pim/contact#mailbox mailto:lemire@gmail.com

La première étape consiste à décomposer l'URI du verbe en deux parties : l'URI jusqu'au symbole « # » inclusivement, soit « http://www.w3.org/2000/10/swap/pim/contact# », et le reste du texte, soit « mailbox ». La première partie devient un espace de noms, et la deuxième, appelée fragment, deviendra un nom d'élément. On utilise ensuite habituellement une balise « Description » dans l'espace de noms « http://www.w3.org/1999/02/22-rdf-syntax-ns# » avec le nom d'attribut « about » comme ceci :

<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.w3.org/2000/10/swap/pim/contact#" >
   <rdf:Description rdf:about="http://lemire.me/fr/">
   <mailbox rdf:resource="mailto:lemire@gmail.com" />
   </rdf:Description>
</rdf:RDF>

Dans cet exemple, le sujet est la valeur d'attribut de « about », soit « http://lemire.me/fr/ », le verbe est le nom de l'élément contenu dans l'élément « rdf:Description », ici « mailbox », auquel on ajoute en préfixe l'espace de noms auquel il appartient, soit « http://www.w3.org/2000/10/swap/pim/contact# ». L'URI de l'objet est la valeur de l'attribut « rdf:resource », soit « mailto:lemire@gmail.com ».

Pour nous assurer de bien comprendre, voyons un autre exemple, quoique plus abstrait. Supposons que nous ayons le contenu RDF suivant :

SujetVerbeObjet
http://domaine.com/page/ http://domaine.com#unverbe http://www.objet.com/

Nous pourrions utiliser la représentation XML suivante :

<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://domaine.com#" >
   <rdf:Description rdf:about="http://domaine.com/page/">
   <unverbe rdf:resource="http://www.objet.com/" />
   </rdf:Description>
</rdf:RDF>

Que devons-nous faire si l'objet n'est pas un URI, mais une chaîne de caractères? Dans ce cas, nous omettrons l'attribut « rdf:resource » et nous placerons notre valeur dans l'élément. Ainsi, pour représenter le contenu RDF suivant :

SujetVerbeObjet
http://lemire.me/fr/ http://www.w3.org/2000/ 10/swap/pim/contact#personalTitle "Professeur"

nous pourrons utiliser le code XML qui suit :

<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.w3.org/2000/10/swap/pim/contact#" >
   <rdf:Description rdf:about="http://lemire.me/fr/">
   <personalTitle>Professeur</personalTitle>
   </rdf:Description>
</rdf:RDF>

Encore une fois, les conventions relatives aux espaces de noms s'appliquent et nous pourrions remplacer le XML de l'exemple précédent par celui-ci :

<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:espacedenom="http://www.w3.org/2000/10/swap/pim/contact#" >
   <rdf:Description rdf:about="http://lemire.me/fr/">
   <espacedenom:personalTitle>Professeur</espacedenom:personalTitle>
   </rdf:Description>
</rdf:RDF>

Donc, pour représenter l'ensemble des données RDF suivantes :

SujetVerbeObjet
http://lemire.me/fr/http://www.w3.org/2000/ 10/swap/pim/contact#fullName "Daniel Lemire"
http://lemire.me/fr/ http://www.w3.org/2000/ 10/swap/pim/contact#mailbox mailto:lemire@gmail.com
http://lemire.me/fr/ http://www.w3.org/2000/ 10/swap/pim/contact#personalTitle "Professeur"

nous utiliserons plusieurs éléments, les uns à la suite des autres, comme ceci :

<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:espacedenom="http://www.w3.org/2000/10/swap/pim/contact#" >
 
   <rdf:Description rdf:about="http://lemire.me/fr/">
   <espacedenom:fullName>Daniel Lemire</espacedenom:fullName>
   </rdf:Description>
 
   <rdf:Description rdf:about="http://lemire.me/fr/">
   <espacedenom:mailbox rdf:resource="mailto:lemire@gmail.com" />
   </rdf:Description>
   
   <rdf:Description rdf:about="http://lemire.me/fr/">
   <espacedenom:personalTitle>Professeur</espacedenom:personalTitle>
   </rdf:Description>
  
</rdf:RDF>

En pratique toutefois, nous ne répétons pas l'élément « Description » avec la même valeur d'attribut « about »; nous préférons la syntaxe qui suit :

<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:espacedenom="http://www.w3.org/2000/10/swap/pim/contact#" >
 
   <rdf:Description rdf:about="http://lemire.me/fr/">
   <espacedenom:fullName>Daniel Lemire</espacedenom:fullName>
   <espacedenom:mailbox rdf:resource="mailto:lemire@gmail.com" />
   <espacedenom:personalTitle>Professeur</espacedenom:personalTitle>
   </rdf:Description>
  
</rdf:RDF>

Et comme l'ordre est sans importance en RDF, nous pourrions aussi avoir le XML suivant :

<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:espacedenom="http://www.w3.org/2000/10/swap/pim/contact#" >
 
   <rdf:Description rdf:about="http://lemire.me/fr/">
   <espacedenom:personalTitle>Professeur</espacedenom:personalTitle>
   <espacedenom:fullName>Daniel Lemire</espacedenom:fullName>
   <espacedenom:mailbox rdf:resource="mailto:lemire@gmail.com" />
   </rdf:Description>
  
</rdf:RDF>

Les classes en RDF

Jusqu'à présent, nous n'avons pas représenté en XML l'affirmation suivante :

SujetVerbeObjet
http://lemire.me/fr/http://www.w3.org/1999/ 02/22-rdf-syntax-ns#typehttp://www.w3.org/2000/ 10/swap/pim/contact#Person

Évidemment, nous pouvons tout simplement écrire ceci :

<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.w3.org/2000/10/swap/pim/contact#" >
<rdf:Description rdf:about="http://lemire.me/fr/">
  <rdf:type 
  rdf:resource="http://www.w3.org/2000/10/swap/pim/contact#Person" />
</rdf:Description>  
</rdf:RDF>

Mais, avouons-le, c'est assez peu lisible. Dans « http://www.w3.org/2000/10/swap/pim/contact#Person », « Person » est un fragment. Dans les cas où l'URI contient un fragment, nous représentons l'affirmation de la façon suivante :

<?xml version="1.0" encoding="ISO-8859-1"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.w3.org/2000/10/swap/pim/contact#" >
   <Person rdf:about="http://lemire.me/fr/">
   </Person>  
</rdf:RDF>

Nous remplaçons « rdf:Description » par le nom de la classe, soit « Person », avec le préfixe « http://www.w3.org/2000/10/swap/pim/contact# ». En pratique, cette dernière approche est presque toujours utilisée et son avantage devient évident quand on combine toutes les affirmations RDF de la première section :

SujetVerbeObjet
http://lemire.me/ en/http://www.w3.org/1999/ 02/22-rdf-syntax-ns#typehttp://www.w3.org/2000/ 10/swap/pim/contact#Person
http://lemire.me/ en/http://www.w3.org/2000/ 10/swap/pim/contact#fullName "Daniel Lemire"
http://lemire.me/ en/ http://www.w3.org/2000/ 10/swap/pim/contact#mailbox mailto:lemire@gmail.com
http://lemire.me/ en/ http://www.w3.org/2000/ 10/swap/pim/contact#personalTitle "Professeur"

Nous savons maintenant que nous pouvons représenter toutes ses informations par le XML suivant :

<?xml version="1.0"  encoding="ISO-8859-1" ?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.w3.org/2000/10/swap/pim/contact#">
  <Person rdf:about="http://lemire.me/fr/">
     <fullName>Daniel Lemire</fullName>
     <mailbox rdf:resource="mailto:lemire@gmail.com" />
     <personalTitle>Professeur</personalTitle> 
  </Person>
</rdf:RDF>

C'est comme ça que nous pouvons écrire « Il y a une personne appelée Daniel Lemire dont l'adresse de courriel est lemire@gmail.com et qui est professeur. » en RDF/XML.

Et s'il n'y a pas de symbole « # » dans l'URI?

Dans les exemples précédents, nous supposions que l'URI (du verbe) contenait un symbole « # », ce qui nous permettait de la décomposer en deux parties (nom et préfixe). Mais quoi faire si l'URI prend plutôt la forme « http://www.ondelette.com/employeur »? Dans un tel cas, nous pouvons choisir de retenir « http://www.ondelette.com/ » comme préfixe et « employeur » comme nom. Nous pourrons donc représenter les données RDF suivantes :

SujetVerbeObjet
http://lemire.me/fr/http://www.ondelette.com/employeurhttp://www.uquebec.ca/

par le XML suivant :

<?xml version="1.0"  encoding="ISO-8859-1" ?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.ondelette.com/">
   <rdf:Description rdf:about="http://lemire.me/fr/">
     <employeur rdf:resource="http://www.uquebec.ca/" />
   </rdf:Description>
</rdf:RDF>

Des objets qui sont eux-mêmes des sujets

Supposons que nous voulons dire que la pièce de théatre Othello a comme auteur William Shakespeare. En fait, nous voulons faire quatre affirmations : « Othello est une pièce de théatre », « Shakespeare est une personne », « Shakespeare est l'auteur d'Othello » et « Shakespeare a pour nom "William Shakespeare" ». Nous pourrions choisir de représenter en RDF ces quatre affirmations selon le tableau qui suit :

SujetVerbeObjet
http://www.othello.org/http://www.w3.org/1999/ 02/22-rdf-syntax-ns#typehttp://unuri.org/PieceDeTheatre
http://www.othello.org/http://unuri.org/auteurhttp://www.shakespeare.org
http://www.shakespeare.orghttp://www.w3.org/1999/ 02/22-rdf-syntax-ns#typehttp://unuri.org/Personne
http://www.shakespeare.org http://unuri.org/nom"William Shakespeare"

Nous pouvons utiliser la représentation XML suivante :

<?xml version="1.0" encoding="ISO-8859-1"?> 
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
xmlns="http://unuri.org/">

<PieceDeTheatre rdf:about="http://www.othello.org/"> 
   <auteur rdf:resource="http://www.shakespeare.org" /> 
</PieceDeTheatre>
<Personne rdf:about="http://www.shakespeare.org"> 
   <nom>William Shakespeare</nom> 
</Personne>
</rdf:RDF>

La représentation graphique du tableau RDF est :

../module5/othello.pdf http://www.othello.org/ http://www.othello.org/ PieceDeTheatre PieceDeTheatre http://www.othello.org/->PieceDeTheatre type http://www.shakespeare.org http://www.shakespeare.org http://www.othello.org/->http://www.shakespeare.org auteur Personne Personne http://www.shakespeare.org->Personne type William Shakespeare William Shakespeare http://www.shakespeare.org->William Shakespeare nom

Nous pouvons cependant le faire plus brièvement. Considérons d'abord le modèle suivant :

<?xml version="1.0" encoding="ISO-8859-1"?> 
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
xmlns="http://unuri.org/">

<PieceDeTheatre rdf:about="http://www.othello.org/"> 
  <auteur>
  (...)
  </auteur> 
</PieceDeTheatre> 
</rdf:RDF>

Nous avons vu que si nous mettons un nœud de texte là où les points « (...) » apparaissent, nous associerons « http://www.othello.org/ » avec un objet texte par le verbe « http://unuri.org/auteur ». Cependant, si nous mettons plutôt un élément muni d'un attribut « rdf:about », ce sera l'URI contenu dans l'attribut qui deviendra l'objet; nous gagnons alors la possibilité d'utiliser ce même objet comme sujet à son tour, comme dans cet exemple :

<?xml version="1.0" encoding="ISO-8859-1"?> 
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
xmlns="http://unuri.org/">

<PieceDeTheatre rdf:about="http://www.othello.org/">
  <!-- le verbe est http://unuri.org/auteur -->
  <auteur> <!-- début de l'objet -->
    <Personne rdf:about="http://www.shakespeare.org">
      <!-- l'objet devient un sujet à son tour -->
      <nom>William Shakespeare</nom> 
    </Personne><!-- fin de l'objet --> 
  </auteur> 
</PieceDeTheatre> 
</rdf:RDF>

Ce nouveau document RDF est équivalent aux trois affirmations RDF du début, mais il est un peu plus court.

Nous pourrions pousser l'expérience plus loin - ce qui peut devenir absurde - comme dans l'exemple qui suit :

<?xml version="1.0" encoding="ISO-8859-1"?> 
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
xmlns="http://unuri.org/">

<PieceDeTheatre rdf:about="http://www.othello.org/"> 
  <auteur rdf:resource="http://www.shakespeare.org" /> 
</PieceDeTheatre>
<Personne rdf:about="http://www.shakespeare.org"> 
      <nom>
       <Texte rdf:about="http://www.texte.org/william">
        <contenu>
          William Shakespeare
         </contenu>
       </Texte>
       </nom> 
</Personne>
</rdf:RDF>

Ce document est maintenant équivalent au tableau suivant :

SujetVerbeObjet
http://www.othello.org/ http://www.w3.org/1999/ 02/22-rdf-syntax-ns#type http://unuri.org/PieceDeTheatre
http://www.othello.org/ http://unuri.org/auteur http://www.shakespeare.org
http://www.shakespeare.org http://www.w3.org/1999/ 02/22-rdf-syntax-ns#type http://unuri.org/Personne
http://www.texte.org/william http://www.w3.org/1999/ 02/22-rdf-syntax-ns#type http://unuri.org/Texte
http://www.texte.org/william http://unuri.org/contenu "William Shakespeare"
http://www.shakespeare.org http://unuri.org/nom http://www.texte.org/william

Les contenants en RDF

Il arrive fréquemment, en pratique, que l'on doive donner comme valeur à un objet, non pas une chaîne de caractères, mais plutôt un ensemble de chaînes de caractères. Par exemple, nous pouvons vouloir affirmer que « les étudiants du cours 101 sont Jean Roberge, Alexandre Coma et Julie LeChat ». Comment le faire? Supposons que l'URI du cours est « http://www.teluq.ca/101 » et que le verbe correspondant à « être inscrit à un cours » est identifié par l'URI « http://www.education.com#inscription ». Nous pouvons alors essayer ceci :

<?xml version="1.0"  encoding="ISO-8859-1" ?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.education.com#">
   <rdf:Description rdf:about="http://www.teluq.ca/101">
     <inscription>Jean Roberge</inscription>
     <inscription>Alexandre Coma</inscription>
     <inscription>Julie LeChat</inscription>
   </rdf:Description>
</rdf:RDF>

Cela équivaut à remplacer l'affirmation « les étudiants du cours 101 sont Jean Roberge, Alexandre Coma et Julie LeChat » par les trois affirmations « le cours 101 a comme étudiant Jean Roberge », « le cours 101 a comme étudiant Alexandre Coma », « le cours 101 a comme étudiant Julie LeChat ». Il n'est pas certain qu'une telle décomposition de l'affirmation préserve toujours le sens original. Par exemple, nous pourrions vouloir donner la liste complète de tous les étudiants dans le cours. RDF nous permet de regrouper tous les étudiants dans un seul élément « Bag » (sac, en anglais) comme ceci :

<?xml version="1.0"  encoding="ISO-8859-1" ?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.education.com#">
   <rdf:Description rdf:about="http://www.teluq.ca/101">
     <inscription>
     <rdf:Bag>
     <rdf:li>Jean Roberge</rdf:li>
     <rdf:li>Alexandre Coma</rdf:li>
     <rdf:li>Julie LeChat</rdf:li>
     </rdf:Bag>
     </inscription>
   </rdf:Description>
</rdf:RDF>

Les éléments dans un « Bag » ne sont pas ordonnés. Nous pourrons remplacer le XML précédent par celui-ci, sans problème :

<?xml version="1.0"  encoding="ISO-8859-1" ?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.education.com#">
   <rdf:Description rdf:about="http://www.teluq.ca/101">
     <inscription>
     <rdf:Bag>
     <rdf:li>Julie LeChat</rdf:li>
     <rdf:li>Jean Roberge</rdf:li>
     <rdf:li>Alexandre Coma</rdf:li>
     </rdf:Bag>
     </inscription>
   </rdf:Description>
</rdf:RDF>

Si l'ordre importe, alors nous utiliserons un élément « Seq » (pour séquence), comme dans l'exemple suivant qui énonce les jours de la semaine, dans l'ordre :

<?xml version="1.0"  encoding="ISO-8859-1" ?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.jourdelasemaine.com#">
   <rdf:Description rdf:about="http://www.jourdelasemaine.com/">
      <journees>
      <rdf:Seq>
      <rdf:li>dimanche</rdf:li>
      <rdf:li>lundi</rdf:li>
      <rdf:li>mardi</rdf:li>
      <rdf:li>mercredi</rdf:li>
      <rdf:li>jeudi</rdf:li>
      <rdf:li>vendredi</rdf:li>
      <rdf:li>samedi</rdf:li>
      </rdf:Seq>
      </journees>
   </rdf:Description>
 </rdf:RDF>

Finalement, nous pourrions ne pas connaître exactement la valeur de l'objet, mais savoir que la valeur appartient à un ensemble fini de possibilités. Par exemple, si nous jouons à un jeu de détective et qu'il n'y a que trois coupables possibles (le majordome, la princesse et le seigneur), nous écrirons :

<?xml version="1.0"  encoding="ISO-8859-1" ?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns="http://www.jeududetective.com#">
   <rdf:Description 
   rdf:about="http://www.jeududetective.com/partie/2004/10/">
     <suspects>
     <rdf:Alt>
     <rdf:li>majordome</rdf:li>
     <rdf:li>princesse</rdf:li>
     <rdf:li>seigneur</rdf:li>
     </rdf:Alt>
     </suspects>
   </rdf:Description>
 </rdf:RDF>

RDFa

Il peut sembler un peu lourd de créer des fichiers XML distincts pour stocker le RDF. Heureusement, il existe donc plusieurs approches pour inscrire le RDF à même des fichiers XHTML. La spécification RDFa permet d'inscrire du RDF directement au sein d'un document XHTML avec les attributs about et property. Voici un exemple d'annotation RDFa ajoutée à un élément XHTML :

<ul xmlns:dc="http://purl.org/dc/elements/1.1/"
  about="http://www.example.com/books/wikinomics">
  <li property="dc:title">Wikinomics</li>
  <li property="dc:author">Don Tapscott</li>
  <li property="dc:date">2006-10-01</li>
</ul>

Conclusion

Nous avons vu que le modèle RDF sert à décrire pratiquement n'importe quoi en associant des URI à tous les objets et relations. Les données RDF peuvent généralement être représentées en XML selon l'approche que nous avons décrite, ce qui permet de combiner les avantages du XML (format entièrement normalisé et non propriétaire, outils très disponibles, etc.), tout en gardant les avantages du RDF (contenu pouvant être traité par des machines, relative simplicité). Pour plus de détails, on peut consulter les articles du site mozilla.org sur le sujet (http://developer.mozilla.org/en/docs/RDF).


© Daniel Lemire, 2014. Tous droits réservés.