===== RDF ===== .. include:: common.inc .. only:: html .. notslides:: .. contents:: :local: :depth: 1 :backlinks: none Introduction ============ Vue d'ensemble ++++++++++++++ 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. 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 "Alain Mille"`` 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="Alain Mille", 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="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 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="« toto a pour tata titi et tutu »" bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; toto [ label=":toto" ] titi [ label=":titi" ] tutu [ label=":tutu" ] toto -> titi [ label=":tata" ] toto -> tutu [ label=":tata" ] alors : .. digraph:: monotonie_consequence margin=0; rankdir=LR; label="« toto a pour tata tutu »" bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; toto [ label=":toto" ] tutu [ label=":tutu" ] toto -> tutu [ label=":tata" ] Anonymisation ------------- On peut remplacer n'importe quel nœud par un nœud muet. Si : .. digraph:: anonymisation_premisse margin=0; rankdir=LR; label="« toto a pour tata titi et tutu »" bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; toto [ label=":toto" ] titi [ label=":titi" ] tutu [ label=":tutu" ] toto -> titi [ label=":tata" ] toto -> tutu [ label=":tata" ] alors : .. digraph:: anonymisation_consequence margin=0; rankdir=LR; label="« quelque chose est le tata de titi et tutu »" bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; toto [ label="" ] titi [ label=":titi" ] tutu [ label=":tutu" ] toto -> titi [ label=":tata" ] toto -> tutu [ label=":tata" ] Éclatement ---------- On peut « éclater » n'importe quel nœud muet. Si : .. digraph:: anonymisation_consequence margin=0; rankdir=LR; label="« quelque chose a pour tata titi et tutu »" bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; toto [ label="" ] titi [ label=":titi" ] tutu [ label=":tutu" ] toto -> titi [ label=":tata" ] toto -> tutu [ label=":tata" ] alors : .. digraph:: anonymisation_consequence margin=0; rankdir=LR; label="« quelque chose a pour tata titi, et\nquelque chose a pour tata tutu »"; bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; toto1 [ label="" ] toto2 [ label="" ] titi [ label=":titi" ] tutu [ label=":tutu" ] toto1 -> titi [ label=":tata" ] toto2 -> tutu [ label=":tata" ] 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="« toto a pour tata titi et tutu »" bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; toto [ label=":toto" ] titi [ label=":titi" ] tutu [ label=":tutu" ] toto -> titi [ label=":tata" ] toto -> tutu [ label=":tata" ] et si *tata* est une relation symétrique et transitive, alors (entre autre) : .. digraph:: monotonie_consequence margin=0; rankdir=LR; label="« titi a pour tata tutu »" bgcolor="#FFFFFF00"; node [ style=filled,color=black,fillcolor=white ]; titi [ label=":titi" ] tutu [ label=":tutu" ] titi -> tutu [ label=":tata" ] 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 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_ * en passe d'être recommandé par le W3C (en 2012) * 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:: 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'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": "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 IRIs là ou d'autres langages utilisent des termes « locaux ». Vocabulaires ============ Trouver un vocabulaire ++++++++++++++++++++++ * http://lov.okfn.org/ * http://swoogle.umbc.edu/ Quelques vocabulaires utiles ++++++++++++++++++++++++++++ .. only:: html .. contents:: :local: :backlinks: none Dublin Core ----------- Méta-données à propos des documents : * titre, résumé... * créateur, contributeur... * date de création, de dernière modification, versions... :description: http://lov.okfn.org/dataset/lov/details/vocabulary_dcterms.html :homepage: http://purl.org/dc/terms/ FOAF: Friend of a friend ------------------------ Description de personnes et de leur réseau social * Personne (nom, prénom, page weg, adresse e-mail, *connaissance*...) * Groupe (membres...) * Document (a pour sujet...), Image (représente...) :description: http://lov.okfn.org/dataset/lov/details/vocabulary_foaf.html :homepage: http://www.foaf-project.org/ SIOC: Semantically-Interlinked Online Communities ------------------------------------------------- Description de communautés en ligne * Forum, Blog, Wiki... * Article, Commentaire... :description: http://lov.okfn.org/dataset/lov/details/vocabulary_sioc.html :homepage: http://rdfs.org/sioc/spec/ WGS84: Word Geodetic System --------------------------- Coordonnées géographiques * SpatialThing, Point * lattitue, longitude, altitude :description: http://lov.okfn.org/dataset/lov/details/vocabulary_geo.html :homepage: (rdf) http://www.w3.org/2003/01/geo/wgs84_pos GoodRelations ------------- e-commerce * Produit et Service, Offre... * quantité, prix, garantie... :description: http://lov.okfn.org/dataset/lov/details/vocabulary_gr.html :homepage: http://purl.org/goodrelations/v1 Schema.org ---------- Vocabulaire généraliste * destiné à améliorer l'indexation des pages par les moteurs de recherche :description: http://lov.okfn.org/dataset/lov/details/vocabulary_schema.html :homepage: http://schema.org/