title:      RDF pour tous : du publicateur au développeur web
slug:       rdf-pour-tous-du-publicateur-au-developpeur-web
date:       2007-08-27 18:03:56
type:       post
vignette:   images/logos/digital_web.png
contextual_title1:  ★ Mieux que gratuit : le business model réinventé
contextual_url1:    20080227-mieux-que-gratuit-le-business-model-reinvente
contextual_title2:  ★ Pour ne plus être en REST, comprendre cette architecture
contextual_url2:    20070413-pour-ne-plus-etre-en-rest-comprendre-cette-architecture
contextual_title3:  ★ De l&#39;OpenData au LinkedData : exemple de nosdonnees.fr
contextual_url3:    20101130-de-lopendata-au-linkeddata-exemple-de-nosdonneesfr

<p>Je ne pouvais pas continuer mon périple dans l'univers du web sémantique sans passer inévitablement par <abbr title="Resource Description Framework">RDF</abbr>. J'avais néanmoins beaucoup de mal à trouver un article bien fait au sujet de RDF jusqu'à ce que <a href="http://atonie.org/sr/">Simon</a> me pointe vers l'article de Digital Web intitulé «&nbsp;<a href="http://www.digital-web.com/articles/rdf_for_the_rest_of_us/">RDF for the rest of us</a> » écrit par <a href="http://semwebdev.keithalexander.co.uk/blog/">Keith Alexander</a> qui résume bien ce qu'il faut savoir pour aborder le sujet. Alors qu'on parlait précédemment des <a href="https://larlet.fr/david/biologeek/archives/20070629-architecture-orientee-ressource-pour-faire-des-services-web-restful/">méthodes pour accéder aux ressources</a>, passons maintenant à leur description.</p>

<p>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&nbsp;?</p>


<p>Vous avez analysé de nombreux <a href="http://fr.wikipedia.org/wiki/XML_Schema">schémas XML</a> et les <a href="http://microformats.org/">microformats</a>, mais aucun d'eux ne décrit avec précision l'ensemble des informations que vous souhaitez publier. <strong>Devez-vous créer un nouveau format ?</strong> 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.</p>


<p>Et c'est là qu'intervient RDF.</p>


<h4>RDF, qu'est ce que c'est&nbsp;?</h4>


<p>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 <a href="http://fr.wikipedia.org/wiki/Framework">framework</a> qui utilise l'architecture du web pour décrire une ressource. Tout comme HTML permet de lier des documents à d'autres sur le web, <strong>RDF vous permet de lier une ressource à une autre sur le web</strong>.</p>


<h2>RDF pour les publicateurs web</h2>


<p>RDF est différent. Ce n'est pas un format, c'est un framework pour décrire des données. <strong>RDF permet de remonter un cran plus haut</strong>, 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.</p>


<p>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.</p>


<p>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 <strong>vos données peuvent être connectées avec d'autres données sur le web. C'est ce qu'est le <a href="http://fr.wikipedia.org/wiki/Web_s%C3%A9mantique">Web Sémantique</a>, le web des données</strong>.</p>


<p>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&nbsp;?</p>


<h2>RDF pour les développeurs web</h2>


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


<h3>Toutes les données RDF ont la même forme</h3>


<p>Ce que l'on entend par <em>forme</em>, ç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&nbsp;: XML, <abbr title="JavaScript Object Notation">JSON</abbr>, HTML et même en texte brut. Ce qui est important, c'est qu'ils aient tous la même structure de base&nbsp;: le Triple. <strong>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</strong>.</p>


<h4>Qu'est ce qu'un Triple RDF&nbsp;?</h4>

<ul>
<li>Le <strong>sujet</strong> représente la chose (ressource) à laquelle la déclaration fait référence et est toujours une <a href="http://fr.wikipedia.org/wiki/Uniform_Resource_Identifier">URI</a>.</li>
<li>Le <strong>prédicat</strong> 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.</li>
<li>L'<strong>objet</strong> est la valeur de cette propriété, et peut être une URI ou un littéral (texte, nombre, date, etc).</li>
</ul>

<p>Chaque Triple dit&nbsp;: 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).</p>


<p>Qu'est ce qui est si bien là-dedans&nbsp;? C'est un peu comme le mantra de <a href="http://www.rubyonrails.org/">Ruby on Rails</a> «&nbsp;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.</p>


<h3>RDF utilise les URI</h3>


<p>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&nbsp;: le web.</p>


<p><strong>Nous avons donc un système décentralisé de choses identifiées de façon unique</strong>. 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.</p>


<p>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.</p>


<p>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 <strong>plus utiles</strong>.</p>


<h2>Comment l'utiliser</h2>


<h3>Publier des données dans votre HTML avec <abbr title="RDF embarqué (embedded RDF)">eRDF</abbr></h3>


<p>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 <em>id</em>, <em>class</em>, <em>rel</em> ou <em>href</em> d'une façon spéciale.</p>


<p>Pour écrire du HTML dopé au eRDF, commençons par placer un attribut de profil dans le bloc &lt;head&gt;&nbsp;:</p>


<pre>&lt;head profile="http://purl.org/NET/erdf/profile"&gt;</pre>


<p><em>profile</em> 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.</p>


<p>Ensuite, nous déclarons tous les vocabulaires que nous souhaitons utiliser, en utilisant l'élément <em>link</em> en entête du document. Nous allons utiliser les vocabulaires <strong><a href="http://xmlns.com/foaf/spec/">FOAF</a></strong> et <strong><a href="http://dublincore.org/2006/12/18/dces.rdf#">Dublin Core</a></strong>. <abbr title="Friend Of A Friend">FOAF</abbr> 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&nbsp;:</p>


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


<p>L'attribut <em>rel</em> précise au parser eRDF que nous allons nous référer au vocabulaire FOAF avec le préfixe <strong>foaf</strong>, et au vocabulaire Dublin Core avec le préfixe <strong>dc</strong>. Nous allons ensuite pouvoir utiliser les noms de classes et les attributs <em>rel</em> et <em>rev</em> pour décrire les données au sein du document en utilisant des termes issus de ces vocabulaires. Ces attributs de «&nbsp;style eRDF » prennent la forme <strong>préfixe-terme</strong> - 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 <em>foaf</em>. (Notez que l'attribut <em>href</em> de chaque lien vers un vocabulaire que vous utilisez doit se terminer par un slash ou une #ancre).</p>


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


<p>Pour notre exemple, nous allons nous intéresser au code du gabarit des contributeurs de Digital Web&nbsp;:</p>


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


<p>La première chose à remarquer, c'est que nous avons donné un <em>id</em> à la div. <strong>C'est important.</strong> Vous vous souvenez que j'ai dit que RDF utilise les URI pour parler des choses&nbsp;? Et bien en donnant à cette div un identifiant, <a href="http://www.w3.org/DesignIssues/Fragment.html">nous lui créons une URI</a>. 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.</p>


<p>Avec la syntaxe eRDF, les noms de classes, dans notre cas <strong>-foaf-Person</strong>, commençant par un tiret indiquent que notre classe décrit le type de chose qu'est notre <strong>#person</strong>. 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).</p>


<p>Vous avez sûrement aussi remarqué le nom de classe <strong>vcard</strong>. Digital Web utilise déjà le <a href="http://microformats.org/wiki/hcard">microformats hCard</a> dans ses pages de profils et <strong>eRDF cohabite très bien avec les microformats</strong>. 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.</p>


<p>Ok, passons aux détails&nbsp;:</p>


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


<p>Le nom de classe <strong>foaf-name</strong> 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 <strong>div#person</strong> car c'est le premier parent avec un id.</p>


<h4>Comment lire eRDF&nbsp;?</h4>


<p>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&nbsp;:</p>

<ul>
<li>L'attribut src, s'il existe, ou</li>
<li>L'élément courant, s'il a un id, ou</li>
<li>L'attribut title, s'il existe, ou</li>
<li>Le contenu textuel de l'élément courant.</li>
</ul>

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


<p>Ok, ajoutons un peu de code&nbsp;:</p>


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


<p>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 <em>rel</em> et <em>rev</em>. <strong>Les spécifications HTML disent que <em>rel</em> définit la relation entre le document courant et le lien qui est spécifié dans l'URL, alors que <em>rev</em> définit l'inverse&nbsp;: ce que le document courant signifie pour l'URL liée.</strong></p>


<p>Dans la terminologie RDF à triples pour laquelle nous avons un attribut <em>rel</em> dans le style eRDF&nbsp;:</p>

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

<p>Et là où nous avons <em>rev</em>, l'inverse est vrai&nbsp;:</p>

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

<p>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.</p>


<p>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é «&nbsp;birthplace » sur <a href="http://schemaweb.info/">SchemaWeb</a> et découvert le <a href="http://captsolo.net/semweb/resume/cv.rdfs">vocabulaire CV</a> 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é &lt;link rel="schema.cv" href="http://captsolo.net/semweb/resume/cv.rdfs#"/&gt; au bloc &lt;head&gt; de mon document, je peux maintenant utiliser les termes issus du vocabulaire CV.</p>


<p>Passons à la section publications. Toujours au sein de notre div#person, ça ressemble à&nbsp;:</p>


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


<p>À 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 <a href="http://zeitkunst.org/bibtex/0.1/bibtex.owl">vocabulaire Bibtex</a> et ajouté &lt;link rel="schema.bib" href="http://purl.org/net/nknouf/ns/bibtex#"/&gt; dans l'entête du document (&lt;head&gt;).</p>


<p>Analysons le &lt;li&gt;. Ce que nous disons ici c'est que cette <strong>#person</strong> a rédigé  <strong>#dw-articles-1</strong> et <strong>#dw-articles-1</strong> 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 <strong>dc-title</strong> et <strong>dc-date</strong> sont des propriétés de <strong>#dw-articles-1</strong>, pas de <strong>#person</strong>, car maintenant <strong>#dw-articles-1</strong> est le plus proche parent avec un id.</p>


<p>Vous savez dorénavant comment baliser un profil et une bibliographie simple. Mais encore mieux, <strong>vous pouvez appliquer les mêmes techniques pour décrire avec du code sémantique tout ce que vous souhaitez</strong> (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.</p>


<p>Lorsque vous allez vouloir aller plus loin, vous allez sûrement devoir aller consulter <a href="http://research.talis.com/2005/erdf/wiki/Main/RdfInHtml">les spécifications de eRDF</a>, qui expliquent comment écrire eRDF de manière plus détaillée.</p>


<p>Félicitations&nbsp;! Votre HTML sémantique, quel que soit son contenu, peux maintenant être facilement parsé en RDF.</p>


<h2>Utiliser RDF&nbsp;: un mashup simple à base de RDF utilisant Exhibit</h2>


<p><a href="http://simile.mit.edu/exhibit/">Exhibit</a> 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 <a href="http://simile.mit.edu/babel/">service web Babel</a> de Simile pour le transformer dans le format JSON d'Exhibit - qui est lui-même une version de RDF.</p>


<p>Concevoir un mashup est simple&nbsp;:</p>

<ul>
<li>Copiez et collez (et, si vous le souhaitez, personnalisez) <a href="http://simile.mit.edu/wiki/Exhibit/How_to_import_RDF_on_the_fly">ce gabarit</a></li>
<li>Éditez les éléments &lt;link rel="exhibit/data" /&gt; afin qu'ils pointent sur les données que vous souhaitez utiliser, n'importe où sur le web.</li>
<li>Chargez la page dans votre navigateur. C'est tout.</li>
</ul>

<p>Vous pouvez trouver davantage d'informations au sujet d'Exhibit <a href="http://simile.mit.edu/wiki/Exhibit/For_Authors">sur le wiki de Simile</a>.</p>


<h2>Conclusion</h2>


<p><strong>RDF est le langage au cœur du Web Sémantique</strong>. 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, <strong>vous pouvez augmenter l'utilité de vos données et de celles que vous liez</strong>. Il y a une masse grandissante de données RDF disponibles sur le web, certaines ressources sont liées <a href="http://esw.w3.org/topic/TaskForces/CommunityProjects/LinkingOpenData/DataSets">sur le wiki de Linking Open Data</a>.</p>


<p>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.</p>


<h2>Liens utiles</h2>


<p>Je voulais regrouper ici des liens utiles en français mais je n'ai pu trouver «&nbsp;que » les excellents billets de Got&nbsp;: <a href="http://www.lespetitescases.net/semantique-et-xhtml">Sémantique et XHTML</a> et <a href="http://lespetitescases.net/rdf-par-l-apprentissage-foaf">RDF par l'apprentissage&nbsp;: FOAF</a>. Si vous lisez l'anglais, il y en a par contre une flopée à la fin de l'article original.</p>
