# RDF pour tous : du publicateur au développeur web

Je ne pouvais pas continuer mon périple dans l'univers du web sémantique sans passer inévitablement par RDF. J'avais néanmoins beaucoup de mal à trouver un article bien fait au sujet de RDF jusqu'à ce que Simon me pointe vers l'article de Digital Web intitulé « RDF for the rest of us » écrit par Keith Alexander qui résume bien ce qu'il faut savoir pour aborder le sujet. Alors qu'on parlait précédemment des méthodes pour accéder aux ressources, passons maintenant à leur description.

Vous avez un site web plein d'informations et vous souhaitez simplifier la réutilisation du contenu par autrui mais dans quel format devriez-vous le publier ?

Vous avez analysé de nombreux schémas XML et les microformats, mais aucun d'eux ne décrit avec précision l'ensemble des informations que vous souhaitez publier. Devez-vous créer un nouveau format ? C'est tentant, mais si vous utilisez un standard, vos données seront immédiatement interopérables avec les autres données publiées de la même façon. On pourra réutiliser les outils, les parsers et les feuilles de style construits autour de ce standard. Mais malheureusement, rien ne semble vraiment convenir à vos besoins.

Et c'est là qu'intervient RDF.

#### RDF, qu'est ce que c'est ?

RDF signifie Framework de Description des Ressources (Resource Description Framework). Une ressource est une simple chose, une personne, un livre, un clavier, un billet de blog, un aquarium, une idée, n'importe quoi pouvant être décrit. RDF est un framework qui utilise l'architecture du web pour décrire une ressource. Tout comme HTML permet de lier des documents à d'autres sur le web, RDF vous permet de lier une ressource à une autre sur le web.

## RDF pour les publicateurs web

RDF est différent. Ce n'est pas un format, c'est un framework pour décrire des données. RDF permet de remonter un cran plus haut, au lieu de vous donner un nombre fini de termes pour décrire vos données (comme les balises HTML ou les noms de classes des microformats), RDF vous procure un framework à partir duquel vous pouvez utiliser plusieurs termes issus de vocabulaires existants - ou que vous avez inventé - de la manière qui sied le mieux à votre contenu spécifique.

Si vous trouvez un vocabulaire existant pour décrire une partie de vos données, c'est bon, ces données seront interopérables. Vous avez toujours la possibilité de décrire le reste de vos données avec des termes issus d'autant de vocabulaires qui répondent à vos besoins. Si vous ne trouvez aucun terme pour décrire vos données, et bien vous avez juste à en écrire de nouveaux.

Pour publier vos données, RDF vous offre une grande flexibilité et une bonne interopérabilité. Ce que signifie interopérabilité ici, ce n'est pas seulement que vos données vont pouvoir être exploitables avec les outils existant ou que ça peut fonctionner avec des données dans le même format mais que vos données peuvent être connectées avec d'autres données sur le web. C'est ce qu'est le Web Sémantique, le web des données.

Fantastique. Mais rien ne sert de publier des données si elles ne sont pas utilisées. Pourquoi est-ce que l'on souhaiterait avoir ces données en RDF ?

## RDF pour les développeurs web

Il y a deux aspects dans RDF qui rendent son utilisation intéressante pour les développeurs web.

### Toutes les données RDF ont la même forme

Ce que l'on entend par forme, ça ne signifie pas qu'elles se ressemblent toutes. RDF est un modèle de données plutôt qu'un format et, en ce sens, peut être publié dans un grand nombre de formats différents : XML, JSON, HTML et même en texte brut. Ce qui est important, c'est qu'ils aient tous la même structure de base : le Triple. RDF se compose de déclarations simples appelées Triples. Un Triple se compose d'un sujet, d'un prédicat et d'un objet.

#### Qu'est ce qu'un Triple RDF ?

- Le sujet représente la chose (ressource) à laquelle la déclaration fait référence et est toujours une URI.
- Le prédicat est le nom d'une propriété de la ressource (comme le nom d'un champ de la base de données) et est toujours une URI.
- L'objet est la valeur de cette propriété, et peut être une URI ou un littéral (texte, nombre, date, etc).

Chaque Triple dit : cette ressource a cette propriété, qui peut aussi bien être une valeur littérale qu'une autre ressource (représentée par l'URI).

Qu'est ce qui est si bien là-dedans ? C'est un peu comme le mantra de Ruby on Rails « Convention over Configuration ». Lorsque vous avez intégré une structure, vous n'avez plus à y penser - vous n'avez plus à modifier votre code et votre schéma de base de données pour vous adapter à un nouveau type de données. Vous pouvez importer n'importe quel RDF et ça va immédiatement marcher.

### RDF utilise les URI

Quoi qu'il en soit, avoir des données qui utilisent la même structure de base ne suffit pas à les rendre interopérables. Les documents XML utilisent souvent des attributs id et les bases relationnelles utilisent des clés primaires comme identifiants uniques. Mais en dehors de leur propre système, ces identifiants n'ont aucune signification. Nous pouvons tous les deux avoir des blogs, mais la clé primaire 23 dans votre table d'articles identifie un article différent dans votre base de données et dans la mienne. RDF, en revanche, utilise des URI, qui sont les clés primaires d'un système beaucoup plus gros : le web.

Nous avons donc un système décentralisé de choses identifiées de façon unique. N'importe qui avec un peu d'espace web peut créer une URI pour représenter quelque chose (nos ressources RDF, voir plus bas) d'une manière compréhensible sur le web.

Vous n'avez pas besoin de placer une page web à cette adresse, mais c'est une bonne pratique d'avoir une description de ce que représente l'URI lisible par les humains et/ou les machines. La nature du web permet à chacun de dire ce qu'il veut au sujet de ce qu'il souhaite, vous ne pouvez donc pas contrôler ce que disent les autres au sujet de vos URI, mais en publiant une description à cette même URI, vous pouvez au moins avoir le dernier mot sur le message que vous souhaitez faire passer.

En donnant à toutes vos données la même forme, et en rendant leurs descriptions identifiables de manière unique sur le web, RDF rend votre code et vos données plus portables, davantage interopérables, et en définitive plus utiles.

## Comment l'utiliser

### Publier des données dans votre HTML avec eRDF

J'ai précédemment expliqué que RDF peut être écrit de nombreuses manières différentes, l'une d'entre elles est eRDF. C'est un manière simple d'inclure des déclaration RDF au sein du HTML en utilisant des attributs comme id, class, rel ou href d'une façon spéciale.

Pour écrire du HTML dopé au eRDF, commençons par placer un attribut de profil dans le bloc <head> :

    <head profile="http://purl.org/NET/erdf/profile">

profile est l'un des attributs les moins connus du HTML. Il peut contenir une URI (ou une liste d'URI séparées par des virgules). Les agents utilisateurs peuvent utiliser ces URI pour déterminer la façon d'extraire les données du document. Dans notre cas, nous l'utilisons pour spécifier que le document peut être considéré comme étant du eRDF.

Ensuite, nous déclarons tous les vocabulaires que nous souhaitons utiliser, en utilisant l'élément link en entête du document. Nous allons utiliser les vocabulaires FOAF et Dublin Core. FOAF est un vocabulaire populaire pour décrire les personnes et les organisations, Dublin Core est un vocabulaire pour les métadonnées, permettant d'ajouter par exemple le titre et la date :

    <link rel="schema.dc" href="http://purl.org/dc/elements/1.1/" />
    <link rel="schema.foaf" href="http://xmlns.com/foaf/0.1/" />

L'attribut rel précise au parser eRDF que nous allons nous référer au vocabulaire FOAF avec le préfixe foaf, et au vocabulaire Dublin Core avec le préfixe dc. Nous allons ensuite pouvoir utiliser les noms de classes et les attributs rel et rev pour décrire les données au sein du document en utilisant des termes issus de ces vocabulaires. Ces attributs de « style eRDF » prennent la forme préfixe-terme - si vous êtes un programmeur, vous pouvez penser au préfixe comme à une constante qui représente l'URI du vocabulaire. On peut donner au vocabulaire FOAF le préfixe que l'on souhaite, mais il parait sensé de lui donner le préfixe foaf. (Notez que l'attribut href de chaque lien vers un vocabulaire que vous utilisez doit se terminer par un slash ou une #ancre).

Maintenant, nous pouvons décrire l'information de la page en utilisant les termes de ces vocabulaires.

Pour notre exemple, nous allons nous intéresser au code du gabarit des contributeurs de Digital Web :

    <div class="vcard -foaf-Person" id="person">
      <!-- \Nous ajouterons le détail ici ensuite -->
    </div>

La première chose à remarquer, c'est que nous avons donné un id à la div. C'est important. Vous vous souvenez que j'ai dit que RDF utilise les URI pour parler des choses ? Et bien en donnant à cette div un identifiant, nous lui créons une URI. Si l'URL de la page est http://www.digital-web.com/about/staff/nick_finck, l'URI de notre profil est http://www.digital-web.com/about/staff/nick_finck#person.

Avec la syntaxe eRDF, les noms de classes, dans notre cas -foaf-Person, commençant par un tiret indiquent que notre classe décrit le type de chose qu'est notre #person. Cela signifie que la chose représentée par cette div (#person) est une personne (telle qu'elle est définie dans le vocabulaire FOAF).

Vous avez sûrement aussi remarqué le nom de classe vcard. Digital Web utilise déjà le microformats hCard dans ses pages de profils et eRDF cohabite très bien avec les microformats. Le nom de classe vcard n'a aucun effet sur eRDF et vice-versa. Ici nous utilisons hCard pour rendre possible la transformation des données en vCard et eRDF pour rendre possible l'extraction de l'information brute.

Ok, passons aux détails :

    <div class="vcard -foaf-Person" id="person">
      <h1 class="foaf-name fn n">Nick Finck</h1>
      <img src="/images/profiles/nick_finck.jpg"
        alt="Nick Finck"
        class="foaf-img photo" />
      <!-- nous ajouterons quelques détails dans un moment -->
    </div>

Le nom de classe foaf-name signifie que le contenu de cet élément (dans ce cas, l'élément h1) est le nom (tel qu'il est défini dans le vocabulaire FOAF) de cette div#person car c'est le premier parent avec un id.

#### Comment lire eRDF ?

Avec eRDF, pour lequel l'élément à un nom de classe dans un style eRDF (avec un préfixe), le plus proche parent avec un id est le sujet, le nom de classe est le prédicat, et l'objet peut être :

- L'attribut src, s'il existe, ou
- L'élément courant, s'il a un id, ou
- L'attribut title, s'il existe, ou
- Le contenu textuel de l'élément courant.

Ainsi <img src="/images/profiles/nick_finck.jpg" class="foaf-img" /> signifie div#person est décrite par l'image /images/profiles/nick_finck.jpg.

Ok, ajoutons un peu de code :

    <div class="vcard -foaf-Person" id="person">
      <h1 class="foaf-name fn n">Nick Finck</h1>
      <img src="/images/profiles/nick_finck.jpg"
        alt="Nick Finck"
        class="foaf-img photo" />
      <dl>
        <dt>Birthplace:</dt>
        <dd class="cv-birthPlace">
          Portland, Oregon, United States
        </dd>
        <dt>Personal web site/Portfolio:</dt>
        <dd>
          <a href="http://www.nickfinck.com/"
            class="url"
            rel="foaf-homepage"
            rev="foaf-maker">
              NickFinck.com
          </a>
        </dd>
      </dl>
      <!-- nous ajouterons les publications ensuite -->
    </div>

Jetez un œil la définition du site personnel/portfolio. Ici nous n'utilisons aucun nom de classe eRDF particulier, mais nous retrouvons le style eRDF dans les attributs rel et rev. Les spécifications HTML disent que rel définit la relation entre le document courant et le lien qui est spécifié dans l'URL, alors que rev définit l'inverse : ce que le document courant signifie pour l'URL liée.

Dans la terminologie RDF à triples pour laquelle nous avons un attribut rel dans le style eRDF :

- Le sujet est le parent le plus proche avec un id.
- Le prédicat est la valeur de l'attribut rel (dans notre cas foaf-homepage).
- L'objet est la valeur de href.

Et là où nous avons rev, l'inverse est vrai :

- Le sujet est la valeur du href.
- Le prédicat est la valeur de l'attribut rev (dans notre cas, foaf-maker).
- L'objet est l'ancêtre le plus proche avec un id.

Donc ce que nous disons, c'est que notre personne (représentée par div#person) a une page personnelle, qui est http://www.nickfinck.com/, et que le propriétaire de cette page personnelle est l'auteur (maker) de la page courante.

Intéressons nous maintenant à la définition du lieu de naissance. FOAF n'a pas de terme pour définir le lieu de naissance, nous avons donc besoin d'un autre vocabulaire. J'ai recherché « birthplace » sur SchemaWeb et découvert le vocabulaire CV pour décrire les informations d'un profil. J'ai vérifié la définition et ça collait avec la façon dont je voulais l'utiliser, j'ai donc ajouté <link rel="schema.cv" href="http://captsolo.net/semweb/resume/cv.rdfs#"/> au bloc <head> de mon document, je peux maintenant utiliser les termes issus du vocabulaire CV.

Passons à la section publications. Toujours au sein de notre div#person, ça ressemble à :

    <h2>Digital Web Articles</h2>
    <ol>
      <li class="foaf-made -bib-Article" id="dw-articles-1">
        <h2 class="dc-title">
          <a href="http://www.biologeek.com/articles/industry_transformation/">
            The Transformation of an Industry
          </a>
        </h2>
        <p class="date">
          Published on
          <span class="dc-date">May 13, 2004</span>
        </p>
      </li>
      <!-- beaucoup d'autres articles avec le même code -->
    </ol>

À nouveau, si nous souhaitons décrire quelque chose, comme un article, nous devons lui donner une URI, ce qui signifie lui donner un id dans notre html. Et nous avons besoin d'un autre vocabulaire pour nous donner accès aux termes permettant de décrire notre article. Ayant à nouveau consulté SchemaWeb, j'ai opté pour le vocabulaire Bibtex et ajouté <link rel="schema.bib" href="http://purl.org/net/nknouf/ns/bibtex#"/> dans l'entête du document (<head>).

Analysons le <li>. Ce que nous disons ici c'est que cette #person a rédigé #dw-articles-1 et #dw-articles-1 est un article. On a aussi utilisé le vocabulaire Dublin Core (dc) pour donner une date de publication et un titre à l'article. Notez que dc-title et dc-date sont des propriétés de #dw-articles-1, pas de #person, car maintenant #dw-articles-1 est le plus proche parent avec un id.

Vous savez dorénavant comment baliser un profil et une bibliographie simple. Mais encore mieux, vous pouvez appliquer les mêmes techniques pour décrire avec du code sémantique tout ce que vous souhaitez (personnes, endroits, produits, concepts abstraits, structures chimiques, forums, évènements historiques - tout !) Vous avez juste à trouver - ou créer - les termes du vocabulaire dont vous avez besoin.

Lorsque vous allez vouloir aller plus loin, vous allez sûrement devoir aller consulter les spécifications de eRDF, qui expliquent comment écrire eRDF de manière plus détaillée.

Félicitations ! Votre HTML sémantique, quel que soit son contenu, peux maintenant être facilement parsé en RDF.

## Utiliser RDF : un mashup simple à base de RDF utilisant Exhibit

Exhibit est un framework JavaScript configurable pour présenter de petites à moyennes quantités de données. Il peut importer RDF/XML en l'envoyant vers le service web Babel de Simile pour le transformer dans le format JSON d'Exhibit - qui est lui-même une version de RDF.

Concevoir un mashup est simple :

- Copiez et collez (et, si vous le souhaitez, personnalisez) ce gabarit
- Éditez les éléments <link rel="exhibit/data" /> afin qu'ils pointent sur les données que vous souhaitez utiliser, n'importe où sur le web.
- Chargez la page dans votre navigateur. C'est tout.

Vous pouvez trouver davantage d'informations au sujet d'Exhibit sur le wiki de Simile.

## Conclusion

RDF est le langage au cœur du Web Sémantique. Cela signifie qu'en publiant vos données en RDF sur le web, en utilisant les termes issus des vocabulaires existants là où vous pouvez, et en liant les autres données, vous pouvez augmenter l'utilité de vos données et de celles que vous liez. Il y a une masse grandissante de données RDF disponibles sur le web, certaines ressources sont liées sur le wiki de Linking Open Data.

Même sans s'intéresser au Web Sémantique, la flexibilité de RDF et sa structure uniforme en font une forme extrêmement utile pour stocker vos données. Vous n'avez pas à attendre que quelqu'un le fasse à votre place, vous pouvez d'ores et déjà l'utiliser.

## Liens utiles

Je voulais regrouper ici des liens utiles en français mais je n'ai pu trouver « que » les excellents billets de Got : Sémantique et XHTML et RDF par l'apprentissage : FOAF. Si vous lisez l'anglais, il y en a par contre une flopée à la fin de l'article original.

### Articles peut-être en rapport

- ★ Mieux que gratuit : le business model réinventé
- ★ Pour ne plus être en REST, comprendre cette architecture
- ★ De l'OpenData au LinkedData : exemple de nosdonnees.fr

### Commentaires

Got le 27/08/2007 :

Merci David pour tes fleurs et ton billet. Pour compléter les liens que tu donnes, j'avais écrit un autre billet sur RDF pour tenter de l'expliquer : lespetitescases.net/rdf-p... (republié pour l'occasion). Il existe une autre méthode que les microformats et eRDF pour inclure du RDF dans des pages Web : RDFa, actuellement brouillon au W3C. C'est un peu ma marotte en ce moment (mais tu t'en es peut-être aperçu ;-) ), par exemple le dernier en date : lespetitescases.net/amuso... et j'anticipe peut-être sur les billets à venir :-)

Christophe le 27/08/2007 :

J'apprécie cette synthèse très pédagogique ! Rien à ajouter sur le fond, tout y est pour comprendre l'intérêt de RDF et, plus largement, du web sémantique.
La référence aux articles de Got est la bienvenue, c'est d'ailleurs grâce à lui que je découvre toutes les subtilités de ce sujet passionnant. Il a également su me remettre sur le droit chemin quand je mélangeais plusieurs notions encore floues pour moi (merci, Got !).
J'y ajouterais le blog de Christian Fauré - www.christian-faure.net - qui aborde régulièrement le sujet et défend avec ferveur l'approche REST (en opposition à SOAP, le plus souvent).
Et puisque tu as mentionné Simile Exhibit, sa version 2.0 bêta est sortie vendredi dernier. Même si les nouveautés ne sont pas évidentes quand on regarde l'interface, les modifications sont profondes et l'exécution notoirement plus rapide (pour ne pas dire surprenante !). Tous les projets Simile sont de la même veine (je vous conseille de vous attarder sur Timeplot, tout frais, tout neuf). D'autres projets arrivent derrière (Potluck, Wibbit, Timegrid...), tous aussi étonnants. J'ai prévu de faire une série d'articles sur ces outils et leur mise en oeuvre, mais le temps me manque un peu en ce moment... Par contre, j'espère trouver les quelques heures pour finir les versions françaises d'Exhibit 2.0, Potluck 1.0, Timeline 2.0 et Timeplot 1.0. Elles seront intégrées aux API de Simile, disponibles sur le site officiel : simile.mit.edu
Encore bravo pour la qualité de cet article !

Olivier G. le 27/08/2007 :

Très bon billet (encore !), mais j'ai pas très bien compris quand on devait faire commencer la classe par un tiret ou pas. C'est quand on débute la description d'une nouvelle ressource #id, c'est ça ?

David, biologeek le 28/08/2007 :

@Got : merci pour ce complément d'information, concernant RDFa c'est en effet sur ma todo ;-).
@Christophe : oui je suis le blog de Christian aussi (mais il me semble qu'il parle plus rarement de RDF qui était l'objet du billet). J'ai vu que tu étais pas mal impliqué dans Exhibit sur ton blog, c'est cool je sais où m'adresser pour le support maintenant :D.
@Olivier : oui c'est exactement ça.

Nicofrand le 30/08/2007 :

Article intéressant. Si j'étais quelque peu noyé dans le concept au départ et effrayé par le fait qu'il y ait plusieurs vocabulaires possibles, ton article m'a rassuré.
Cependant, n'est-il pas lourd pour un site regroupant des ressources diverses et variées de devoir utiliser plusieurs vocabulaires?
Sinon, à l'heure de Dbpedia, cela donne à réfléchir :p !

Olivier le 24/12/2007 :

C'est vrai que c'est alléchant pour un geek, mais.... est-ce que ça sert à quelque chose de concret ?
Je me fais un peu l'avocat du diable, mais qui va bien pouvoir utiliser ces données ?
C'est un peu comme la validation HTML : si on avait la certitude que Google en tenait compte, les développeurs web en ferait une priorité.
En fait, personne ne rend ses pages sémantiques, donc peu d'outils les utilisent, donc personne ne prend la peine de les rendre sémantiques, etc....

David, biologeek le 24/12/2007 :

@Olivier : je suis en plein dedans là, donc je vais bientôt parler d'une utilisation concrète normalement.
Toutes les nouvelles technologies ont un problème de poule et d'œuf, c'est aux adopteurs précoces de montrer la voie ;-).

karl le 30/09/2008 :

@Olivier Mon mantra de la technologie est « Utilise le si cela t'es utile. »

RDF est déjà utile pour de nombreuses personnes, dans des cas précis. Dans le domaine de la recherche qui fait une énorme consommation de données provenant de différentes sources par exemple.

MusicBrainz utilise RDF - http://musicbrainz.org/MM/

Il y a même de nombreux endroits où tu ne le sais pas. Tous les fichiers produits par les produits adobe (PDF, Image) contiennent du XMP, qui est un sous-ensemble RDF. Lorsque tu charges une image contenant du XMP sur Flickr, le script lit les données et peuple les champs de titre, tags, et description avec.

Pour ce qui est de la validité de mes pages Web, je le fais parce que cela rend plus facile mon utilisation de la technologie. Ma validité n'est pas un processus de vérification après publication, mais une étape de contrôle qualité pré-publication pour utiliser correctement les outils de traitement. Tiens il faut que je fasse un article sur le QA blog à propos de cela :)