:tocdepth: 3 ===== RDF ===== Introduction ============ Des données aux données liées +++++++++++++++++++++++++++++ .. figure:: _static/data_model1.* Données classiques... .. nextslide:: :increment: .. figure:: _static/data_model2.* vues comme un graphe... (uniformité) .. nextslide:: :increment: .. figure:: _static/data_model3.* avec des IRIS. (désambiguation) .. note:: Ces trois diagrammes représentent la même information, même si le premier est beaucoup plus lisible pour l'humain que le troisième. RDF mets l'accent sur la lisibilité par les machines, on se focalise donc plus sur la structure du troisième schéma, mais cette complexité apparente est surtout une question de présentation. Vue d'ensemble ++++++++++++++ RDF 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. Syntaxe abstraite et sémantique =============================== Triplet +++++++ Toute information en RDF est représentée par un *triplet*, signifiant qu'une *chose* est en *relation* avec une autre. Exemple : Le laboratoire LIRIS (sujet) a pour membre (prédicat) Pierre-Antoine Champin (objet) Nommage ------- Les choses sont nommées par des IRIs : 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 que le mouvement `Linked Data `:ref: préconise une utilisation *particulière* des URIs dans laquelle les réprésentations doivent être cohérentes avec la sémantique. Cependant cette contrainte n'est pas inhérente à RDF. Préfixes ++++++++ Pour simplifier les **notations**, on définit des préfixes courts correspondant à des préfixes d'IRI : 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 muets +++++++++++ Enfin, RDF permet de parler d'une ressource sans connaître son IRI. Cela revient en logique à utiliser une variable quantifiée existentiellement. .. rst-class:: center ``(quelque chose) foaf:name "Stéphane Derrode"`` On parle alors de nœud *muet* (par analogie aux variables muettes). 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="Stéphane Derrode", shape=box ] am -> name [ label="foaf:name" ] .. _exemple_graphe: Exemple de graphe +++++++++++++++++ Un ensemble de triplets forme un graphe orienté étiqueté. .. 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="Stéphane Derrode", 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 Sémantique et inférences ++++++++++++++++++++++++ En informatique, la *sémantique* d'un langage est souvent définie par les *inférences* (déductions) qu'on peut faire avec ce langage. La structure du graphe permet de faire un minimum d'inférence, sans même avoir besoin de connaître le vocabulaire. .. hint:: Par analogie, de l'arbre XML ````, on peut « inférer » l'arbre ```` sans même connaître la sémantique des balises ou des attributs, car l'ordre des attributs n'est pas significatif. Monotonie --------- On peut déduire d'un graphe n'importe quel sous-graphe. Si : .. digraph:: monotonie_premisse margin=0; rankdir=LR; label="« riri a pour frère fifi et loulou »" bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; riri [ label=":riri" ] fifi [ label=":fifi" ] loulou [ label=":loulou" ] riri -> fifi [ label=":frère" ] riri -> loulou [ label=":frère" ] alors : .. digraph:: monotonie_consequence margin=0; rankdir=LR; label="« riri a pour frère loulou »" bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; riri [ label=":riri" ] loulou [ label=":loulou" ] riri -> loulou [ label=":frère" ] .. _owa: Hypothèse du monde ouvert (`OWA (Open World Assumption)`:abbr:) --------------------------------------------------------------- Un triplet qui n'est pas donné n'est *pas considéré comme faux*, mais comme inconnue (i.e. peut-être vrai, peut-être faux). On ne peut donc rien déduire de l'*absence* d'un triplet / d'une information. → dans le contexte du Web, l'information dont on dispose est toujours *partielle*. Conséquence de la monotonie et de l'`OWA (Open World Assumption)`:abbr: ----------------------------------------------------------------------- Exemple : Arthur peut-il voler ? Sachant que : .. rst-class:: build * Arthur est un animal * Arthur est un oiseau * Arthur est une autruche .. nextslide:: → la sémantique de RDF ne peut pas capturer la notion de valeur par défaut (e.g. «Les oiseaux volent (en général). Les autruches sont des oiseaux qui ne volent pas.») .. note:: Il existe des `systèmes de logique capable de gérer des valeurs par défaut`__. Mais pour RDF, le choix a été fait de se baser sur la logique classique. __ https://en.wikipedia.org/wiki/Default_logic Anonymisation ------------- On peut remplacer n'importe quel nœud par un nœud muet. Si : .. digraph:: anonymisation_premisse margin=0; rankdir=LR; label="« riri a pour frère fifi et loulou »" bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; riri [ label=":riri" ] fifi [ label=":fifi" ] loulou [ label=":loulou" ] riri -> fifi [ label=":frère" ] riri -> loulou [ label=":frère" ] alors : .. digraph:: anonymisation_consequence margin=0; rankdir=LR; label="« quelque chose a pour frère fifi et loulou »" bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; riri [ label="" ] fifi [ label=":fifi" ] loulou [ label=":loulou" ] riri -> fifi [ label=":frère" ] riri -> loulou [ label=":frère" ] Éclatement ---------- On peut « éclater » n'importe quel nœud muet. Si : .. digraph:: anonymisation_consequence margin=0; rankdir=LR; label="« quelque chose a pour frère fifi et loulou »" bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; riri [ label="" ] fifi [ label=":fifi" ] loulou [ label=":loulou" ] riri -> fifi [ label=":frère" ] riri -> loulou [ label=":frère" ] alors : .. digraph:: anonymisation_consequence margin=0; rankdir=LR; label="« quelque chose a pour frère fifi, et\nquelque chose a pour frère loulou »"; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; riri1 [ label="" ] riri2 [ label="" ] fifi [ label=":fifi" ] loulou [ label=":loulou" ] riri1 -> fifi [ label=":frère" ] riri2 -> loulou [ label=":frère" ] Inférences supplémentaires -------------------------- Bien sûr, des inférences supplémentaires peuvent être faites en prêtant une sémantique particulière aux IRIs utilisés dans le graphe. Par exemple, si : .. digraph:: monotonie_premisse margin=0; rankdir=LR; label="« riri a pour frère fifi et loulou »" bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; riri [ label=":riri" ] fifi [ label=":fifi" ] loulou [ label=":loulou" ] riri -> fifi [ label=":frère" ] riri -> loulou [ label=":frère" ] et si *frère* est connnue pour être une relation symétrique et transitive, alors (entre autres) : .. digraph:: monotonie_consequence margin=0; rankdir=LR; label="« fifi a pour frère loulou »" bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; fifi [ label=":fifi" ] loulou [ label=":loulou" ] fifi -> loulou [ label=":frère" ] Vocabulaire et sémantique additionelle -------------------------------------- On verra plus tard des langages (RDF-Schema, OWL) permettant de définit la sémantique de certains IRIs. Mais ces langages ne peuvent pas remettre en cause les inférences présentées ci-avant. .. hint:: 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. Syntaxes concrètes ================== .. note:: Dans cette section, on illustre chacune des syntaxes concrères avec l'exemple de graphe donné `plus haut `:ref:. RDF/XML +++++++ * syntaxe originale 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 Stéphane Derrode Pierre-Antoine Champin Turtle : Terse RDF Triple Language ++++++++++++++++++++++++++++++++++ * dérivée du langage N3_ * adoptée dans RDF 1.1 en 2014 * vise la simplicité et la compacité :Syntaxe: http://www.w3.org/TR/turtle/ :Valideur: http://www.rdfabout.com/demo/validator/ .. _N3: http://www.w3.org/DesignIssues/Notation3.html Turtle: exemple --------------- .. code-block:: sparql PREFIX foaf: PREFIX champin: liris:lab a foaf:Group ; foaf:member champin:pa, _:sd . champin:pa a foaf:Person ; foaf:name "Pierre-Antoine Champin" . _:sd a foaf:Person ; foaf:name "Stéphane Derrode" ; foaf:knows champin:pa . Turtle: exemple 2 ----------------- .. code-block:: sparql PREFIX foaf: PREFIX champin: liris:lab a foaf:Group ; foaf:member champin:pa, [ a foaf:Person ; foaf:name "Stéphane Derrode" ; foaf:knows champin:pa . ] . champin:pa a foaf:Person ; foaf:name "Pierre-Antoine Champin" . .. _rdfa: 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

Stéphane Derrode est membre du LIRIS. Il connaît Pierre-Antoine Champin, un autre membre de ce laboratoire.

.. _jsonld: 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'interpréter 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": "Stéphane Derrode", "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`_) * CSV (`CSV on the Web`_) * microformats (http://http://microformats.org/) * microdata (http://www.data-vocabulary.org/) * ← Prépondérance de la syntaxe abstraite. * cf. chapitre `publication`:doc: * Difficulté : faire correspondre des IRIs là où d'autres langages utilisent des termes « locaux ». .. _GRDDL: https://www.w3.org/TR/grddl/ .. _CSV on the Web: https://www.w3.org/TR/2016/NOTE-tabular-data-primer-20160225/ .. ifslides:: .. slide:: Chapitre suivant `sparql`:doc: Extensions ========== RDF* ++++ `RDF*`_ est une extension de RDF proposée par Olaf Hartig, dans laquelle les *triplets* sont des objets de premier niveau, qui peuvent à leur tour être sujet ou objet d'un triplet. .. digraph:: t_uri 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"; minlen=4; xlabel=":as \"Associate professor\"\n:since 2003-09-01" ]; .. code-block:: text liris:lab foaf:member champin:pa. <> :as "Associate professor"; :since "2003-09-01"^^xsd:dateTime. Cette possibilité d'annoter les arcs existe dans les bases de données graphes telle que Neo4J_. RDF* cherche à créer une convergence entre le Web Sémantique et ces bases de données. .. _Neo4J: https://neo4j.com/ .. _RDF*: https://blog.liu.se/olafhartig/2019/01/10/position-statement-rdf-star-and-sparql-star/