SPARQL (SPARQL Protocol and RDF Query Language) est le langage de requête standard du W3C pour interroger des graphes de données RDF. Il joue pour les données liées le même rôle que SQL pour les bases de données relationnelles — avec une différence fondamentale : SPARQL traverse des graphes de triplets plutôt que des tables.
La version courante, SPARQL 1.1 (recommandation W3C de 2013), est supportée par tous les triplestores majeurs : Apache Jena Fuseki, Blazegraph, GraphDB, Virtuoso, Amazon Neptune.
Le modèle RDF en 30 secondes
Toute donnée RDF est un triplet : <sujet> <prédicat> <objet>.
<http://exemple.org/Alice> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <http://exemple.org/Personne> .
<http://exemple.org/Alice> <http://xmlns.com/foaf/0.1/name> "Alice Tremblay" .
<http://exemple.org/Alice> <http://exemple.org/connait> <http://exemple.org/Bob> .
<http://exemple.org/Bob> <http://xmlns.com/foaf/0.1/name> "Bob Gagnon" .
En Turtle (format compact), le même graphe s’écrit :
@prefix ex: <http://exemple.org/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
ex:Alice a ex:Personne ;
foaf:name "Alice Tremblay" ;
ex:connait ex:Bob .
ex:Bob foaf:name "Bob Gagnon" .
SPARQL s’applique à ce graphe via des patterns de triplets : on déclare la forme des triplets qu’on cherche, et le moteur retourne toutes les correspondances.
Les 4 formes de requêtes SPARQL
| Forme | Rôle | Retourne |
|---|---|---|
SELECT | Récupérer des variables liées | Table de résultats |
CONSTRUCT | Extraire un sous-graphe | Nouveau graphe RDF |
ASK | Tester l’existence d’un pattern | Booléen vrai/faux |
DESCRIBE | Décrire une ressource | Graphe RDF (impl. dépendante) |
SELECT — La requête de base
PREFIX ex: <http://exemple.org/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?personne ?nom
WHERE {
?personne a ex:Personne ;
foaf:name ?nom .
}
ORDER BY ?nom
- Les variables commencent par
? - Le bloc
WHEREcontient des patterns de triplets séparés par. ORDER BY,LIMIT,OFFSETfonctionnent comme en SQL
Résultat :
| ?personne | ?nom |
|---|---|
ex:Alice | ”Alice Tremblay” |
ex:Bob | ”Bob Gagnon” |
Filtres et conditions
Le mot-clé FILTER permet d’appliquer des conditions sur les valeurs liées.
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?personne ?nom
WHERE {
?personne foaf:name ?nom .
FILTER (CONTAINS(LCASE(?nom), "alice"))
}
Fonctions courantes dans les FILTER : CONTAINS, STRSTARTS, REGEX, LANG, DATATYPE, isIRI, isLiteral, opérateurs arithmétiques et comparaisons.
OPTIONAL — Jointures ouvertes
Équivalent d’un LEFT JOIN : retourne les résultats même si le pattern optionnel n’est pas satisfait.
PREFIX ex: <http://exemple.org/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX schema: <https://schema.org/>
SELECT ?personne ?nom ?email
WHERE {
?personne a ex:Personne ;
foaf:name ?nom .
OPTIONAL { ?personne schema:email ?email . }
}
Les lignes sans ?email apparaissent quand même, avec la variable non liée.
CONSTRUCT — Transformer un graphe
CONSTRUCT retourne un nouveau graphe RDF construit à partir des variables liées. Utile pour la conversion de vocabulaires ou la publication de données liées.
PREFIX ex: <http://exemple.org/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX schema: <https://schema.org/>
CONSTRUCT {
?p schema:name ?nom .
}
WHERE {
?p a ex:Personne ;
foaf:name ?nom .
}
Ce patron migre des noms de foaf:name vers schema:name.
ASK — Vérifier l’existence
Retourne true ou false selon qu’un pattern existe ou non dans le graphe.
PREFIX ex: <http://exemple.org/>
ASK {
ex:Alice ex:connait ex:Bob .
}
Résultat : true
Agrégations
SPARQL 1.1 supporte COUNT, SUM, AVG, MIN, MAX, GROUP_CONCAT avec GROUP BY et HAVING.
PREFIX ex: <http://exemple.org/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?type (COUNT(?p) AS ?nb)
WHERE {
?p a ?type .
}
GROUP BY ?type
ORDER BY DESC(?nb)
Exécuter une requête via curl
Tout endpoint SPARQL 1.1 expose une URL GET ou POST. Avec Apache Jena Fuseki :
# GET (requête dans l'URL)
curl -G "http://localhost:3030/mon-graphe/query" \
--data-urlencode "query=SELECT * WHERE { ?s ?p ?o } LIMIT 5" \
-H "Accept: application/sparql-results+json"
# POST (requête dans le corps)
curl -X POST "http://localhost:3030/mon-graphe/query" \
-H "Content-Type: application/sparql-query" \
-H "Accept: application/sparql-results+json" \
--data "SELECT * WHERE { ?s ?p ?o } LIMIT 5"
Le format de réponse JSON (application/sparql-results+json) suit la spécification W3C.
SPARQL Update — Modifier le graphe
SPARQL 1.1 Update permet d’insérer et supprimer des triplets.
PREFIX ex: <http://exemple.org/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
# Insérer
INSERT DATA {
ex:Charlie a ex:Personne ;
foaf:name "Charlie Côté" ;
ex:connait ex:Alice .
}
# Supprimer
DELETE DATA {
ex:Alice ex:connait ex:Bob .
}
# Modifier (DELETE + INSERT combinés)
DELETE { ex:Alice foaf:name "Alice Tremblay" . }
INSERT { ex:Alice foaf:name "Alice Tremblay-Martin" . }
WHERE { ex:Alice foaf:name "Alice Tremblay" . }
Requêtes sur des endpoints publics
De nombreux jeux de données ouverts exposent un endpoint SPARQL public.
Wikidata (données encyclopédiques structurées) :
# Premiers ministres du Québec, avec date de naissance
SELECT ?pm ?pmLabel ?naissance WHERE {
?pm wdt:P39 wd:Q318358 ; # poste : premier ministre du Québec
wdt:P569 ?naissance . # date de naissance
SERVICE wikibase:label { bd:serviceParam wikibase:language "fr". }
}
ORDER BY ?naissance
À exécuter sur query.wikidata.org.
DBpedia (extraction structurée de Wikipedia) : endpoint sur https://dbpedia.org/sparql