« SPARQL Protocol and RDF Query Language/Requêtes de lecture » : différence entre les versions
Contenu supprimé Contenu ajouté
m Robot : Changement de type cosmétique |
Relecture |
||
Ligne 1 :
{{Chapitre
| idfaculté = informatique
Ligne 5 ⟶ 4 :
| titre_leçon = SPARQL
| numéro = 5
| niveau =
| précédent = [[../Le protocole SPARQL/]]
| suivant = [[../Requêtes d'écriture/]]
}}
L'ambition de SPARQL est d'offrir une interopérabilité, non seulement au niveau des services, comme avec les services Web, mais aussi au niveau des données, structurées ou non, qui sont disponible à travers l'Internet. Toutes ces données disponibles en ligne via SPARQL sont ce que l'on nomme le Web des données. Ce chapitre va nous permettre d'apprendre à interroger ce Web des données.
== Introduction ==
=== Commentaires ===
On peut écrire des commentaires dans les requêtes SPARQL. Les commentaires commencent par un '#' en début de ligne.
{{remarque|contenu=
}}
=== Préfixes ===
Dans le chapitre [[../Modèle de données RDF/]], nous avons vu comment écrire des IRIs
En SPARQL également, une requête peut contenir des IRIs relatives, les préfixes doivent être déclaré avant d'écrire une requête.▼
▲En SPARQL également, une requête peut contenir des IRIs
'''Exemple : déclaration de préfixes'''
<pre>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
Ligne 36 ⟶ 38 :
=== Abréviations ===
==== rdf:type ====
Vous
{{remarque|titre=Utilisation|contenu=
Le prédicat rdf:type sert à sélectionner l'objet en fonction de son type. C'est donc un prédicat qui est souvent utilisé au sein des requêtes, d'où cette abréviation.
}}
{{remarque|titre=Écriture|contenu=
Ligne 45 ⟶ 47 :
}}
==== Sujet ====
De plus, le sujet des triplets est souvent répété dans une requête pour écrire plusieurs conditions sur ce même sujet.
'''Exemple de triplets sans ";"'''
<pre>
:book1 dc:title "SPARQL Tutorial" .
Ligne 52 ⟶ 55 :
:book1 foaf:homepage <http://example.org/book/sparql> .
</pre>
'''Les mêmes triplets avec l'utilisation de ";"'''
<pre>
:book1 dc:title "SPARQL Tutorial" ;
Ligne 72 ⟶ 76 :
=== Les littéraux ===
Dans le chapitre [[../Modèle de données RDF/]], nous avons vu comment écrire un littéral dans le format RDF/Turtle. Dans une requête en SPARQL qui utilise également des triplets, comme dans le format RDF/Turtle, les objets peuvent également être des littéraux, en ayant la même syntaxe que Turtle.
'''Un littéral dans SPARQL s'écrit comme dans le format Turtle'''
<pre>
...
Ligne 86 ⟶ 90 :
Une variable dans une requête commence par le caractère "?" et ce caractère ne fait pas partie du nom de la variable.
Le nom d'une variable :
* ne doit pas commencer
* est sensible à la casse
* ne doit pas contenir d’espace
* doit être signifiant, car il sert de nom de colonne dans le résultat SPARQL 1.0
{{remarque|titre=Nom de colonne dans le résultat SPARQL 1.1|contenu=
Ligne 101 ⟶ 105 :
=== Structure d'une requête ===
Une requête SELECT se divise en 5 parties :
# Définition des préfixes si vous utilisez des IRIs
# Définition des résultats que vous désirez obtenir en sortie
# Définition des jeux de données sur lesquelles
# Définition des conditions
# Modificateurs de résultats (facultatif)
'''Structure d'une requête SELECT'''
<pre>
# Déclaration des préfixes
PREFIX foo: <...> #Pas d’espace entre Le nom du préfixe et Les deux points
PREFIX ...
Ligne 135 ⟶ 140 :
=== Définir le tableau de résultats ===
Nous avons vu dans le protocole SPARQL que les résultats prennent la forme d'un tableau. C'est dans la clause SELECT que les colonnes sont
Par exemple "'''SELECT ?name ?adress'''" affichera les lignes avec 2 champs : le nom et l'adresse.
Vous pouvez aussi écrire :
* "''' SELECT <big>*</big>''' " : permet d'afficher dans les résultats toutes les variables présentes dans la clause WHERE.
* "SELECT '''DISTINCT''' ?country" : permet de ne pas afficher les lignes qui ont un résultat identique.
* dans SPARQL 1.1, "SELECT ?country (100 * ?rate '''AS''' ?percent)" permettra de faire des calculs et renommer les champs, etc. (comme on peut le faire dans SQL)
=== Modifier les résultats ===
Pour le moment, on expliquera uniquement l'utilisation
==== ORDER BY ====
Ligne 155 ⟶ 160 :
}}
Vous constatez qu'en effet, c'est ordonné
{{exemple|titre=Exemple avec plusieurs colonnes|contenu=<pre>SELECT ?familyName ?givenName
WHERE {
Ligne 163 ⟶ 168 :
ORDER BY ?familyName ?givenName</pre>}}
Si vous voulez trier une colonne par ordre inverse, il vous suffit d'ajouter le mot-clef DESC devant le nom de la colonne concernée entre
{{exemple|titre=Exemple avec les noms triés par ordre inverse|contenu=<pre>SELECT ?familyName ?givenName
WHERE {
Ligne 171 ⟶ 176 :
ORDER BY DESC(?familyName) ?givenName </pre>}}
{{non}} ORDER BY permet de trier selon les colonnes récupérées uniquement. Ainsi,
{{exemple|titre=Requête non conforme car ?givenName n'est pas dans la clause SELECT|contenu=
<pre>SELECT ?familyName
Ligne 186 ⟶ 191 :
}}
{{remarque|titre=Utilisation|contenu=
N'hésitez pas à l'utiliser, car dans beaucoup de cas cela vous permettra d'obtenir des temps de
}}
==== OFFSET ====
OFFSET permet de n'afficher le résultat qu'à partir de la ligne indiquée.
{{exemple|titre=Exemple de requête qui ne donne le résultat qu'à partir de la cinquième ligne|contenu=
<pre>SELECT * WHERE {?x ?y ?z . } OFFSET 5 </pre>
}}
On peut
{{exemple|titre=Exemple
<pre>SELECT *
WHERE {?x ?y ?z . }
Ligne 201 ⟶ 206 :
LIMIT 10</pre>
}}
On a maintenant tout ce qu'il nous faut pour naviguer de page en page dans les résultats d'une
=== Définir les conditions ===
La plupart des requêtes SPARQL contiennent un ensemble de triplets appelé '''
Ce masque de graphe est composé d'un ensemble de triplets RDF,
Ce masque de graphe est comparé à des données RDF. Il y a alors deux réponses possibles :
Ligne 212 ⟶ 217 :
* Ce masque de graphe peut recouvrir un ou plusieurs sous-graphe des données RDF. Le résultat est alors équivalent à tous les sous-graphes ainsi découvert à l'aide de ce masque.
==== Écrire une
L'exemple ci-dessous montre une requête SPARQL pour trouver le titre d'un livre à partir du graphe des données RDF suivant, décrit au format Turtle. La requête se compose de deux parties :
#la clause SELECT identifie les variables à faire apparaître dans la réponse de cette requête,
#et la clause WHERE fournit le masque du graphe à appliquer sur le graphe des données RDF pour chercher cette réponse.
Le masque du graphe, dans cet exemple, est constitué d'un triplet avec une seule variable
Dans le graphe RDF/Turtle :
<pre><http://example.org/book/book1> <http://purl.org/dc/elements/1.1/title> "Tutoriel SPARQL
On applique la requête SPARQL :
Ligne 232 ⟶ 237 :
}</pre>
Cette requête
Résultat de la requête : {| class="wikitable"
! scope=col | titre
Ligne 239 ⟶ 246 :
|}
==== Obtenir plusieurs réponses ====
Le résultat d'une requête est un tableau où chaque ligne représente une solution différente, qui correspond à un sous-graphe trouvé à l'aide du masque de la requête. Il peut y avoir zéro, une ou plusieurs solutions à une requête.
Chaque ligne contient la liste des variables
Dans le graphe RDF/Turtle :
Ligne 289 ⟶ 296 :
}}
==== Littéral avec une balise de langue ====
Cependant,
Ainsi, la requête :
<pre>SELECT ?v WHERE { ?v ?p "cat" }</pre>
ne donne aucune réponse, car elle ne précise pas la
{| class="wikitable"
! scope=col | v
Ligne 314 ⟶ 321 :
==== Littéral avec un type numérique ====
'''Exemple: le littéral 42 est équivalent à l'écriture'''<br />
Ainsi, la requête :▼
▲Les entiers dans une requête SPARQL sont implicitement de type xsd:integer. <br />
▲Par exemple: 42 est équivalent à l'écriture de "42"^^<<nowiki>http://www.w3.org/2001/XMLSchema#integer</nowiki>>.
▲Ainsi la requête :
<pre>SELECT ?v WHERE { ?v ?p 42 }</pre>
Ligne 332 ⟶ 339 :
La base de données n'a pas besoin de comprendre ce que représente un type pour l'enregistrer ou pour le retrouver. La base de données va simplement comparer la forme lexicale et la référence IRI du type avec les données qu'elle contient.
Ainsi, la requête :
<pre>SELECT ?v WHERE { ?v ?p "abc"^^<http://example.org/datatype#specialDatatype> }</pre>
Ligne 343 ⟶ 350 :
=== Contraintes ===
Un masque de graphe produit une liste de
Nous allons décrire les principales utilisations de la clause FILTER.
Nous allons
<pre>@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix : <http://example.org/book/> .
Ligne 361 ⟶ 368 :
==== Littéral texte ====
regex() est une fonction qui permet d'utiliser une expression régulière pour vérifier une chaîne de caractères sans balise de langue.
<pre>PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?title
Ligne 377 ⟶ 384 :
|}
Pour appliquer cette contrainte à
Ainsi, la requête SPARQL devient :
<pre>PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?title
Ligne 395 ⟶ 402 :
|}
On peut également appliquer l'option "insensible à la casse" à notre expression régulière, avec le paramètre "i".
Par exemple, la requête SPARQL devient :
<pre>PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?title
Ligne 432 ⟶ 439 :
==== Les autres littéraux ====
La clause FILTER peut utiliser de nombreuses fonctions et des opérateurs booléens que nous étudierons dans une
=== Jointures ===
Les jointures s'expriment dans une requête SPARQL au sein de la clause WHERE.
==== Jointure basique ====
{{définition|titre=A . B|contenu=
Considérer A et B comme des graphes. "A.B" représente une
}}
Les points qui
==== Jointure à gauche ====
{{définition|titre=A OPTIONAL { B }|contenu=
Considérer A et B comme des graphes. "A OPTIONAL { B }
}}
Un masque peut contenir des clauses optionnelles qui
▲Un masque peut contenir des clauses optionnelles qui permet d'ajouter des solutions sans exclure les solutions qui existent sans nécessairement respecter ces clauses.
Utilisons le graphe RDF/Turtle suivant :
Ligne 481 ⟶ 488 :
|
|}
Pour "Bob", il n'y a pas de valeur pour la variable mbox, car la clause optionnelle n'est pas vérifiée pour "Bob" .
On peut mettre plusieurs clauses OPTIONAL dans une requête.
Par exemple, avec le graphe RDF/Turtle suivant :
<pre>@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix : <http://example.org/book/> .
Ligne 500 ⟶ 507 :
:book3 ns:price 28 .</pre>
Ainsi, la requête :
<pre>PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX ns: <http://example.org/ns#>
Ligne 528 ⟶ 535 :
Considérer A et B comme des graphes. "{ A } UNION { B } " représente une addition. Il rassemble les résultats de A et B sans condition.
}}
Il arrive que les données que l'on désire atteindre
▲Il arrive que les données que l'on désire atteindre, soient enregistrées à des moments différents et donc probablement avec des ontologies différentes, c'est-à-dire dans des graphes de structures différentes.
Par exemple, avec le graphe RDF/Turtle suivant :
<pre>@prefix : <http://example.org/book/> .
@prefix dc10: <http://purl.org/dc/elements/1.0/> .
Ligne 570 ⟶ 577 :
Seulement disponible pour SPARQL 1.1.
{{définition|titre=A MINUS { B }|contenu=
Considérer A et B comme des graphes. "A MINUS { B } " représente une
}}
Ligne 576 ⟶ 583 :
==== Interroger un point d'accès SPARQL ====
# Aller sur le site de DBpedia et trouver l’IRI au sein de [http://dbpedia.org/About DBpedia] qui correspond le mieux à la page
# Dans le formulaire du point d’accès http://dbpedia.org/sparql, écrire une requête pour afficher les prédicats et objets de cet IRI.
# Ecrire une requête pour afficher les sujets et prédicats de cet IRI.
{{solution|contenu=
1. En lisant la documentation de DBpedia, vous pouvez comprendre que les IRI des pages
'''<nowiki><http://dbpedia.org/resource/Doctor_Who> foaf:page <http://en.wikipedia.org/wiki/Doctor_Who></nowiki>'''
Vous pouvez remarquer que l'IRI du sujet du triplet ne fait pas référence à une langue. Pourtant, les prédicats et les objets de ce sujet ne font pas référence directement à toutes les pages « Doctor Who » dans tous les
Seul une petite partie de Wikipedia est utilisé par DBpedia et les pages des langues non anglaises sont très peu exploitées par DBpedia.▼
{{remarque|titre=Remarque|contenu=
▲
}}
La page http://fr.wikipedia.org/wiki/Doctor_Who ne figure pas directement dans DBpedia. La référence (IRI) la plus proche sera donc <http://dbpedia.org/resource/Doctor_Who>
Ligne 604 ⟶ 614 :
==== Faire une requête complexe ====
# Avec DBpedia, faire une requête pour trouver les
# Vous afficherez en résultat pour chaque film : le lien vers la page
{{solution|contenu=
Ligne 633 ⟶ 643 :
Vous pouvez voir le résultat de cette requête sur la page : http://en.sparql.pro/wiki/First_French_films
Vous pouvez
}}
== Requêtes ASK ==
=== Résultat ===
Une requête ASK est très proche d'une requête SELECT sauf qu'il n'y a que deux résultats
=== Structure d'une requête ===
Elle se divise en 3 parties :
# Définition des préfixes si vous utilisez des IRIs
# Définition des jeux de données sur
# Définition des conditions.
<pre>
# Déclaration des préfixes
PREFIX foo: <...> #Pas d’espace entre Le nom du préfixe et Les deux points
PREFIX ...
Ligne 663 ⟶ 672 :
}
</pre>
Une requête renvoie vrai si les conditions de la requête
Prenons les données Dans le graphe RDF/Turtle :
Ligne 681 ⟶ 690 :
Résultat de la requête: '''TRUE'''
<pre>PREFIX foaf: <http://xmlns.com/foaf/0.1/>
ASK WHERE { ?x foaf:name "Alice" ;
Ligne 707 ⟶ 716 :
}}
On peut également décrire plusieurs références sélectionnées en même temps
{{exemple|contenu=
<pre>PREFIX foaf: <http://xmlns.com/foaf/0.1/>
|