Skip to content

Sparql : 7e pas (du triplet au graphe)

05/07/2012

Du motif de triplet au motif de graphe

J’avais jusque là évité l’expression « graphe RDF » (certains en ont sûrement été choqués !). Mais il faut s’y mettre pour produire des requêtes un peu plus complexes.

De même qu’un fichier XML, qui pour vous s’apparente à un fichier texte, est pour la machine un arbre dans lequel un processeur XSL circule en allant d’un embranchement à l’autre — de même, un fichier RDF est un graphe dans lequel le processeur SPARQL circule en allant d’un noeud à l’autre.

Network Graph of Bookmark Tags (http://www.flickr.com/photos/aaronpk/5352508316/) / Aaron Parecki / CC BY 2.0

Reprenons la notice d’autorité Romain Gary sur IdRef.

La requête déjà utilisée permettait de sortir un tableau à deux colonne associant l’identifiant de la notice (son PPN, sous forme d’une URI) avec les formes rejetées.

Mais il est souvent plus intéressant de mettre côte à côte, par exemple :

  • la forme retenue
  • chaque forme rejetée

Or cette association n’est pas directement exprimée dans les triplets trouvés : la forme retenue est associée au PPN, et chaque forme retenue est également associée au PPN. Donc il faut trouver comment utiliser cet élément commun, le PPN, pour associer les 2 qui nous intéressent là.

PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT ?Notice ?formeretenue ?formerejetee
FROM <http://www.idref.fr/026882949.rdf&gt;
WHERE
{
?Notice skos:prefLabel ?formeretenue.
?Notice skos:altLabel ?formerejetee.
}

Ligne WHERE : identifier les triplets ayant le même sujet, avec un verbe « prefLabel » et un verbe « altLabel ».
Ligne SELECT : produire comme résultat un tableau à 3 colonnes :

  • le sujet de ces 2 triplets (en l’occurrence le PPN)
  • la forme retenue
  • chacune des formes rejetées

Je rappelle encore une fois que le fait de ne garder que la forme retenue et la forme rejetée, et laisser de côté les autres triplets présents dans mon graphe, est réalisé par l’utilisation des « verbes » prefLabel et altLabel, et nullement par la manière dont j’ai nommé mes variables.

La requête ci-dessous fonctionne tout aussi bien et produit exactement le même résultat :

PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT ?Personne ?toto1 ?toto2
FROM <http://www.idref.fr/026882949.rdf&gt;
WHERE
{
?Personne skos:prefLabel ?toto1.
?Personne skos:altLabel ?toto2.
}

Mais, évidemment, si je reviens dessus 2 mois plus tard, j’aurai plus de mal à comprendre ce que j’ai voulu faire grâce à ça !

Requête alternative

Ci-dessus, la requête permet d’éditer une liste d’équivalences.Ce peut être utile quand on cherche à avoir des synonymes, ou des correspondances entre une série d’identifiants — et une autre série (ISBN – PPN, par exemple)

Mais on peut aussi être dans la situation suivante : connaître un libellé, et se demander s’il correspond à la forme rejetée dont la forme retenue serait à trouver. Autrement dit : je veux déterminer s’il y a une forme retenue pour « Kacew, Roman ».

  • L’idée, c’est de récupérer en résultat la forme retenue (éventuellement l’identifiant). Donc dans la ligne SELECT, j’aurai ?formeretenue.
  • Je cherche à conserver uniquement le(s) triplet(s) correspondant à ces 2 conditions:
    1. le « verbe » (il faut que je m’habitue à dire prédicat) est « skos:altLabel »
    2. l’objet est « Kacew, Roman »
  • Je veux faire la jointure avec un triplet ayant le même sujet que celui décrit ci-dessus, pour récupérer la forme retenue identifiable par son prédicat skos:prefLabel

Ce qui me donne :

PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT ?formeretenue
FROM <http://www.idref.fr/026882949.rdf>
WHERE
{
?Notice skos:prefLabel ?formeretenue.
?Notice skos:altLabel "Kacew, Roman".
}

Et ça marche🙂

Place au prof

Et je laisse la parole aux commentaires (traduits) du tutoriel suivi depuis le début. Vous le trouverez peut-être plus clair que moi.

Ce qui change avec ce nouveau modèle de requête, c’est qu’il contient plusieurs motifs de triplets. Une collection de motifs de triplets est un motif de graphe (graph pattern).

La traduction de « pattern » par « motif » est reprise de cette traduction des recommandations du W3C concernant SPARQL. Voici la définition d’un motif de triplet qu’on y trouve : « Les motifs de triplet sont comme les triplets RDF sauf que chaque sujet, prédicat et objet peut être une variable. Un motif de graphe élémentaire correspond à un sous-graphe des données RDF lorsque les termes RDF (RDF terms) de ce sous-graphe peuvent être substitués par les variables et que le résultat est un graphe RDF équivalent au sous-graphe. »

Dans la première requête indiquée ci-dessus, le motif de graphe consiste en 2 motif de triplets, chacun devant correspondre aux propriétés spécifiées : forme retenue, forme rejetée.

Le point essentiel est qu’à l’intérieur d’un motif de graphe, une même variable doit avoir toujours la même valeur, où qu’elle se trouve (donc que ce soit comme objet ou comme sujet — voire comme prédicat). En d’autres termes : cette requête va trouver n’importe quelle ressource qui a les 2 propriétés spécifiées.

Une ressource qui ne contiendrait que l’une des deux propriétés ne serait pas incluse dans les résultats parce que ne correspondant pas à tous les motifs de triplets. [Il est possible de préciser qu’un motif de triplet n’est qu’optionnel, on verra ça plus tard]

L’autre point intéressant ici est qu’il y a un motif de triplet pour chacune des variables attendues dans le jeu de résultats. Avec SPARQL, on ne peut pas SELECTionner une variable si elle n’est pas présente dans le motif de graphe. Cela peut sembler curieux à ceux qui sont habitués au SQL (en SQL, on peut parfaitement récupérer des variables non exprimées dans la clause WHERE). Mais un processeur SPARQL n’a pas de dictionnaire des données lui permettant de connaître par avance toutes les propriétés d’une ressource. Donc les variables doivent être liées à un terme RDF via un motif de triplet pour permettre au processeur d’extraire ce terme du graphe.

Petit exercice

Grâce à la requête

PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT ?Notice ?formeretenue ?formerejetee
FROM <http://www.idref.fr/026882949.rdf&gt;
WHERE
{
?Notice skos:prefLabel ?formeretenue.
?Notice skos:altLabel ?formerejetee.
}

On peut mettre face à face la forme retenue (Romain Gary) et chaque forme rejetée (Emile Ajar, Shatan Bogat, Roman Kacew, etc.).

Mais j’aimerais ajouter une colonne entre les deux, qui rende compte du lien entre les deux colonnes. En substance, je veux voir apparaître la mention « Forme rejetée : »

Pendant ma requête, j’ai besoin au passage d’aller récupérer le libellé correspondant à skos:altLabel. Il faut donc que ma requête aille interroger SKOS (décrit derrière l’URL http://www.w3.org/2004/02/skos/core#) pour retrouver le triplet qui attribue un label à skos:altLabel.

Je vous aide :

  • je dois retrouver les triplets correspondant à ces conditions :
    skos:altLabel ?verbe ?complement
  • dans l’ensemble des triplets trouvés, identifié celui qui attribue un label « en clair » à skos:altLabel
  • Bref, j’intègre dans mon graphe l’existence d’un graphe lié : SKOS

Au final, je veux ça :

One Comment

Trackbacks

  1. Sparql : 7e pas (du triplet au graphe) | Ebooksinfo | Scoop.it

Les commentaires sont fermés.

%d blogueurs aiment cette page :