Lisez-moi S.V.P. 

W3C

Langage d'interrogation SPARQL pour RDF

Recommandation du W3C du 15 janvier 2008

Cette version :
http://www.w3.org/TR/2008/REC-rdf-sparql-query-20080115/
Dernière version :
http://www.w3.org/TR/rdf-sparql-query/
Version précédente :
http://www.w3.org/TR/2007/PR-rdf-sparql-query-20071112/
Rédacteurs :
Eric Prud'hommeaux, W3C <eric@w3.org>
Andy Seaborne, Hewlett-Packard Laboratories, Bristol <andy.seaborne@hp.com>

Veuillez consulter la page des errata de ce document, laquelle peut contenir des corrections normatives.

Cf. aussi d'éventuelles traductions.


Résumé

RDF est un format de données de graphe orienté et étiqueté pour représenter des informations dans le Web. Cette spécification définit la syntaxe et la sémantique du langage d'interrogation SPARQL pour RDF. SPARQL peut être utilisé pour exprimer des interrogations à travers diverses sources de données, que les données soient stockées nativement comme RDF ou vues comme du RDF via un logiciel médiateur (middleware). SPARQL est capable de rechercher des motifs de graphe (graph patterns) obligatoires et optionnels ainsi que leurs conjonctions et leurs disjonctions. SPARQL gère également le test extensible des valeurs et la contrainte des interrogations par un graphe RDF source. Les résultats des interrogations SPARQL peuvent être des ensembles de résultats ou des graphes RDF.

Statut de ce document

Cette section décrit le statut de ce document au moment de sa publication. D'autres documents peuvent venir le remplacer. On peut trouver une liste des publications actuelles du W3C et la dernière version de ce rapport technique dans l'index des rapports techniques du W3C à http://www.w3.org/TR/.

Ceci est une recommandation du W3C.

Ce document a été examiné par des membres du W3C, par des développeurs de logiciels, et par d'autres groupes du W3C et des tiers intéressés, et a été approuvé par le Directeur comme recommandation du W3C. C'est un document stable qui peut être utilisé comme document de référence ou cité par un autre document. Le rôle du W3C en produisant la recommandation est d'attirer l'attention sur la spécification et d'en promouvoir le large déploiement. Cela participe à la fonctionnalité et à l'interopérabilité du Web.

Les commentaires à propos de ce document sont à envoyer à public-rdf-dawg-comments@w3.org, une liste de diffusion avec des archives publiques. Les questions et commentaires à propos de SPARQL non liés à cette spécification, y compris les extensions et les caractéristiques, peuvent être débattus sur la liste de diffusion public-sparql-dev@w3.org (archives publiques).

Ce document a été produit par le groupe de travail RDF Data Access, sous l'égide de l'activité Semantic Web du W3C. La première publication de ce document en tant que version préliminaire a eu lieu le 12 octobre 2004, et le groupe de travail a traité beaucoup de commentaires reçus et de problèmes depuis. Il y a eu deux changements répertoriés depuis la recommandation proposée de novembre 2007.

Le rapport de mise en œuvre du langage d'interrogation SPARQL pour RDF du groupe de travail démontre que les objectifs de mises en œuvre interopérables fixés dans la recommandation candidate d'avril 2006 ont été atteints.

Le groupe de travail Data Access a ajourné 12 questions, dont les fonctions agrégées et un langage de mise à jour.

Ce document a été produit par un groupe agissant sous couvert de la politique de brevets du W3C du 5 février 2004. Le W3C tient une liste publique des divulgations de brevets effectuées en rapport avec les produits livrables du groupe ; cette page contient également des instructions pour divulguer un brevet. Quiconque a connaissance véritable d'un brevet qu'il estime contenir des revendications essentielles doit divulguer cette information conformément à la section 6 de la politique de brevets du W3C.


Table des matières

Annexes


1 Introduction

RDF est un format de données de graphe orienté et étiqueté pour représenter des informations dans le Web. RDF est souvent utilisé pour représenter, entre autres choses, des informations personnelles, des réseaux sociaux, des métadonnées à propos d'artefacts numériques ainsi que fournir un moyen d'intégrer des sources d'information disparates. Cette spécification définit la syntaxe et la sémantique du langage d'interrogation SPARQL pour RDF.

Le langage d'interrogation SPARQL pour RDF est conçu pour satisfaire aux cas d'utilisation et aux exigences identifiés par le groupe de travail RDF Data Access dans Cas d'utilisation et exigences de l'accès aux données RDF [UCNR].

Le langage d'interrogation SPARQL est étroitement lié aux spécifications suivantes :

1.1 Plan du document

Sauf indication contraire dans le titre de la section, toutes les sections et annexes dans ce document sont normatives.

La section 1 du document introduit la spécification du langage d'interrogation SPARQL. Elle présente l'organisation de ce document de spécification et les conventions observées tout au long de la spécification.

La section 2 de la spécification introduit le langage d'interrogation SPARQL soi-même via une série d'exemples d'interrogations et de résultats d'interrogation. La section 3 poursuit l'introduction du langage d'interrogation avec d'autres exemples qui démontrent l'aptitude de SPARQL à exprimer des contraintes sur les termes RDF apparaissant dans les résultats d'interrogation.

La section 4 présente le détail de la syntaxe du langage d'interrogation SPARQL. Elle accompagne la grammaire complète du langage et définit les structures grammaticales représentant les adresses IRI, les nœuds anonymes (blank nodes), les littéraux (literals) et les variables. La section 4 définit également la signification de plusieurs structures grammaticales utilisées comme sucre syntaxique pour des expressions plus verbeuses.

La section 5 introduit les motifs de graphe élémentaires (basic graph patterns) et les motifs de graphe de groupe (group graph patterns), qui sont les éléments d'assemblage à partir desquels sont construits des motifs d'interrogation (query patterns) SPARQL plus complexes. Les sections 6, 7 et 8 présentent les structures combinant les motifs de graphe SPARQL en des motifs de graphe plus grands. En particulier, la section 6 introduit la capacité à rendre optionnels des morceaux d'une interrogation ; la section 7 introduit la capacité à exprimer la disjonction de motifs de graphe alternatifs ; la section 8 introduit la capacité à contraindre des morceaux d'une interrogation à des graphes sources particuliers. La section 8 présente également le mécanisme de SPARQL pour définir les graphes sources d'une interrogation.

La section 9 définit les structures qui affectent les solutions d'une interrogation en triant, découpant, projetant, limitant et supprimant les copies (duplicates) d'une séquence de solutions.

La section 10 définit les quatre types d'interrogation SPARQL produisant des résultats de formes différentes.

La section 11 définit le système de test des valeurs extensibles de SPARQL. Elle présente également les fonctions et opérateurs utilisables pour contraindre les valeurs apparaissant en résultat d'une interrogation.

La section 12 est une définition formelle de l'évaluation des motifs de graphe et des modificateurs de solution (solution modifiers) de SPARQL.

L'annexe A contient la définition normative de la syntaxe du langage d'interrogation SPARQL, selon une grammaire exprimée en notation EBNF.

1.2 Conventions du document

1.2.1 Espaces de noms

Dans ce document, les exemples supposent les liaisons de préfixe d'espace de noms suivantes, sauf indication contraire :

Préfixe Adresse IRI
rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns#
rdfs: http://www.w3.org/2000/01/rdf-schema#
xsd: http://www.w3.org/2001/XMLSchema#
fn: http://www.w3.org/2005/xpath-functions#

1.2.2 Descriptions des données

Ce document emploie le format de données Turtle [TURTLE] pour montrer explicitement chaque triplet. Le format Turtle permet d'abréger les adresses IRI en préfixes :

@prefix dc:   <http://purl.org/dc/elements/1.1/> .
@prefix :     <http://example.org/book/> .
:book1  dc:title  "SPARQL Tutorial" .

1.2.3 Descriptions des résultats

Les ensembles de résultat (result sets) sont illustrés sous une forme tabulaire.

x y z
"Alice" <http://example/a>      

Une « liaison » (binding) est un couple de la forme (variableterme RDF). Dans cet ensemble de résultats, il y a trois variables : x, y et z (données en rubriques de colonne). Chaque solution apparaît comme une seule rangée dans le corps du tableau. Ici il y a une seule solution, où la variable x est liée à "Alice", la variable y est liée à <http://example/a> et la variable z n'est pas liée à un terme RDF. Les variables ne sont pas nécessairement liées dans une solution.

1.2.4 Terminologie

Le langage SPARQL inclut des adresses IRI, un sous-ensemble des références IRI de RDF qui omet les espaces. Notez que toutes les adresses IRI dans les interrogations SPARQL sont absolues ; elles peuvent ou non contenir un identificateur de fragment [RFC3987, section 3.1]. Les adresses IRI incluent les adresses URI [RFC3986] et les adresses URL. Les formes abrégées (adresses IRI relatives et noms préfixés) dans la syntaxe SPARQL se résolvent en adresses IRI absolues.

Les termes suivants, définis dans Concepts et syntaxe abstraite RDF [CONCEPTS], sont employés dans SPARQL :

2 Effectuer des interrogations simples (informatif)

La plupart des formes d'interrogation SPARQL contiennent un ensemble de motifs de triplet (triple patterns) appelé un motif de graphe élémentaire (basic graph pattern). 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.

2.1 Écrire une interrogation simple

L'exemple ci-dessous montre une interrogation SPARQL pour trouver le titre d'un livre dans le graphe de données fourni. L'interrogation comprend deux parties : la clause SELECT identifie les variables qui doivent apparaître dans les résultats d'interrogation (query results), et la clause WHERE fournit le motif de graphe élémentaire auquel comparer (match against) le graphe de données. Le motif de graphe élémentaire dans cet exemple se compose d'un seul motif de triplet avec une seule variable (?title) en position d'objet.

Données :

<http://example.org/book/book1> <http://purl.org/dc/elements/1.1/title> "SPARQL Tutorial" .

Interrogation :

SELECT ?title
WHERE
{
  <http://example.org/book/book1> <http://purl.org/dc/elements/1.1/title> ?title .
}    

Cette interrogation effectuée sur les données ci-dessus a une seule solution :

Résultat d'interrogation :

title
"SPARQL Tutorial"

2.2 Correspondances multiples

Le résultat d'une interrogation est une séquence de solutions, correspondant aux façons dont le motif de graphe de l'interrogation filtre les données. Il peut y avoir zéro, une ou plusieurs solutions à une interrogation.

Données :

@prefix foaf:  <http://xmlns.com/foaf/0.1/> .

_:a  foaf:name   "Johnny Lee Outlaw" .
_:a  foaf:mbox   <mailto:jlow@example.com> .
_:b  foaf:name   "Peter Goodguy" .
_:b  foaf:mbox   <mailto:peter@example.org> .
_:c  foaf:mbox   <mailto:carol@example.org> .

Interrogation :

PREFIX foaf:   <http://xmlns.com/foaf/0.1/>
SELECT ?name ?mbox
WHERE
  { ?x foaf:name ?name .
    ?x foaf:mbox ?mbox }

Résultat d'interrogation :

name mbox
"Johnny Lee Outlaw" <mailto:jlow@example.com>
"Peter Goodguy" <mailto:peter@example.org>

Chaque solution représente une façon de lier les variables sélectionnées aux termes RDF pour que le motif d'interrogation corresponde aux données. L'ensemble de résultats donne toutes les solutions possibles. Dans l'exemple ci-dessus, les deux correspondances ont été fournies par les deux sous-ensembles de données suivants :

 _:a foaf:name  "Johnny Lee Outlaw" .
 _:a foaf:box   <mailto:jlow@example.com> .
 _:b foaf:name  "Peter Goodguy" .
 _:b foaf:box   <mailto:peter@example.org> .

Il s'agit d'un filtrage de motif de graphe élémentaire ; toutes les variables utilisées dans le motif d'interrogation doivent être liées dans toutes les solutions.

2.3 Filtrage des littéraux RDF

Les données suivantes contiennent trois littéraux RDF :

@prefix dt:   <http://example.org/datatype#> .
@prefix ns:   <http://example.org/ns#> .
@prefix :     <http://example.org/ns#> .
@prefix xsd:  <http://www.w3.org/2001/XMLSchema#> .

:x   ns:p     "cat"@en .
:y   ns:p     "42"^^xsd:integer .
:z   ns:p     "abc"^^dt:specialDatatype .

En Turtle, notez que "cat"@en est un littéral RDF avec une forme lexicale "cat" et une langue en ; "42"^^xsd:integer est un littéral typé ayant le type de données http://www.w3.org/2001/XMLSchema#integer ; et "abc"^^dt:specialDatatype est un littéral typé ayant le type de données http://example.org/datatype#specialDatatype.

Ces données RDF constituent le graphe de données pour les exemples d'interrogations aux sections 2.3.1 à 2.3.3.

2.3.1 Filtrage des littéraux avec une étiquette de langue

Dans SPARQL, les étiquettes de langue s'expriment en utilisant le caractère @ et l'étiquette de langue, comme définie dans les Pratiques exemplaires 47 [BCP47].

L'interrogation suivante n'a aucune solution parce que "cat" n'est pas le même littéral que "cat"@en :

SELECT ?v WHERE { ?v ?p "cat" }
   v    

Tandis que l'interrogation suivante produira une solution où la variable v est liée à :x parce que l'étiquette de langue est indiquée et correspond aux données fournies :

SELECT ?v WHERE { ?v ?p "cat"@en }
v
<http://example.org/ns#x>

2.3.2 Filtrage des littéraux avec un type numérique

Dans une interrogation SPARQL, les entiers indiquent un littéral typé RDF avec le type de données xsd:integer. Par exemple, 42 est une forme abrégée de "42"^^<http://www.w3.org/2001/XMLSchema#integer>.

Le motif dans l'interrogation suivante a une solution avec la variable v liée à :y.

SELECT ?v WHERE { ?v ?p 42 }
v
<http://example.org/ns#y>

La section 4.1.2 définit les formes abrégées SPARQL pour les types xsd:float et xsd:double.

2.3.3 Filtrage des littéraux avec un type de données arbitraire

L'interrogation suivante a une solution avec la variable v liée à :z. Le processeur d'interrogation (query processor) n'a pas besoin d'avoir une connaissance des valeurs dans l'espace du type de données. Parce que la forme lexicale et l'adresse IRI de type de données sont toutes deux correspondantes, le littéral correspond.

SELECT ?v WHERE { ?v ?p "abc"^^<http://example.org/datatype#specialDatatype> }
v
<http://example.org/ns#z>

2.4 Étiquettes de nœud anonyme dans les résultats d'interrogation

Les résultats d'interrogation peuvent contenir des nœuds anonymes (blank nodes). Les nœuds anonymes dans les exemples d'ensembles de résultats dans ce document s'écrivent sous la forme d'une chaîne "_:" suivie d'une étiquette de nœud anonyme (blank node label).

Les étiquettes de nœud anonyme s'appliquent dans la portée d'un ensemble de résultats (comme défini dans la spécification Format XML des résultats d'interrogation SPARQL) ou, pour la forme d'interrogation CONSTRUCT, du graphe résultat. L'utilisation de la même étiquette à l'intérieur d'un ensemble de résultats indique le même nœud anonyme.

Données :
@prefix foaf:  <http://xmlns.com/foaf/0.1/> .

_:a  foaf:name   "Alice" .
_:b  foaf:name   "Bob" .
Interrogation :
PREFIX foaf:   <http://xmlns.com/foaf/0.1/>
SELECT ?x ?name
WHERE  { ?x foaf:name ?name }
x name
_:c "Alice"
_:d "Bob"

Les résultats ci-dessus pourraient tout aussi bien être donnés en utilisant des étiquettes de nœud anonyme différentes, car les étiquettes dans les résultats indiquent seulement si les termes RDF dans les solutions sont les mêmes ou sont différents.

x name
_:r "Alice"
_:s "Bob"

Ces deux résultats donnent les mêmes informations : les nœuds anonymes utilisés pour correspondre à l'interrogation sont différents dans les deux solutions. Il n'est pas nécessaire qu'il y ait une relation entre une étiquette _:a dans l'ensemble de résultats et un nœud anonyme dans le graphe de données avec la même étiquette.

Un auteur d'applications ne devrait pas supposer que les étiquettes de nœud anonyme dans une interrogation se rapportent à un nœud anonyme particulier dans les données.

2.5 Construction des graphes RDF

SPARQL offre plusieurs formes d'interrogation. La forme d'interrogation SELECT retourne des liaisons de variables. La forme d'interrogation CONSTRUCT retourne un graphe RDF. Le graphe est construit d'après un gabarit (template) utilisé pour générer des triplets RDF en fonction des résultats concordant avec le motif de graphe de l'interrogation.

Données :

@prefix org:    <http://example.com/ns#> .

_:a  org:employeeName   "Alice" .
_:a  org:employeeId     12345 .

_:b  org:employeeName   "Bob" .
_:b  org:employeeId     67890 .

Interrogation :

PREFIX foaf:   <http://xmlns.com/foaf/0.1/>
PREFIX org:    <http://example.com/ns#>

CONSTRUCT { ?x foaf:name ?name }
WHERE  { ?x org:employeeName ?name }

Résultat :

@prefix org: <http://example.com/ns#> .
      
_:x foaf:name "Alice" .
_:y foaf:name "Bob" .

que l'on peut sérialiser en RDF/XML ainsi :

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:foaf="http://xmlns.com/foaf/0.1/"
    >
  <rdf:Description>
    <foaf:name>Alice</foaf:name>
  </rdf:Description>
  <rdf:Description>
    <foaf:name>Bob</foaf:name>
  </rdf:Description>
</rdf:RDF>

3 Contraintes des termes RDF (informatif)

Le filtrage du motif de graphe produit une séquence de solutions, où chaque solution est constituée par un ensemble de liaisons de variables à des termes RDF. Les clauses FILTER SPARQL restreignent les solutions à celles que l'expression de filtre évalue à true.

Cette section est une introduction informelle aux filtres SPARQL ; leurs sémantiques sont définies à la section 11. Test des valeurs. Les exemples de cette section partagent le graphe d'entrée suivant :

Données :
@prefix dc:   <http://purl.org/dc/elements/1.1/> .
@prefix :     <http://example.org/book/> .
@prefix ns:   <http://example.org/ns#> .

:book1  dc:title  "SPARQL Tutorial" .
:book1  ns:price  42 .
:book2  dc:title  "The Semantic Web" .
:book2  ns:price  23 .

3.1 Restriction de la valeur des chaînes

Les fonctions de filtre (FILTER) SPARQL comme regex peuvent tester les littéraux RDF. La fonction regex filtre seulement les littéraux ordinaires sans étiquette de langue. On peut utiliser regex pour filtrer les formes lexicales d'autres littéraux avec la fonction str.

Interrogation :

PREFIX  dc:  <http://purl.org/dc/elements/1.1/>
SELECT  ?title
WHERE   { ?x dc:title ?title
          FILTER regex(?title, "^SPARQL") 
        }

Résultat d'interrogation :

title
"SPARQL Tutorial"

Le filtrage par les expressions rationnelles (regular expression) peut être indépendant de la casse en utilisant le drapeau "i".

Interrogation :

PREFIX  dc:  <http://purl.org/dc/elements/1.1/>
SELECT  ?title
WHERE   { ?x dc:title ?title
          FILTER regex(?title, "web", "i" ) 
        }

Résultat d'interrogation :

title
"The Semantic Web"

Le langage d'expression rationnelle est défini par la spécification Fonctions et opérateurs de XQuery 1.0 et XPath 2.0 et repose sur les expressions rationnelles de XML Schema.

3.2 Restriction des valeurs numériques

Les clauses FILTER SPARQL peuvent restreindre les expressions arithmétiques.

Interrogation :

PREFIX  dc:  <http://purl.org/dc/elements/1.1/>
PREFIX  ns:  <http://example.org/ns#>
SELECT  ?title ?price
WHERE   { ?x ns:price ?price .
          FILTER (?price < 30.5)
          ?x dc:title ?title . }

Résultat d'interrogation :

title price
"The Semantic Web" 23

En contraignant la variable price, seul :book2 répond à l'interrogation, puisque seul à avoir un prix inférieur à 30.5, comme l'impose la condition de filtre.

3.3 Autres contraintes de termes

Outre les types numériques, SPARQL intègre les types xsd:string, xsd:boolean et xsd:dateTime (cf. la section 11.1 Types de données des opérandes). La section 11.3 Conversion des opérateurs liste un jeu de fonctions de test, dont BOUND, isLITERAL et langMATCHES, et d'accesseurs (accessors), dont STR, LANG et DATATYPE. La section 11.5 Fonctions constructrices liste un jeu de fonctions constructrices XML Schema intégrées au langage SPARQL pour le transtypage (cast) des valeurs.

4 Syntaxe SPARQL

Cette section couvre la syntaxe utilisée par SPARQL pour les termes RDF et les motifs de triplet. La grammaire complète est donnée à l'annexe A.

4.1 Syntaxe des termes RDF

4.1.1 Syntaxe des adresses IRI

La production IRIref désigne l'ensemble des adresses IRI [RFC3987] ; les adresses IRI constituent une généralisation des adresses URI [RFC3986] et sont entièrement compatibles avec les adresses URI et URL. La production PrefixedName désigne un nom préfixé. La correspondance d'un nom préfixé à une adresse IRI est décrite ci-dessous. Les références IRI (des adresses IRI relatives ou absolues) sont désignées par la production IRI_REF, où les caractères délimiteurs « < » et « > » ne font pas partie des références IRI. Les adresses IRI relatives correspondent aux références irelative-ref à la section 2.2 Définition ABNF des références IRI et des adresses IRI dans [RFC3987] et se résolvent en adresses IRI comme décrit ci-dessous.

Règles de grammaire :
[67]   IRIref   ::=   IRI_REF | PrefixedName
[68]   PrefixedName   ::=   PNAME_LN | PNAME_NS
[69]   BlankNode   ::=   BLANK_NODE_LABEL | ANON
[70]   IRI_REF   ::=   '<' ([^<>"{}|^`\]-[#x00-#x20])* '>'
[71]   PNAME_NS   ::=   PN_PREFIX? ':'
[72]   PNAME_LN   ::=   PNAME_NS PN_LOCAL

L'ensemble des termes RDF définis dans la spécification Concepts et syntaxe abstraite RDF comprend des références URI RDF tandis que les termes SPARQL contiennent des adresses IRI. Les références URI RDF contenant des caractères « < », « > », « " », ESPACE, « { », « } », « | », « \ », « ^ » et « ` » ne sont pas des adresses IRI. Le comportement d'une interrogation SPARQL contre des déclarations RDF composées de telles références URI RDF n'est pas défini.

Noms préfixés

Le mot-clé PREFIX associe une étiquette de préfixe à une adresse IRI. Un nom préfixé se compose d'une étiquette de préfixe et d'une partie locale, séparés par un caractères DEUX-POINTS « : ». Un nom préfixé est converti (mapped) en une adresse IRI en concaténant l'addresse IRI associée au préfixe et la partie locale. L'étiquette de préfixe ou la partie locale peuvent être vides. Notez que les noms locaux SPARQL admettent les chiffres en tête, contrairement aux noms locaux XML.

Adresses IRI relatives

Les adresses IRI relatives sont combinées aux adresses IRI de base conformément au RFC Identificateur de ressource uniforme (URI) — Syntaxe générique [RFC3986] en n'utilisant que l'algorithme de base de la section 5.2. Ni la normalisation fondée sur la syntaxe ni la normalisation fondée sur un schéma (décrites aux sections 6.2.2 et 6.2.3 du RFC 3986) ne sont réalisées. Les caractères admis en plus dans les références IRI sont traités de la même façon que le sont les caractères non réservés dans les références URI, selon la section 6.5 du RFC Identificateurs de ressource internationalisés (IRI) [RFC3987].

Le mot-clé BASE définit l'adresse IRI de base utilisée pour résoudre les adresses IRI relatives, selon la section 5.1.1 Adresse URI de base incorporée au contenu du RFC 3986. La section 5.1.2 Adresse URI de base de l'entité encapsulante définit comment l'adresse IRI de base peut provenir d'un document encapsulant, tel qu'une enveloppe SOAP avec une directive xml:base, ou un document MIME de type multipart avec un en-tête Content-Location. L'« adresse URI de récupération » (Retrieval URI), identifiée à la section 5.1.3 Adresse URI de base de l'adresse URI de récupération, est l'adresse URL depuis laquelle une interrogation SPARQL particulière est récupérée. Si aucune des méthodes précédentes ne définit l'adresse URI de base, c'est l'adresse URI de base par défaut (cf. la section 5.1.4 Adresse URI de base par défaut) qui est utilisée.

Les fragments suivants représentent quelques unes des différentes façons d'écrire la même adresse IRI :

<http://example.org/book/book1>
BASE <http://example.org/book/>
<book1>
PREFIX book: <http://example.org/book/>
book:book1

4.1.2 Syntaxe des littéraux

La syntaxe générale des littéraux est une chaîne (entre des guillemets doubles, "...", ou bien simples, '...'), avec soit une étiquette de langue optionnelle (introduite par un caractère « @ »), soit une adresse IRI de type de données ou un nom préfixé optionnels (introduits par ^^).

Par commodité, les entiers peuvent être écrits directement (sans guillemets ni adresse IRI de type de données explicite) et sont interprétés comme des littéraux typés de type xsd:integer ; les nombres décimaux dans lesquels il y a un caractère « . » mais pas d'exposant sont interprétés comme des type xsd:decimal ; les nombres avec des exposants sont interprétés comme des types xsd:double. Les valeurs de type xsd:boolean peuvent aussi s'écrire true ou false.

Pour faciliter l'écriture des valeurs littérales contenant elles-mêmes des guillemets, ou longues et comprenant des caractères CHANGEMENT DE LIGNE, SPARQL fournit une structure de citation supplémentaire dans laquelle les littéraux sont englobés par des guillemets doubles ou simples triples.

Voici des exemples de syntaxe littérale dans SPARQL :

Règles de grammaire :
[60]   RDFLiteral   ::=   String ( LANGTAG | ( '^^' IRIref ) )?
[61]   NumericLiteral   ::=   NumericLiteralUnsigned |
NumericLiteralPositive |
NumericLiteralNegative
[62]   NumericLiteralUnsigned   ::=   INTEGER | DECIMAL | DOUBLE
[63]   NumericLiteralPositive   ::=   INTEGER_POSITIVE |
DECIMAL_POSITIVE |
DOUBLE_POSITIVE
[64]   NumericLiteralNegative   ::=   INTEGER_NEGATIVE |
DECIMAL_NEGATIVE |
DOUBLE_NEGATIVE
[65]   BooleanLiteral   ::=   'true' | 'false'
[66]   String   ::=   STRING_LITERAL1 | STRING_LITERAL2 |
STRING_LITERAL_LONG1 | STRING_LITERAL_LONG2
[76]   LANGTAG   ::=   '@' [a-zA-Z]+ ('-' [a-zA-Z0-9]+)*
[77]   INTEGER   ::=   [0-9]+
[78]   DECIMAL   ::=   [0-9]+ '.' [0-9]* | '.' [0-9]+
[79]   DOUBLE   ::=   [0-9]+ '.' [0-9]* EXPONENT |
'.' ([0-9])+ EXPONENT |
([0-9])+ EXPONENT
[80]   INTEGER_POSITIVE   ::=   '+' INTEGER
[81]   DECIMAL_POSITIVE   ::=   '+' DECIMAL
[82]   DOUBLE_POSITIVE   ::=   '+' DOUBLE
[83]   INTEGER_NEGATIVE   ::=   '-' INTEGER
[84]   DECIMAL_NEGATIVE   ::=   '-' DECIMAL
[85]   DOUBLE_NEGATIVE   ::=   '-' DOUBLE
[86]   EXPONENT   ::=   [eE] [+-]? [0-9]+
[87]   STRING_LITERAL1   ::=   "'" ( ([^#x27#x5C#xA#xD]) | ECHAR )* "'"
[88]   STRING_LITERAL2   ::=   '"' ( ([^#x22#x5C#xA#xD]) | ECHAR )* '"'

Les atomes (tokens) correspondant aux productions INTEGER, DECIMAL, DOUBLE et BooleanLiteral équivalent à un littéral typé avec la valeur lexicale de l'atome et le type de données associé (xsd:integer, xsd:decimal, xsd:double, xsd:boolean).

4.1.3 Syntaxe des variables d'interrogation

Les variables d'interrogation (query variables) dans les interrogations SPARQL ont une portée globale (global scope) ; l'utilisation d'un nom de variable donné partout dans une interrogation identifie la même variable. Les variables sont préfixées soit par un caractère « ? », soit par un caractère « $ » ; les caractères « ? » et « $ » ne font pas partie du nom de la variable. Dans une interrogation, $abc et ?abc identifient la même variable. Les noms possibles des variables sont donnés dans la grammaire SPARQL.

Règles de grammaire :
[44] Var   ::=   VAR1 | VAR2
[74]   VAR1   ::=   '?' VARNAME
[75]   VAR2   ::=   '$' VARNAME
[97]   VARNAME   ::=   ( PN_CHARS_U | [0-9] ) ( PN_CHARS_U | [0-9] | #x00B7 | [#x0300-#x036F] | [#x203F-#x2040] )*

4.1.4 Syntaxe des nœuds anonymes

Les nœuds anonymes dans les motifs de graphe agissent comme des variables indistinctes, non comme des références à des nœuds anonymes spécifiques dans les données interrogées.

Les nœuds anonymes sont indiqués soit sous forme d'une étiquette, telle que "_:abc", soit sous la forme abrégée "[]". Un nœud anonyme utilisé seulement à une place dans la syntaxe d'interrogation peut être indiqué avec []. Un nœud anonyme unique sera utilisé pour former le motif de triplet. Les étiquettes de nœud anonyme s'écrivent ainsi : "_:abc" pour un nœud anonyme avec l'étiquette "abc". Le même nœud anonyme ne peut pas être utilisé dans deux motifs de graphe élémentaires différents dans la même interrogation.

La structure [:p :v] peut être utilisée dans les motifs de triplet. Elle crée une étiquette de nœud anonyme qui sert de sujet à tous les couples prédicat-objet contenus. Le nœud anonyme créé peut aussi être utilisé dans d'autres motifs de triplet en position de sujet et d'objet.

Les deux formes suivantes :

[ :p "v" ] .
[] :p "v" .

allouent une étiquette de nœud anonyme unique (ici "b57") et sont équivalentes à l'écriture suivante :

_:b57 :p "v" .

Cette étiquette de nœud anonyme allouée peut être utilisée comme sujet ou objet d'autres motifs de triplet. Par exemple, comme sujet :

[ :p "v" ] :q "w" .

ce qui équivaut aux deux triplets suivants :

_:b57 :p "v" .
_:b57 :q "w" .

et comme objet :

:x :q [ :p "v" ] .

ce qui équivaut aux deux triplets :

:x  :q _:b57 .
_:b57 :p "v" .

On peut combiner la syntaxe de nœud anonyme abrégée avec d'autres abréviations pour des sujets communs et des prédicats communs.

  [ foaf:name  ?name ;
    foaf:mbox  <mailto:alice@example.org> ]

C'est la même chose que d'écrire le motif de graphe élémentaire suivant pour une étiquette de nœud anonyme allouée exclusivement, "b18" :

  _:b18  foaf:name  ?name .
  _:b18  foaf:mbox  <mailto:alice@example.org> .
Règles de grammaire :
[39]   BlankNodePropertyList   ::=   '['PropertyListNotEmpty']'
[69]   BlankNode   ::=   BLANK_NODE_LABEL | ANON
[73]   BLANK_NODE_LABEL   ::=   '_:' PN_LOCAL
[94]   ANON   ::=   '[' WS* ']'

4.2 Syntaxe des motifs de triplet

Les motifs de triplet se présentent comme une liste formée d'un sujet, d'un prédicat et d'un objet, séparés par des caractères blancs ; il existe des façons abrégées d'écrire quelques structures de motif de triplet courantes.

Les exemples suivants expriment la même interrogation :

PREFIX  dc: <http://purl.org/dc/elements/1.1/>
SELECT  ?title
WHERE   { <http://example.org/book/book1> dc:title ?title }  
PREFIX  dc: <http://purl.org/dc/elements/1.1/>
PREFIX  : <http://example.org/book/>

SELECT  $title
WHERE   { :book1  dc:title  $title }
BASE    <http://example.org/book/>
PREFIX  dc: <http://purl.org/dc/elements/1.1/>

SELECT  $title
WHERE   { <book1>  dc:title  ?title }
Règles de grammaire :
[32]   TriplesSameSubject   ::=   VarOrTerm PropertyListNotEmpty |
TriplesNode PropertyList
[33]   PropertyListNotEmpty   ::=   Verb ObjectList ( ';' ( Verb ObjectList )? )*
[34]   PropertyList   ::=   PropertyListNotEmpty?
[35]   ObjectList   ::=   Object ( ',' Object )*
[37]   Verb   ::=   VarOrIRIref | 'a'

4.2.1 Listes de prédicats et d'objets

On peut écrire des motifs de triplet dont le sujet est commun, le sujet est donc écrit une seule fois et utilisé pour plusieurs motifs de triplet en utilisant le caractère POINT-VIRGULE « ; ».

    ?x  foaf:name  ?name ;
        foaf:mbox  ?mbox .

C'est la même chose que d'écrire les motifs de triplet suivants :

    ?x  foaf:name  ?name .
    ?x  foaf:mbox  ?mbox .

4.2.2 Listes d'objets

Si des motifs de triplet partagent à la fois un sujet et un prédicat, les objets peuvent être séparés par un caractère VIRGULE « , ».

    ?x foaf:nick  "Alice" , "Alice_" .

C'est la même chose que d'écrire les motifs de triplet suivants :

   ?x  foaf:nick  "Alice" .
   ?x  foaf:nick  "Alice_" .

On peut combiner des listes d'objets et des listes de prédicats et d'objets :

   ?x  foaf:name ?name ; foaf:nick  "Alice" , "Alice_" .

Cela équivaut à :

   ?x  foaf:name  ?name .
   ?x  foaf:nick  "Alice" .
   ?x  foaf:nick  "Alice_" .

4.2.3 Collections RDF

Les collections RDF peuvent s'écrire comme des motifs de triplet en utilisant la syntaxe "(élément1 élément2 ...)". La forme "()" est une alternative pour l'adresse IRI http://www.w3.org/1999/02/22-rdf-syntax-ns#nil. Lorsqu'on l'utilise avec les éléments d'une collection, telle que (1 ?x 3 4), des motifs de triplet avec des nœuds anonymes sont alloués à la collection. Le nœud anonyme en tête de la collection peut être utilisé comme sujet ou objet dans d'autres motifs de triplet. Les nœuds anonymes alloués par la syntaxe de la collection n'apparaissent pas ailleurs dans l'interrogation.

(1 ?x 3 4) :p "w" .

Est un sucre syntaxique pour (en remarquant que b0, b1, b2 et b3 n'apparaissent pas ailleurs dans l'interrogation) :

    _:b0  rdf:first  1 ;
          rdf:rest   _:b1 .
    _:b1  rdf:first  ?x ;
          rdf:rest   _:b2 .
    _:b2  rdf:first  3 ;
          rdf:rest   _:b3 .
    _:b3  rdf:first  4 ;
          rdf:rest   rdf:nil .
    _:b0  :p         "w" . 

Les collections RDF peuvent être imbriquées et impliquer d'autres formes syntaxiques :

(1 [:p :q] ( 2 ) ) .

Est un sucre syntaxique pour :

    _:b0  rdf:first  1 ;
          rdf:rest   _:b1 .
    _:b1  rdf:first  _:b2 .
    _:b2  :p         :q .
    _:b1  rdf:rest   _:b3 .
    _:b3  rdf:first  _:b4 .
    _:b4  rdf:first  2 ;
          rdf:rest   rdf:nil .
    _:b3  rdf:rest   rdf:nil .
Règles de grammaire :
[40]   Collection   ::=   '(' GraphNode+ ')'
[92]   NIL   ::=   '(' WS* ')'

4.2.4 rdf:type

On peut utiliser le mot-clé "a" comme prédicat dans un motif de triplet ; c'est une alternative pour l'adresse IRI http://www.w3.org/1999/02/22-rdf-syntax-ns#type. Ce mot-clé est sensible à la casse.

  ?x  a  :Class1 .
  [ a :appClass ] :p "v" .

Est un sucre syntaxique pour :

  ?x    rdf:type  :Class1 .
  _:b0  rdf:type  :appClass .
  _:b0  :p        "v" .

5 Motifs de graphe

SPARQL repose sur la correspondance des motifs de graphe (graph patterns). On peut réaliser des motifs de graphe plus complexes en combinant des motifs plus petits de façons diverses :

Dans cette section, nous décrivons les deux types combinant les motifs par conjonction : les motifs de graphe élémentaires, qui combinent les motifs de triplet, et les motifs de graphe de groupe, qui combinent tous les autres motifs de graphe.

Le motif de graphe le plus externe dans une interrogation est appelé le motif d'interrogation (query pattern). Grammaticalement, il est identifié ci-dessous par GroupGraphPattern :

[13]   WhereClause   ::=   'WHERE'? GroupGraphPattern

5.1 Motifs de graphe élémentaires

Les motifs de graphe élémentaires sont des ensembles de motifs de triplet. Le filtrage par motif de graphe SPARQL est défini par la combinaison des résultats issus de la comparaison de motifs de graphe élémentaires.

Une suite de motifs de triplet interrompue par un filtre compose un seul motif de graphe élémentaire. Tout motif de graphe clôt un motif de graphe élémentaire.

5.1.1 Étiquettes de nœud anonyme

Lorsqu'on utilise des nœuds anonymes de la forme _:abc, la portée des étiquettes des nœuds anonymes est limitée au motif de graphe élémentaire. On ne peut utiliser une étiquette que dans un seul motif de graphe élémentaire dans une interrogation.

5.1.2 Extension du filtrage des motifs de graphe élémentaires

SPARQL est défini pour filtrer des graphes RDF à inférence simple (simple entailment). On peut étendre SPARQL à d'autres formes d'inférence sous certaines conditions, comme décrites ci-dessous.

5.2 Motifs de graphe de groupe

Dans une chaîne d'interrogation (query string) SPARQL, un motif de graphe de groupe est délimité par des accolades : {}. Par exemple, le motif d'interrogation de l'interrogation suivante est un motif de graphe de groupe comprenant un seul motif de graphe élémentaire :

PREFIX foaf:    <http://xmlns.com/foaf/0.1/>
SELECT ?name ?mbox
WHERE  {
          ?x foaf:name ?name .
          ?x foaf:mbox ?mbox .
       }
On obtiendrait les mêmes solutions à partir d'une interrogation qui aurait regroupé les motifs de triplet en deux motifs de graphe élémentaires. Ainsi, l'interrogation ci-dessous a une structure différente mais elle produirait les mêmes solutions que l'interrogation précédente :
PREFIX foaf:    <http://xmlns.com/foaf/0.1/>
SELECT ?name ?mbox
WHERE  { { ?x foaf:name ?name . }
         { ?x foaf:mbox ?mbox . }
       }
Règles de grammaire :
[20]   GroupGraphPattern   ::=   '{' TriplesBlock? ( ( GraphPatternNotTriples | Filter ) '.'? TriplesBlock? )* '}'
[21]   TriplesBlock   ::=   TriplesSameSubject ( '.' TriplesBlock? )?
[22]   GraphPatternNotTriples   ::=   OptionalGraphPattern | GroupOrUnionGraphPattern | GraphGraphPattern

5.2.1 Motif de groupe vide

Le motif de groupe :

{ }

filtre tout graphe (y compris le graphe vide) avec une solution qui ne lie pas de variables. Par exemple :

SELECT ?x
WHERE {}

correspond à une solution dans laquelle la variable x n'est pas liée.

5.2.2 Portée des filtres

Une contrainte, exprimée par le mot-clé FILTER, est une restriction des solutions sur tout le groupe où le filtre apparaît. Toutes les formes suivantes ont les mêmes solutions :

 {  ?x foaf:name ?name .
    ?x foaf:mbox ?mbox .
    FILTER regex(?name, "Smith")
 }
 {  FILTER regex(?name, "Smith")
    ?x foaf:name ?name .
    ?x foaf:mbox ?mbox .
 }
 {  ?x foaf:name ?name .
    FILTER regex(?name, "Smith")
    ?x foaf:mbox ?mbox .
 }

5.2.3 Exemples de motifs de graphe de groupe

Ce groupe comprend un seul motif de graphe élémentaire ; ce motif de graphe élémentaire est composé de deux motifs de triplet :

  {
    ?x foaf:name ?name .
    ?x foaf:mbox ?mbox .
  }

Ce groupe comprend un seul motif de graphe élémentaire et un filtre ; ce motif de graphe élémentaire est composé de deux motifs de triplet ; le filtre ne rompt pas le motif de graphe élémentaire en deux motifs de graphe élémentaires :

  {
    ?x foaf:name ?name . FILTER regex(?name, "Smith")
    ?x foaf:mbox ?mbox .
  }

Ce groupe comprend trois éléments : un motif de graphe élémentaire composé d'un seul motif de triplet, un groupe vide et un autre motif de graphe élémentaire composé d'un seul motif de triplet :

  {
    ?x foaf:name ?name .
    {}
    ?x foaf:mbox ?mbox .
  }

6 Inclusion de valeurs optionnelles

Les motifs de graphe élémentaires permettent aux applications d'effectuer des interrogations où le motif d'interrogation entier doit correspondre pour qu'il y ait une solution. Pour chaque solution d'une interrogation contenant seulement des motifs de graphe de groupe avec au moins un motif de graphe élémentaire, chaque variable est liée à un terme RDF dans une solution. Toutefois, on ne peut pas supposer la présence de structures complètes et régulières dans tous les graphes RDF. Il est utile d'avoir des interrogations qui puissent ajouter des informations à la solution où l'information est disponible, mais qui ne rejettent pas la solution parce que des parties du motif d'interrogation ne correspondent pas. Cette fonction est offerte par le filtrage optionnel (optional matching) : si la partie optionnelle ne correspond pas, elle ne crée aucune liaison mais n'élimine pas la solution.

6.1 Filtrage par motif optionnel

On peut définir syntaxiquement des parties optionnelles dans le motif de graphe en appliquant le mot-clé OPTIONAL au motif de graphe :

motif OPTIONAL { motif }

Cette forme syntaxique :

{ OPTIONAL { motif } }

équivaut à la suivante :

{ { } OPTIONAL { motif } }
Règle de grammaire :
[23]   OptionalGraphPattern   ::=   'OPTIONAL' GroupGraphPattern

Le mot-clé OPTIONAL est associatif à gauche (left-associative) :

motif OPTIONAL { motif } OPTIONAL { motif }

est la même chose que :

{ motif OPTIONAL { motif } } OPTIONAL { motif }

Dans un filtrage optionnel, soit le motif de graphe optionnel correspond à un graphe, en définissant et ajoutant ainsi des liaisons à une ou plusieurs solutions, soit il laisse une solution inchangée sans ajouter de liaisons supplémentaires.

Données :

@prefix foaf:       <http://xmlns.com/foaf/0.1/> .
@prefix rdf:        <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

_:a  rdf:type        foaf:Person .
_:a  foaf:name       "Alice" .
_:a  foaf:mbox       <mailto:alice@example.com> .
_:a  foaf:mbox       <mailto:alice@work.example> .

_:b  rdf:type        foaf:Person .
_:b  foaf:name       "Bob" .
Interrogation :
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name ?mbox
WHERE  { ?x foaf:name  ?name .
         OPTIONAL { ?x  foaf:mbox  ?mbox }
       }

Avec les données précédentes, le résultat d'interrogation est :

name mbox
"Alice" <mailto:alice@example.com>
"Alice" <mailto:alice@work.example>
"Bob"

Il n'y a pas de valeur pour mbox dans la solution où le nom est "Bob".

Cette interrogation trouve les noms des personnes dans les données. S'il y a un triplet avec le prédicat mbox et le même sujet, une solution contiendra également ce triplet. Dans cet exemple, on ne donne qu'un seul motif de triplet dans la partie à filtrage optionnel de l'interrogation mais, en général, la partie optionnelle peut être un motif de graphe quelconque. Le motif de graphe optionnel doit correspondre entièrement pour affecter la solution d'interrogation.

6.2 Contraintes du filtrage par motif optionnel

On peut fournir des contraintes dans un motif de graphe optionnel. Par exemple :

@prefix dc:   <http://purl.org/dc/elements/1.1/> .
@prefix :     <http://example.org/book/> .
@prefix ns:   <http://example.org/ns#> .

:book1  dc:title  "SPARQL Tutorial" .
:book1  ns:price  42 .
:book2  dc:title  "The Semantic Web" .
:book2  ns:price  23 .
PREFIX  dc:  <http://purl.org/dc/elements/1.1/>
PREFIX  ns:  <http://example.org/ns#>
SELECT  ?title ?price
WHERE   { ?x dc:title ?title .
          OPTIONAL { ?x ns:price ?price . FILTER (?price < 30) }
        }
title price
"SPARQL Tutorial"
"The Semantic Web" 23

Le prix du livre intitulé "SPARQL Tutorial" n'apparaît pas parce que le motif de graphe optionnel ne conduisait pas à une solution impliquant la variable "price".

6.3 Motifs de graphe optionnels multiples

Les motifs de graphe sont définis récursivement. Un motif de graphe peut avoir zéro ou plus motifs de graphe optionnels, et toute partie d'un motif d'interrogation peut avoir une partie optionnelle. Dans cet exemple, il y a deux motifs de graphe optionnels.

Données :
@prefix foaf:       <http://xmlns.com/foaf/0.1/> .

_:a  foaf:name       "Alice" .
_:a  foaf:homepage   <http://work.example.org/alice/> .

_:b  foaf:name       "Bob" .
_:b  foaf:mbox       <mailto:bob@work.example> .
Interrogation :
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name ?mbox ?hpage
WHERE  { ?x foaf:name  ?name .
         OPTIONAL { ?x foaf:mbox ?mbox } .
         OPTIONAL { ?x foaf:homepage ?hpage }
       }

Résultat d'interrogation :

name mbox hpage
"Alice" <http://work.example.org/alice/>
"Bob" <mailto:bob@work.example>

7 Filtrage des alternatives

SPARQL fournit un moyen de combiner les motifs de graphe de telle sorte que l'un des motifs de graphe alternatifs peut correspondre. Si plusieurs alternatives correspondent, toutes les solutions de motifs possibles sont trouvées.

Les alternatives de motifs sont indiquées syntaxiquement par le mot-clé UNION.

Données :
@prefix dc10:  <http://purl.org/dc/elements/1.0/> .
@prefix dc11:  <http://purl.org/dc/elements/1.1/> .

_:a  dc10:title     "SPARQL Query Language Tutorial" .
_:a  dc10:creator   "Alice" .

_:b  dc11:title     "SPARQL Protocol Tutorial" .
_:b  dc11:creator   "Bob" .

_:c  dc10:title     "SPARQL" .
_:c  dc11:title     "SPARQL (updated)" .
Interrogation :
PREFIX dc10:  <http://purl.org/dc/elements/1.0/>
PREFIX dc11:  <http://purl.org/dc/elements/1.1/>

SELECT ?title
WHERE  { { ?book dc10:title  ?title } UNION { ?book dc11:title  ?title } }

Résultat d'interrogation :

title
"SPARQL Protocol Tutorial"
"SPARQL"
"SPARQL (updated)"
"SPARQL Query Language Tutorial"

Cette interrogation trouve les titres des livres dans les données, que le titre soit enregistré en utilisant des propriétés Dublin Core en version 1.0 ou en version 1.1. Pour déterminer exactement comment l'information a été enregistrée, l'interrogation pourrait utiliser des variables différentes pour les deux alternatives :

PREFIX dc10:  <http://purl.org/dc/elements/1.0/>
PREFIX dc11:  <http://purl.org/dc/elements/1.1/>

SELECT ?x ?y
WHERE  { { ?book dc10:title ?x } UNION { ?book dc11:title  ?y } }
x y
"SPARQL (updated)"
"SPARQL Protocol Tutorial"
"SPARQL"
"SPARQL Query Language Tutorial"

Cela retournera un résultat avec la variable x liée aux solutions du segment gauche de l'UNION, et la variable y liée aux solutions du segment droit. Si aucune partie de la forme UNION ne correspondait, alors le motif de graphe ne correspondrait pas.

La forme UNION combine les motifs de graphe ; chaque possibilité alternative peut contenir plusieurs motifs de triplet :

PREFIX dc10:  <http://purl.org/dc/elements/1.0/>
PREFIX dc11:  <http://purl.org/dc/elements/1.1/>

SELECT ?title ?author
WHERE  { { ?book dc10:title ?title .  ?book dc10:creator ?author }
         UNION
         { ?book dc11:title ?title .  ?book dc11:creator ?author }
       }
author title
"Alice" "SPARQL Protocol Tutorial"
"Bob" "SPARQL Query Language Tutorial"

Cette interrogation ne correspondra à un livre que si son titre et son prédicat d'auteur sont tous deux de la même version de Dublin Core.

Règle de grammaire :
[25]   GroupOrUnionGraphPattern   ::=   GroupGraphPattern
( 'UNION' GroupGraphPattern )*

8 Ensemble de données RDF

Le modèle de données RDF exprime l'information sous forme de graphes consistant en triplets avec un sujet, un prédicat et un objet. Beaucoup de magasins de données RDF contiennent plusieurs graphes RDF et des données d'enregistrement (record information) pour chaque graphe, permettant à une application d'effectuer des interrogations impliquant des informations issues de plusieurs graphes.

Une interrogation SPARQL est exécutée auprès d'un ensemble de données RDF (RDF Dataset) qui représente une collection de graphes. Un ensemble de données RDF comprend un graphe anonyme, le graphe par défaut, et zéro ou plus graphes nommés où chaque graphe nommé est identifié par une adresse IRI. Une interrogation SPARQL peut comparer des parties différentes du motif d'interrogation à des graphes différents, comme décrit à la section 8.3 Interrogation de l'ensemble de données.

Un ensemble de données RDF peut contenir zéro graphe nommé ; un ensemble de données RDF contient toujours un seul graphe par défaut. Une interrogation n'a pas besoin d'inclure un filtrage du graphe par défaut ; l'interrogation peut juste inclure un filtrage des graphes nommés.

Le graphe utilisé pour filtrer un motif de graphe élémentaire est le graphe actif (active graphe). Dans les sections précédentes, toutes les interrogations sont illustrées en exécution par rapport à un seul graphe, le graphe par défaut d'un ensemble de données RDF comme graphe actif. On utilise le mot-clé GRAPH pour établir l'un parmi tous les graphes nommés dans l'ensemble de données comme graphe actif pour une partie de l'interrogation.

8.1 Exemples d'ensembles de données RDF

La définition de l'ensemble de données RDF ne restreint pas les relations des graphes nommées et du graphe par défaut. L'information peut être répétée dans des graphes différents ; les relations entre les graphes peuvent être exposées. Deux arrangements sont utiles :

Exemple 1 :
# Graphe par défaut
@prefix dc: <http://purl.org/dc/elements/1.1/> .

<http://example.org/bob>    dc:publisher  "Bob" .
<http://example.org/alice>  dc:publisher  "Alice" .
# Graphe nommé : http://example.org/bob
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:a foaf:name "Bob" .
_:a foaf:mbox <mailto:bob@oldcorp.example.org> .
# Graphe nommé : http://example.org/alice
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:a foaf:name "Alice" .
_:a foaf:mbox <mailto:alice@work.example.org> .

Dans cet exemple, le graphe par défaut contient les noms des auteurs des deux graphes nommés. Ici les triplets dans les graphes nommés ne sont pas visibles dans le graphe par défaut.

Example 2 :

Les données RDF peuvent être combinées par la fusion RDF (RDF merge) des graphes [RDF-MT]. Un arrangement possible des graphes dans un ensemble de données RDF est de faire du graphe par défaut la fusion RDF de la totalité ou d'une partie des informations contenues dans les graphes nommés.

Dans l'exemple suivant, les graphes nommés contiennent les mêmes triplets qu'auparavant. L'ensemble de données RDF inclut une fusion RDF des graphes nommés dans le graphe par défaut, en rétiquetant les nœuds anonymes pour les garder distincts.

# Graphe par défaut
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:x foaf:name "Bob" .
_:x foaf:mbox <mailto:bob@oldcorp.example.org> .

_:y foaf:name "Alice" .
_:y foaf:mbox <mailto:alice@work.example.org> .
# Graphe nommé : http://example.org/bob
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:a foaf:name "Bob" .
_:a foaf:mbox <mailto:bob@oldcorp.example.org> .
# Graphe nommé : http://example.org/alice
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:a foaf:name "Alice" .
_:a foaf:mbox <mailto:alice@work.example> .

Dans une fusion RDF, les nœuds anonymes dans le graphe fusionné ne sont pas partagés avec les nœuds anonymes des graphes à fusionner.

8.2 Définition des ensembles de données RDF

Une interrogation SPARQL peut indiquer l'ensemble de données à utiliser au filtrage en utilisant les clauses FROM et FROM NAMED pour décrire l'ensemble de données RDF. Si une interrogation comporte une telle description d'un ensemble de données, alors cet ensemble de données est utilisé à la place de tout ensemble de données que le service d'interrogation (query service) utiliserait si l'interrogation ne fournissait pas de description d'ensemble de données. L'ensemble de données RDF peut également être défini dans une requête de protocole SPARQL, auquel cas la description de protocole écrase (override) toute description dans l'interrogation même. Un service d'interrogation peut refuser une requête d'interrogation si la description d'ensemble de données lui est inacceptable.

Les mots-clés FROM et FROM NAMED permettent à une interrogation d'indiquer un ensemble de données RDF par référence ; ils indiquent que l'ensemble de données devrait inclure des graphes obtenus à partir de représentations des ressources identifiées par les adresses IRI données (à savoir la forme absolue des références IRI fournies). L'ensemble de données obtenu à partir d'un certain nombre de clauses FROM et FROM NAMED est :

S'il n'y a pas de clause FROM mais une ou plusieurs clauses FROM NAMED, alors l'ensemble de données comprend un graphe vide pour le graphe par défaut.

Règles de grammaire :
[9]   DatasetClause   ::=   'FROM' ( DefaultGraphClause | NamedGraphClause )
[10]   DefaultGraphClause   ::=   SourceSelector
[11]   NamedGraphClause   ::=   'NAMED' SourceSelector
[12]   SourceSelector   ::=   IRIref

8.2.1 Définition du graphe par défaut

Chaque clause FROM contient une adresse IRI indiquant un graphe à utiliser pour former le graphe par défaut. Cela n'installe pas le graphe comme graphe nommé.

Dans cet exemple, l'ensemble de données RDF contient un seul graphe par défaut et aucun graphe nommé :

# Graphe par défaut (stocké à http://example.org/foaf/aliceFoaf)
@prefix  foaf:  <http://xmlns.com/foaf/0.1/> .

_:a  foaf:name     "Alice" .
_:a  foaf:mbox     <mailto:alice@work.example> .
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT  ?name
FROM    <http://example.org/foaf/aliceFoaf>
WHERE   { ?x foaf:name ?name }
name
"Alice"

Si une interrogation présente plusieurs clauses FROM, en fournissant plusieurs adresses IRI pour indiquer le graphe par défaut, alors le graphe par défaut est fondé sur la fusion RDF des graphes obtenus des représentations des ressources identifiées par les adresses IRI en question.

8.2.2 Définition des graphes nommés

Une interrogation peut fournir les adresses IRI des graphes nommés dans l'ensemble de données RDF avec la clause FROM NAMED. Chaque adresse IRI est utilisée pour fournir un seul graphe nommé dans l'ensemble de données RDF. L'utilisation d'une même adresse IRI dans deux ou plus clauses FROM NAMED se traduit par l'apparition d'un seul graphe nommé avec cette adresse IRI dans l'ensemble de données.

# Graphe : http://example.org/bob
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:a foaf:name "Bob" .
_:a foaf:mbox <mailto:bob@oldcorp.example.org> .
# Graphe : http://example.org/alice
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:a foaf:name "Alice" .
_:a foaf:mbox <mailto:alice@work.example> .
...
FROM NAMED <http://example.org/alice>
FROM NAMED <http://example.org/bob>
...

La syntaxe FROM NAMED suggère que l'adresse IRI identifie le graphe correspondant, mais la relation entre une adresse IRI et un graphe dans un ensemble de données RDF est indirecte. L'adresse IRI identie une ressource et la ressource est représentée par un graphe (ou, plus précisément, par un document qui sérialise un graphe). Pour plus de détails, cf. [WEBARCH].

8.2.3 Combinaison de FROM et FROM NAMED

On peut utiliser la clause FROM et la clause FROM NAMED dans la même interrogation.

# Graphe par défaut (stocké à http://example.org/dft.ttl)
@prefix dc: <http://purl.org/dc/elements/1.1/> .

<http://example.org/bob>    dc:publisher  "Bob Hacker" .
<http://example.org/alice>  dc:publisher  "Alice Hacker" .
# Graphe nommé : http://example.org/bob
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:a foaf:name "Bob" .
_:a foaf:mbox <mailto:bob@oldcorp.example.org> .
# Graphe nommé : http://example.org/alice
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:a foaf:name "Alice" .
_:a foaf:mbox <mailto:alice@work.example.org> .
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>

SELECT ?who ?g ?mbox
FROM <http://example.org/dft.ttl>
FROM NAMED <http://example.org/alice>
FROM NAMED <http://example.org/bob>
WHERE
{
   ?g dc:publisher ?who .
   GRAPH ?g { ?x foaf:mbox ?mbox }
}

L'ensemble de données RDF de cette interrogation contient un graphe par défaut et deux graphes nommés. Le mot-clé GRAPH est décrit ci-dessous.

Les actions nécessaires pour construire l'ensemble de données ne sont pas déterminées par la seule description de l'ensemble de données. Si une adresse IRI apparaît deux fois dans une description d'ensemble de données, soit par deux clauses FROM, soit par une clause FROM et une clause FROM NAMED, alors cela ne suppose pas que sont faites une seule tentative exactement ou deux tentatives exactement pour obtenir un graphe RDF associé à l'adresse IRI. Dès lors, on ne peut faire aucune supposition à propos de l'identité des nœuds anonymes dans les triplets obtenus à partir des deux apparitions (occurrences) dans la description de l'ensemble de données. En général, on ne peut faire aucune supposition concernant l'équivalence des graphes.

8.3 Interrogation de l'ensemble de données

Lors de l'interrogation d'une collection de graphes, le mot-clé GRAPH est utilisé pour comparer des motifs à des graphes nommés. GRAPH peut fournir une adresse IRI pour sélectionner un seul graphe ou utiliser une variable qui s'étendra sur l'adresse IRI de tous les graphes nommés dans l'ensemble de données RDF de l'interrogation.

L'utilisation de GRAPH change le graphe actif pour le filtrage des motifs de graphe élémentaires dans une partie de l'interrogation. En dehors de l'utilisation de GRAPH, le graphe par défaut est filtré par des motifs de graphe élémentaires.

Dans les exemples, nous utiliserons les deux graphes suivants :

# Graphe nommé : http://example.org/foaf/aliceFoaf
@prefix  foaf:     <http://xmlns.com/foaf/0.1/> .
@prefix  rdf:      <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix  rdfs:     <http://www.w3.org/2000/01/rdf-schema#> .

_:a  foaf:name     "Alice" .
_:a  foaf:mbox     <mailto:alice@work.example> .
_:a  foaf:knows    _:b .

_:b  foaf:name     "Bob" .
_:b  foaf:mbox     <mailto:bob@work.example> .
_:b  foaf:nick     "Bobby" .
_:b  rdfs:seeAlso  <http://example.org/foaf/bobFoaf> .

<http://example.org/foaf/bobFoaf>
     rdf:type      foaf:PersonalProfileDocument .
# Graphe nommé : http://example.org/foaf/bobFoaf
@prefix  foaf:     <http://xmlns.com/foaf/0.1/> .
@prefix  rdf:      <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix  rdfs:     <http://www.w3.org/2000/01/rdf-schema#> .

_:z  foaf:mbox     <mailto:bob@work.example> .
_:z  rdfs:seeAlso  <http://example.org/foaf/bobFoaf> .
_:z  foaf:nick     "Robert" .

<http://example.org/foaf/bobFoaf>
     rdf:type      foaf:PersonalProfileDocument .
Règle de grammaire :
[24]   GraphGraphPattern   ::=   'GRAPH' VarOrIRIref GroupGraphPattern

8.3.1 Accès aux nomx de graphe

L'interrogation suivante compare le motif de graphe à chacun des graphes nommés dans l'ensemble de données et forme des solutions où la variable src est liée aux adresses IRI du graphe comparé. Le motif de graphe est comparé au graphe actif, c'est-à-dire chacun des graphes nommés dans l'ensemble de données.

PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT ?src ?bobNick
FROM NAMED <http://example.org/foaf/aliceFoaf>
FROM NAMED <http://example.org/foaf/bobFoaf>
WHERE
  {
    GRAPH ?src
    { ?x foaf:mbox <mailto:bob@work.example> .
      ?x foaf:nick ?bobNick
    }
  }

Le résultat d'interrogation donne le nom des graphes où l'information est trouvée et la valeur du surnom (nick) de Bob :

src bobNick
<http://example.org/foaf/aliceFoaf> "Bobby"
<http://example.org/foaf/bobFoaf> "Robert"

8.3.2 Restriction par adresse IRI de graphe

L'interrogation peut restreindre le filtrage appliqué à un graphe spécifique en fournissant l'adresse IRI du graphe. Cela établit le graphe nommé par l'addresse IRI comme graphe actif. Cette interrogation cherche le surnom de Bob tel que donné dans le graphe http://example.org/foaf/bobFoaf.

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX data: <http://example.org/foaf/>

SELECT ?nick
FROM NAMED <http://example.org/foaf/aliceFoaf>
FROM NAMED <http://example.org/foaf/bobFoaf>
WHERE
  {
     GRAPH data:bobFoaf {
         ?x foaf:mbox <mailto:bob@work.example> .
         ?x foaf:nick ?nick }
  }

ce qui produit une seule solution :

nick
"Robert"

8.3.3 Restriction des adresses IRI des graphes possibles

Une variable utilisée dans la clause GRAPH peut aussi l'être dans une autre clause GRAPH ou dans un motif de graphe comparé au graphe par défaut dans l'ensemble de données.

L'interrogation suivante utilise le graphe avec l'adresse IRI http://example.org/foaf/aliceFoaf pour trouver le document de profil de Bob ; puis elle compare un autre motif à ce graphe. Le motif dans la deuxième clause GRAPH trouve le nœud anonyme (variable w) de la personne avec la même boîte aux lettres (donnée par la variable mbox) que celle trouvée dans la première clause GRAPH (variable whom), parce que le nœud anonyme utilisé pour filtrer la variable whom du fichier FOAF d'Alice n'est pas le même que le nœud anonyme du document de profil (puisqu'ils se trouvent dans des graphes différents).

PREFIX  data:  <http://example.org/foaf/>
PREFIX  foaf:  <http://xmlns.com/foaf/0.1/>
PREFIX  rdfs:  <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?mbox ?nick ?ppd
FROM NAMED <http://example.org/foaf/aliceFoaf>
FROM NAMED <http://example.org/foaf/bobFoaf>
WHERE
{
  GRAPH data:aliceFoaf
  {
    ?alice foaf:mbox <mailto:alice@work.example> ;
           foaf:knows ?whom .
    ?whom  foaf:mbox ?mbox ;
           rdfs:seeAlso ?ppd .
    ?ppd  a foaf:PersonalProfileDocument .
  } .
  GRAPH ?ppd
  {
      ?w foaf:mbox ?mbox ;
         foaf:nick ?nick
  }
}
mbox nick ppd
<mailto:bob@work.example> "Robert" <http://example.org/foaf/bobFoaf>

Un triplet dans le fichier FOAF d'Alice donnant le surnom (nick) de Bob ne sera pas utilisé pour fournir le surnom de Bob car le motif impliquant la variable nick est restreint par la variable ppd à un document de profil personnel (Personal Profile Document) particulier.

8.3.4 Graphes nommés et par défaut

Les motifs d'interrogation peuvent impliquer à la fois le graphe par défaut et les graphes nommés. Dans cet exemple, un agrégateur (aggregator) a lu une ressource web à deux occasions différentes. À chaque fois qu'un graphe est interprété dans l'agrégateur, il reçoit du système local une adresse IRI. Les graphes sont pratiquement les mêmes hormis l'adresse de courrier électronique de Bob qui a changé.

Ici le graphe par défaut est utilisé pour enregistrer les informations de provenance et les données RDF réellement lues sont conservées en deux graphes séparés, le système donnant à chacun une adresse IRI différente. L'ensemble de données RDF est constitué des deux graphes nommés et des informations à leur sujet.

RDF Dataset:

# Graphe par défaut
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix g:  <tag:example.org,2005-06-06:> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

g:graph1 dc:publisher "Bob" .
g:graph1 dc:date "2004-12-06"^^xsd:date .

g:graph2 dc:publisher "Bob" .
g:graph2 dc:date "2005-01-10"^^xsd:date .
# Graphe avec adresse IRI allouée localement : tag:example.org,2005-06-06:graph1
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:a foaf:name "Alice" .
_:a foaf:mbox <mailto:alice@work.example> .

_:b foaf:name "Bob" .
_:b foaf:mbox <mailto:bob@oldcorp.example.org> .
# Graphe avec adresse IRI allouée localement : tag:example.org,2005-06-06:graph2
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

_:a foaf:name "Alice" .
_:a foaf:mbox <mailto:alice@work.example> .

_:b foaf:name "Bob" .
_:b foaf:mbox <mailto:bob@newcorp.example.org> .

Cette interrogation découvre des adresses électroniques, en détaillant le nom de la personne et la date de découverte de l'information.

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc:   <http://purl.org/dc/elements/1.1/>

SELECT ?name ?mbox ?date
WHERE
  {  ?g dc:publisher ?name ;
        dc:date ?date .
    GRAPH ?g
      { ?person foaf:name ?name ; foaf:mbox ?mbox }
  }

Les résultats montrent que l'adresse électronique de "Bob" a changé.

name mbox date
"Bob" <mailto:bob@oldcorp.example.org> "2004-12-06"^^xsd:date
"Bob" <mailto:bob@newcorp.example.org> "2005-01-10"^^xsd:date

L'adresse IRI du type de donnée date est abrégée dans les résultats pour la lisibilité.

9 Séquences de solutions et modificateurs

Les motifs d'interrogation génèrent une collection non ordonnée de solutions, chaque solution étant une fonction partielle de variables vers des termes RDF. Ces solutions sont ensuite traitées comme une séquence (une séquence de solutions), d'abord sans ordre spécifique ; les éventuels modificateurs de séquence s'appliquent alors pour créer une autre séquence. Enfin, cette dernière séquence est utilisée pour générer un des résultats d'une forme d'interrogation SPARQL.

Un modificateur de séquence de solutions (solution sequence modifier) est l'un des suivants :

Les modificateurs s'appliquent dans l'ordre de la liste ci-dessus.

Règles de grammaire :
[5]   SelectQuery   ::=   'SELECT' ( 'DISTINCT' | 'REDUCED' )? ( Var+ | '*' ) DatasetClause* WhereClause SolutionModifier
[14]   SolutionModifier   ::=   OrderClause? LimitOffsetClauses?
[15]   LimitOffsetClauses   ::=   ( LimitClause OffsetClause? | OffsetClause LimitClause? )
[16]   OrderClause   ::=   'ORDER' 'BY' OrderCondition+

9.1 ORDER BY

La clause ORDER BY établit l'ordre d'une séquence de solutions.

À la suite de la clause ORDER BY on trouve une séquence de comparateurs de tri, composée d'une expression et d'un modificateur de tri optionnel — ASC() ou DESC(). Chaque comparateur de tri est soit ascendant — indiqué par le modificateur ASC() ou aucun modificateur —, soit descendant — indiqué par le modificateur DESC().

PREFIX foaf:    <http://xmlns.com/foaf/0.1/>

SELECT ?name
WHERE { ?x foaf:name ?name }
ORDER BY ?name
PREFIX     :    <http://example.org/ns#>
PREFIX foaf:    <http://xmlns.com/foaf/0.1/>
PREFIX xsd:     <http://www.w3.org/2001/XMLSchema#>

SELECT ?name
WHERE { ?x foaf:name ?name ; :empId ?emp }
ORDER BY DESC(?emp)
PREFIX foaf:    <http://xmlns.com/foaf/0.1/>

SELECT ?name
WHERE { ?x foaf:name ?name ; :empId ?emp }
ORDER BY ?name DESC(?emp)

L'opérateur "<" (cf. les sections 11.3 Conversion des opérateurs et 11.3.1 Extensibilité des opérateurs) définit l'ordre relatif de deux types numériques, littéraux simples, xsd:string, xsd:boolean et xsd:dateTime. On ordonne deux adresses IRI en les comparant comme des littéraux simples.

SPARQL établit également un classement entre certains types de termes RDF qui ne seraient pas ordonnés sinon :

  1. (Priorité la plus faible) aucune valeur n'est affectée à la variable ou à l'expression dans cette solution ;
  2. Les nœuds anonymes ;
  3. Les adresses IRI ;
  4. Les littéraux RDF.

Un littéral ordinaire (plain literal) est inférieur à un littéral RDF avec un type xsd:string de la même forme lexicale.

SPARQL ne définit pas le classement d'ensemble de tous les termes RDF possibles. Voici quelques exemples de couples de termes pour lesquels l'ordre relatif n'est pas défini :