====================================== RDF : Resource Description Framework ====================================== .. include:: common.inc .. only:: html .. ifnotslides:: .. contents:: :local: :depth: 1 .. !!!!! BEGIN COPY-PASTE from ../../lod/source/web_de_donnees.rst Motivation et historique ======================== Le Web vu par Tim Berners-Lee (1989) ++++++++++++++++++++++++++++++++++++ .. rst-class:: center « Vague, but exciting » .. figure:: _static/rdf/tbl-proposal.png :width: 18em source: http://info.cern.ch/images/proposal.gif Web de ressources +++++++++++++++++ Le web est constitué de **ressources**: * chaque ressource est identifiée par un URI (*Uniform Resource Identifier*), *e.g.*: * http://meteo.example.com/lyon * http://meteo.example.com/ici * http://commerce.example.com/commande/192837 NB: ressource ≠ fichier ! * chaque ressource a un *état* qui peut varier dans le temps * cet état n'est jamais manipulé directement, mais toujours à travers des **représentations** Ressources et représentations ----------------------------- * À chaque état d'une ressource peuvent correspondre une *ou plusieurs* représentation(s) (négociation de contenu, contexte) * Toute interaction avec une ressource se fait *via* des représentation : consultation, modification, création ======================= ============================= représentation : utilisable par : ======================= ============================= texte humains, moteurs de recherche médias (image, son...) *surtout* humains **données structurées** machines ======================= ============================= De HTML à XML +++++++++++++ XML (eXtensible Markup Language) a été recommandé par le W3C en 1998. L'objectif était de pallier la sémantique « faible » de HTML. .. code-block:: html Pierre-Antoine Champin (Maître de conférences) .. code-block:: xml Pierre-Antoine Champin Maître de conférences XML et la sémantique ++++++++++++++++++++ On a dit tout et son contraire l'apport sémantique de XML : * XML a *plus* de sémantique que HTML, * XML a *moins* de sémantique que HTML, Les deux ont leur part de vérité. XML a *plus* de sémantique que HTML... -------------------------------------- \... dans le sens ou il est extensible : on eut donc exprimer des choses que HTML ne permet pas d'exprimer (e.g.````). * Importance des *espaces de noms*, qui évitent les collisions de noms et fournissent ainsi une sémantique « structuraliste » (i.e. par différentiation). .. code-block:: xml Pierre-Antoine Champin Maître de conférence XML a *moins* de sémantique que HTML... --------------------------------------- \... dans la mesure ou : * un navigateur standard ne saura pas quoi faire de la balise ```` ou de la balise ``<ονομα>``, * tout au plus il saura les afficher s'il possède une feuille de style, * tandis qu'il connaît la sémantique de la balise ````\ : elle dénote un texte à mettre en évidence *selon les moyens dont il dispose*, par exemple : * en le mettant en italique (standard) * en le mettant en gras (police déjà en italique) * en le mettant en couleurs (police sans italique, terminal) * en marquant une pause (synthèse vocale) XML : apports et limitations ---------------------------- Le surplus de sémantique promis par XML n'est donc pas « magique » : il suppose * de créer de nouveaux langages basés sur XML (DTD, schémas), * d'écrire les logiciels qui *interpréteront* ces nouveaux langages, → chaque langage reste relativement idiosyncratique. XML : apports et limitations (suite) ------------------------------------ L'apport est donc essentiellement technique : la base commune de XML permet de *factoriser* les efforts de développement et d'apprentissage : * analyseurs syntaxiques (*parsers*), * langages de schéma (DTD, XML-Schema, Relax-NG...), * langages de requêtes (XPath, XQuery), * langages de transformation (XSL-T), * méthode de signature cryptographique (xmldsig), * methode de compression (EXI)... De XML à RDF ++++++++++++ * Le modèle sous-jacent de la syntaxe XML est un arbre (*XML Infoset*), ce qui n'est pas adapté à la structure décentralisée du Web. * L'objectif du *Resource Description Framework* (RDF), recommandé par le W3C en 1999, vise à munir le Web d'un modèle de données plus adapaté, ayant une structure de *graphe*. * L'objectif est de construire le *Semantic Web* : un web dans lequel les machines ont (enfin) accès à la sémantique des données. * Recommandation un peu hâtive, présentant quelques défauts importants (notamment l'absence de sémantique formelle). → faible adoption de RDF De RDF à RDF ++++++++++++ * En 2004, le W3C publie un nouvel ensemble de recommandations sur RDF pour remplacer celles de 1999. * Pour des raisons de compatibilité avec l'existant, certains aspects sont conservés malgré les débats qu'ils suscitent, mais les défauts considérés comme majeurs sont corrigés. * Après cet échec relatif, l'appellation *Semantic Web* tombe peu a peu en disgrâce. Certains défenseurs de RDF parlent plus modestement de *Data Web*, puis de *Web of Linked Data* (2006). .. figure:: _static/rdf/rdf_w3c.* :width: 15% source: http://www.w3.org/RDF/icons/ .. !!!!! END COPY-PASTE from ../../lod/source/web_de_donnees.rst Syntaxe(s) et sémantique ------------------------ RDF 2004 définit : * une syntaxe abstraite (modèle de donnée), * une sémantique pour *interpréter* la syntaxe abstraite, * plusieurs syntaxes concrètes pour représenter/échanger la syntaxe abstraite. .. !!!!! BEGIN COPY-PASTE from ../../lod/source/rdf.rst Syntaxe abstraite ================= Triplet +++++++ Toute information en RDF est représentée par un *triplet*\ : Le laboratoire LIRIS (sujet) a pour membre (prédicat) Pierre-Antoine Champin (objet) Nommage ------- Les choses sont nommées par des URIs : http://liris.cnrs.fr/#lab http://xmlns.com/foaf/0.1/member http://champin.net/#pa On peut représenter ceci graphiquement : .. digraph:: t_uri margin=0; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; liris [ label="http://liris.cnrs.fr/#lab" ]; pa [ label="http://champin.net/#pa" ]; liris -> pa [ label="http://xmlns.com/foaf/0.1/member" ]; Remarque ```````` Dans RDF, les URIs ne sont utilisés que comme des **identifiants opaques**. Les représentations qui sont éventuellement accessibles via ces URIs (par *déréférencement*) n'ont aucune influence sur leur sémantique. Notons cependant que le mouvement `Linked data `:doc: préconise une utilisation *particulière* des URIs dans laquelle les réprésentations doivent être cohérentes avec la sémantique. Préfixes ++++++++ Pour simplifier les **notations**, on définit des préfixes courts correspondant à des préfixes d'URI : liris: → ``http://liris.cnrs.fr/#`` foaf: → ``http://xmlns.com/foaf/0.1/`` champin: → ``http://champin.net/#`` On utilise ensuite des *noms préfixés* : .. rst-class:: center liris:lab   foaf:member   champin:pa et également sous forme graphique : .. digraph:: t_prefixed margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; liris [ label="liris:lab" ] pa [ label="champin:pa" ] liris -> pa [ label="foaf:member" ] Littéraux +++++++++ On peut également lier une ressource à une *donnée typée* (chaîne de caractère, entier, réel...), nommée un littéral. .. rst-class:: center champin:pa   foaf:name   "Pierre-Antoine Champin" Traditionnellement, on représente les littéraux par des nœuds rectangulaires : .. digraph:: t_literal margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; pa [ label="champin:pa" ] name [ label="Pierre-Antoine Champin", shape=box ] pa -> name [ label="foaf:name" ] Nœuds vierges +++++++++++++ Enfin, RDF permet de parler d'une ressource sans connaître son URI. Cela revient en logique à utiliser une variable quantifiée existentiellement. .. rst-class:: center (quelque chose)   foaf:name   "Alain Mille" Graphiquement, on représente cette ressource par un nœud vierge (*blank node*). .. digraph:: t_bnode margin=0; rankdir=LR; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; am [ label="" ] name [ label="Alain Mille", shape=box ] am -> name [ label="foaf:name" ] Exemple de graphe +++++++++++++++++ .. digraph:: graphe1 margin=0; foaf_person [ label="foaf:Person" ] foaf_group [ label="foaf:Group" ] liris [ label="liris:lab" ] pa [ label="champin:pa" ] am [ label="" ] pa_name [ label="Pierre-Antoine Champin", shape=box ] am_name [ label="Alain Mille", shape=box ] liris -> foaf_group [ label="rdf:type" ] pa -> foaf_person [ label="rdf:type" ] am -> foaf_person [ label="rdf:type" ] liris -> pa [ label="foaf:member" ] liris -> am [ label="foaf:member" ] pa -> pa_name [ label="foaf:name" ] am -> am_name [ label="foaf:name" ] am -> pa [ label="foaf:knows" ] .. !!!!! END COPY-PASTE from ../../lod/source/rdf.rst .. TODO il faut rendre le chapitre sémantique plus formel Sémantique ========== Principe général ++++++++++++++++ RDF est muni d'une sémantique en théorie des modèles, ou sémantique dénotationnelle : * chaque nœud du graphe dénote une ressource (NB : les littéraux sont considéré comme des ressources particulières), * chaque ressource peut être associée à une relation binaire entre ressources, * chaque arc signifie que les ressources dénotés par les nœuds vérifient la relation associée à (la ressource dénotée par) l'URI de l'arc Inférences ++++++++++ De cette sémantique découlent les inférences que l'ont peut faire sur un graphe RDF (indépendamment de la sémantique des URIs utilisés dans ce graphe). * Par analogie, les seules inférences que l'on puisse faire sur un arbre XML indépendamment des termes utilisés sont de changer l'ordre des attributs, et de changer les préfixes (si l'on considère les espaces de noms). Monotonie --------- Étant donné un graphe, tout sous-graphe en est une conséquence. .. digraph:: inference_monotonie margin=0; foaf_person [ label="foaf:Person" ] liris [ label="liris:lab" ] pa [ label="champin:pa" ] pa_name [ label="Pierre-Antoine Champin", shape=box ] pa -> foaf_person [ label="rdf:type" ] liris -> pa [ label="foaf:member" ] pa -> pa_name [ label="foaf:name" ] Monotonie (suite) ----------------- Aucune conclusion que l'on peut tirer d'un graphe RDF ne peut pas être contredite par des informations présentes ailleurs sur le Web. → On est donc toujours en droit de *fusionner* des graphes RDF, même provenant de sources indépendantes Anonymisation ------------- Tout nœud peut être remplacé par un nœud vierge : .. digraph:: inference_anonymisation margin=0; foaf_person [ label="foaf:Person" ] liris [ label="liris:lab" ] pa [ label="" ] pa_name [ label="Pierre-Antoine Champin", shape=box ] pa -> foaf_person [ label="rdf:type" ] liris -> pa [ label="foaf:member" ] pa -> pa_name [ label="foaf:name" ] (rappel : les nœuds vierges s'interpètent comme des variables quantifiées existentiellement) Éclatement ---------- Tout nœud vierge peut être éclaté en plusieurs nœuds vierges : .. digraph:: inference_eclatement margin=0; foaf_person [ label="foaf:Person" ] liris [ label="liris:lab" ] pa1 [ label="" ] pa2 [ label="" ] pa_name [ label="Pierre-Antoine Champin", shape=box ] invis [ color="transparent", label="" ] liris -> pa1 [ label="foaf:member" ] pa1 -> foaf_person [ label="rdf:type" ] invis -> pa2 [ color="transparent" ] pa2 -> pa_name [ label="foaf:name" ] .. liris [ label="liris:lab" ] pa1 [ label="" ] pa2 [ label="" ] # pa3 [ label="" ] pa_name [ label="Pierre-Antoine Champin", shape=box ] yp [ label="amille:me" ] invis [ color="transparent", label="" ] invis -> pa2 [ color="transparent" ] liris -> pa1 [ label="foaf:member" ] pa1 -> pa_name [ label="foaf:name" ] yp -> pa2 [ label="foaf:knows" ] Sémantique additionelle +++++++++++++++++++++++ Bien sûr, des inférences supplémentaires peuvent être faites en prêtant une sémantique particulière aux URIs utilisés dans le graphe, * par exemple en décidant qu'une relation binaire est symétrique ou transtitive. Cependant, cette sémantique devra respecter la sémantique dénotationnelle de RDF ; notamment, les inférences supplémentaires ne devront *pas* contredire les inférences précédente (monotonie) : * sans quoi les outils ne connaissant pas cette sémantique particulière tireront des conclusions erronées. Sémantique additionelle (suite) ------------------------------- On verra plus tard des langages (RDF-Schema, OWL) permettant de définit la sémantique de certains URIs. Analogie : lorsqu'on définit un format XML, on prête une sémantique particulière aux éléments et attributs de ce format, mais on ne peut *pas* prêter de sémantique à l'ordre des attributs ; * sémantiquement, ce ne serait plus du XML, * pragmatiquement, les outils standards (analyseur syntaxique, sérialiseurs) ne permettraient pas de contrôler cet aspect de la syntaxe. .. !!!!! END COPY-PASTE from ../../lod/source/rdf.rst Syntaxes concrètes ================== RDF/XML +++++++ * première syntaxe recommandée par le W3C (1999) * basée sur XML * relativement complexe et verbeuse :Syntaxe: http://www.w3.org/TR/rdf-syntax-grammar/ :Valideur: http://www.w3.org/RDF/Validator/ RDF/XML : exemple ----------------- .. code-block:: xml Alain Mille Pierre-Antoine Champin Turtle : Terse RDF Triple Language ++++++++++++++++++++++++++++++++++ * dérivée du langage N3_ * recommandé par le W3C en 2014 * vise la simplicité et la compacité :Syntaxe: http://www.w3.org/TR/turtle/ .. _N3: http://www.w3.org/DesignIssues/Notation3.html Turtle: exemple --------------- .. code-block:: turtle @prefix foaf: . @prefix champin: . liris:lab a foaf:Group ; foaf:member champin:pa, _:am . champin:pa a foaf:Person ; foaf:name "Pierre-Antoine Champin" . _:am a foaf:Person ; foaf:name "Alain Mille" ; foaf:knows champin:pa . Turtle: exemple 2 ----------------- .. code-block:: turtle @prefix foaf: . @prefix champin: . liris:lab a foaf:Group ; foaf:member champin:pa, [ a foaf:Person ; foaf:name "Alain Mille" ; foaf:knows champin:pa . ] . champin:pa a foaf:Person ; foaf:name "Pierre-Antoine Champin" . RDFa : RDF in attributes ++++++++++++++++++++++++ RDFa est une utilisation d'attributs (existants ou supplémentaires) de (X)HTML pour y inclure du RDF (à la manière des micro-formats) : * facilite la migration de contenus HTML vers RDF * facilite la maintenance en cohérence de la version HTML et des données RDF (*DRY : Don't Repeat Yourself*)   :Syntaxe: http://www.w3.org/TR/rdfa-primer/ :Valideur: http://check.rdfa.info/ :Distiller: http://www.w3.org/2012/pyRdfa/ RDFa : exemple -------------- .. code-block :: html

Alain Mille est membre du LIRIS. Il connaît Pierre-Antoine Champin, un autre membre de ce laboratoire.

JSON-LD +++++++ * Rappel : JSON est un langage d'échange de données, basé sur Javascript, et très utilisé en développement web. * JSON-LD (JSON Linked Data) permet d'interpreter une structure JSON comme du RDF, * grâce à un *contexte* (implicite ou explicite). * Objectif : faciliter l'adoption de RDF (syntaxe abstraite) auprès des développeurs d'applications web. :Syntaxe: http://www.w3.org/TR/json-ld-syntax/ :Valideur: http://json-ld.org/playground/ JSON-LD: exemple ---------------- .. code-block :: javascript { "@context" : { /* ... */ }, "@id": "http://liris.cnrs.fr/#lab", "@type": "Group", "member": [ { "@id": "http://champin.net/#pa", "@type": "Person", "name": "Pierre-Antoine Champin" }, { "@type": "Person", "name": "Alain Mille", "knows": "http://champin.net/#pa" } ] } Autres syntaxes +++++++++++++++ * Comme l'illustrent RDFa et JSON-LD, tout langage peut être interprété comme du RDF: * dialectes en XML (GRDDL) * microformats (http://http://microformats.org/) * microdata (http://www.data-vocabulary.org/) * ← Prépondérance de la syntaxe abstraite. * Difficulté : faire correspondre des URIs là ou d'autres langages utilisent des termes « locaux ». Dataset et requêtes =================== Dataset +++++++ Lorsqu'on stocke des données en RDF, il est parfois nécessaire de distinguer plusieurs graphes. Un *dataset* RDF est constitué : * d'un graphe par défaut, * d'un ensemble de couples ⚠ aucune relation sémantique imposée entre l'URI et le graphe SPARQL ++++++ SPARQL est un ensemble de recommandations définissant : * un langage d'interrogation d'un *dataset* (SPARQL) * un langage de mise à jour d'un *dataset* (SPARQL-update ou SPARUL) * un protocole REST-like pour envoyer des requêtes SPARQL à un *dataset* :Référence: http://w3.org/sparql :Tutoriel: http://jena.sourceforge.net/ARQ/Tutorial/ SPARQL : exemple 1 ------------------ « Trouver les membres du LIRIS (URI et nom) que je connaît ». .. code-block:: sparql PREFIX foaf: #... SELECT ?p ?n WHERE { champin:pa foaf:knows ?p . liris:lab foaf:member ?p . ?p foaf:name ?n . } SPARQL : exemple 2 ------------------ « Construire l'union des graphes créés par Pierre-Antoine Champin ». .. code-block:: sparql PREFIX dct: CONSTRUCT { ?s ?p ?o } WHERE { ?g dct:creator . GRAPH ?g { ?s ?p ?o } } ⚠ pré-supposition sur la sémantique des URIs des graphes SPARUL : exemple ---------------- « Remplacer ``foaf:firstName`` par ``foaf:givenName`` pour tous les membres du LIRIS ». .. code-block:: sparql PREFIX foaf: DELETE { ?m foaf:firstName ?n . } INSERT { ?m foaf:givenName ?n . } WHERE { foaf:member ?m . ?m foaf:givenName ?n . }