Une introduction aux données liées et à RDF

Julien Plu

Ce tutoriel sera une grosse introduction sur ce que peuvent être des données liées et sur RDF. Elle se focalisera principalement sur la façon dont sont modélisées les données sur le Web de données. C'est une extension aux tutoriels déjà existants sur Developpez.com, principalement celui-ci. Commentez

- Titre : Une introduction aux données liées et à RDF

- Auteur : Julien Plu

- Parution : 20 janvier 2013

- Mise à jour : 4 janvier 2016

- Public visé :

- Licence : Copyright ® 2013-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. Motivation

- II. Fondations techniques

- II-A. RDF en général

- II-B. URI (Uniform Resource Identifier)

- II-C. Littéral

- II-D. Turtle

- II-E. Nœuds anonymes

- III. RDFS et OWL

- IV. Conclusion

- V. Remerciements

I - Motivation

À quoi peut-on résumer le Web traditionnel que l'on connaît actuellement ? Très simplement, c'est la somme d'Internet, de documents et de liens. La situation est résumée dans la première figure : elle servira de base d'exemple pour expliquer ce que ce Web actuel peut avoir comme problèmes.

Schéma de représentation du Web actuel

Quel est le lien entre les pages d'accueil de ces trois sites Web ? Quelqu'un qui me connaît personnellement peut le savoir, mais une machine ou une personne ne me connaissant pas ne peut pas le savoir. Ce sont les pages d'accueil de mon site personnel, de l'université où j'ai poursuivi mes études supérieures et de mon laboratoire actuel qui est rattaché à cette même université.

Ce bref petit exemple montre bien un des problèmes du Web actuel : les données qui y sont contenues sont très mal structurées. Malgré tout, un humain, après une lecture de ces pages, peut faire le lien entre ces trois pages, alors qu'une machine, en est incapable. L'un des buts d'avoir une meilleure structuration est de rendre la machine capable de comprendre ceci toute seule.

Un autre problème est la très grosse difficulté (voire l'impossibilité) de créer des applications « intelligentes », à cause du manque de données libres, et surtout structurées, disponibles sur le Web .

Mais actuellement, il y a plein d'applications qui existent et qui utilisent de multiples sources de données, même si elles ne sont pas structurées via des API Web. Oui, mais il existe quelques problèmes avec ces applications :

- la majorité des API Web sont propriétaires ;

- les applications sont basées sur un ensemble de sources de données fixes ;

- il est impossible de faire des liens entre ces sources de données, ou entre les données contenues dans ces différentes sources.

Les données structurées résolvent ce problème. Leur nom est dû aux liens entre ces données structurées

II - Fondations techniques

Les données liées sont basées sur un mélange de technologies du Web sémantique et du Web actuel qui sont :

- RDF, qui sera bientôt détaillé ;

- HTTP pour accéder aux données via le Web ;

- URI :

- des identifiants uniques pour les entités sur le Web,

- des pointeurs sur les données ;

- les hyperliens.

Je ne détaillerai pas ici ce que sont HTTP et les hyperliens.

II-A - RDF en général

RDF (Resource Description Framework), est un standard décrivant :

- des ressources, une ressource pouvant être n'importe quoi (personnes, lieux, animaux, documents, concepts, etc.) ;

- la description de ces ressources par des attributs et des relations ;

- le framework contenant un modèle de données, des langages et des syntaxes.

Il est vrai que RDF est principalement un modèle de données, puisque les données sont structurées par des triplets (sujet, prédicat, objet) :

- sujet : une ressource ;

- prédicat : une propriété ;

- objet : un littéral ou bien une ressource.

Par exemple :

- (Tour Eiffel, est créée, 1887) ;

- (Tour Eiffel, est située, Paris).

Avec ceci, on peut facilement en déduire que la structure créée par ce modèle est un graphe orienté, dont les sujets et les objets sont les nœuds et dont les prédicats sont les arêtes orientées. Voici un petit exemple décrivant les deux triplets ci-dessus :

Représentation via des graphes des triplets

Les formes ovales représentent des ressources et la forme rectangulaire représente un littéral.

II-B - URI (Uniform Resource Identifier)

Une URI étend le principe d'URL, puisqu'il est de coutume d'utiliser une URL pour identifier de façon unique un document Web. C'est d'ailleurs la principale différence entre les deux : une URI représente un objet unique (une personne, un lieu, un livre, etc.) et une URL un document Web. Comme exemple, on peut citer les trois façons de représenter une personne sur le Web :

- la personne elle-même : http://jplu.developpez.com/julien#JP ;

- le document RDF de cette personne : http://jplu.developpez.com/julien ;

- le document HTML de cette personne : http://jplu.developpez.com/julien.html.

Seule la dernière adresse est une URL, puisqu'elle représente un document Web. Ce qu'il faut aussi savoir, c'est que les sujets sont des URI, les propriétés sont des URI et les objets peuvent être des URI. Pour expliquer ceci, reprenons l'exemple de la Tour Eiffel. Pour représenter correctement ces triplets, il aurait fallu l'écrire de cette manière :

- (http://dbpedia.org/resource/Eiffel_Tower, http://dbpedia.org/ontology/location, http://dbpedia.org/resource/Paris) ;

- (http://dbpedia.org/resource/Eiffel_Tower, http://dbpedia.org/property/startDate, 1887).

DBPedia est la version données liées de Wikipédia. Ce qui donne le graphe suivant :

Premier graphe RDF

Maintenant que nous avons un beau graphe RDF, il reste encore une petite possibilité d'amélioration ou, plutôt, un raccourci permettant d'améliorer la lecture du graphe. Il consiste à raccourcir les URI des propriétés : on appelle cela des CURIE, pour Compact URI. C'est un principe extrêmement simple qui consiste à attribuer un préfixe aux URI des propriétés. Ici nous avons deux URI qui sont :

- http://dbpedia.org/ontology/ ;

- http://dbpedia.org/property/.

Ces deux URI sont appelées des « espaces de noms ». Nous allons donc attribuer un préfixe à ces deux URI qui sont « dbpedia-owl » et « dbpprop ». Ainsi nous pouvons écrire les propriétés de manière beaucoup plus courte comme « dbpedia-owl:location » et « dbpprop:startDate ». Chose moins commune, il est aussi possible d'attribuer une CURIE aux ressources de la même manière en attribuant un préfixe, ce qui permet de remplacer l'espace de noms « http://dbpedia.org/resource/ » par « dbpedia ». Ce qui donnera maintenant pour les triplets et le graphe :

- (dbpedia:Eiffel_Tower, dbpedia-owl:location, dbpedia:Paris) ;

- (dbpedia:Eiffel_Tower, dbpprop:startDate, 1887).

Utilisation des espaces de noms

II-C - Littéral

Les littéraux occupent toujours la place d'objet dans un triplet et sont représentés par une chaîne de caractères. Ces chaînes de caractères correspondent à ce que l'on appelle des « types de données » : en général, ces types de données sont les types de données XSD de XML Schema (xsd:date, xsd:anyURI, xsd:integer, etc.). Si aucun type de données n'est précisé, alors, par défaut, on considère que la donnée est du type « xsd:string ». L'autre petite chose avec les données non typées est qu'on peut leur attribuer une langue (@fr, @en, etc.). Voyons tout ceci avec un petit schéma :

Graphe RDF utilisant un littéral

II-D - Turtle

Turtle est une syntaxe RDF parfaitement lisible par un humain. Son écriture est très simple, puisque la principale règle à retenir est que chaque triplet est séparé par « . ». Il supporte bien entendu les CURIE via le terme « @prefix » qui associe un espace de noms à un préfixe. Voici un petit exemple de Turtle :

@prefix dbpedia-owl: <http://dbpedia.org/ontology/> .
@prefix dbpprop: <http://dbpedia.org/property/> .
@prefix dbpedia: <http://dbpedia.org/resource/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

dbpedia:Eiffel_Tower dbpedia-owl:location dbpedia:Paris
dbpedia:Eiffel_Tower dbpprop:startDate "1887"^^xsd:integer
dbpedia:Eiffel_Tower dbpprop:name "Tour Eiffel"@fr
dbpedia:Eiffel_Tower dbpprop:name "Eiffel Tower"@en

Pour davantage améliorer la lecture, on peut utiliser deux autres petits raccourcis :

@prefix dbpedia-owl: <http://dbpedia.org/ontology/> .
@prefix dbpprop: <http://dbpedia.org/property/> .
@prefix dbpedia: <http://dbpedia.org/resource/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

dbpedia:Eiffel_Tower dbpedia-owl:location dbpedia:Paris ;
dbpprop:startDate "1887"^^xsd:integer ;
dbpprop:name "Tour Eiffel"@fr, "Eiffel Tower"@en .

Si une ressource est décrite par plusieurs propriétés, il est possible de ne pas répéter à chaque fois cette ressource en début de chaque ligne, tout simplement en mettant un «; » à la place du « . ». Le second raccourci consiste à séparer les objets correspondant à une même propriété par une simple « , ».

Il existe d'autres syntaxes comme RDF/XML, N-Triples, N-Quads, et bien d'autres, mais je ne vous montrerai que du Turtle dans ce tutoriel pour la simple et bonne raison que c'est le format le plus simple à utiliser et surtout à lire.

II-E - Nœuds anonymes

Un nœud anonyme représente, dans un graphe RDF, une ressource anonyme ou, plus simplement, une URI qui n'existe pas ou qui n'a pas d'identification. En Turtle, on note un nœud anonyme en le préfixant de « _: » suivi d'un nom quelconque. Dans un graphe, un nœud anonyme est représenté par une forme ovale vide. Voici un petit exemple en Turtle et avec un graphe :

Graphe RDF avec un nœud anonyme

@prefix dbpprop: <http://dbpedia.org/property/> .
@prefix dbpedia: <http://dbpedia.org/resource/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.

dbpedia:Eiffel_Tower dbpprop:mainContractor _:GustaveEiffel .

_:GustaveEiffel rdf:type dbpedia-owl:Person ;
dbpprop:name "Gustave Eiffel" .

Petite nouveauté ici, la propriété « rdf:type ». Elle sert à décrire le type de la ressource associée. Ici, on décrit un nœud anonyme qui correspond à une personne. D'ailleurs, il est possible, en Turtle, de se passer d'écrire cette propriété avec un autre petit raccourci en la remplaçant par « a ». Ce qui donne ceci :

@prefix dbpprop: <http://dbpedia.org/property/> .
@prefix dbpedia: <http://dbpedia.org/resource/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>.

dbpedia:Eiffel_Tower dbpprop:mainContractor _:GustaveEiffel .

_:GustaveEiffel a dbpedia-owl:Person ;
dbpprop:name "Gustave Eiffel" .

III - RDFS et OWL

RDFS (Resources Description Framework Schema) et OWL (Web Ontology Language) sont deux standards du W3C pour la description respective des vocabulaires et des ontologies. À ce niveau, il n'est pas nécessaire de comprendre ces deux standards, vous devez juste savoir trouver de quels vocabulaires ou de quelles ontologies vous avez besoin pour bien décrire vos données, ainsi que de savoir lire leur documentation afin de bien utiliser les propriétés et les types de données qui peuvent vous intéresser. Un article sera spécialement dédié à cette activité.

IV - Conclusion

Vous savez maintenant comment modéliser vos données si vous voulez les publier sur le Web de données. N'oubliez pas que ce tutoriel est une brève introduction, il y manque beaucoup de choses. Il présente le minimum requis pour comprendre la façon d'organiser les données sur le Web de données. Si j'ai éveillé votre curiosité, vous trouverez deux autres tutoriels plus précis, un allant plus loin dans la définition du RDF couplée à un apprentissage de Jena et l'autre sur la création d'un fichier FOAF vous servant d'exemple pour commencer à écrire du RDF.

V - Remerciements

Merci à dourouc05metafire18, pour leurs propositions d'améliorations ainsi qu'à ced et Claude Leloup pour leur relecture orthographique.