Cotechnoe — Donner du sens à vos données
sparqlrdfweb-sémantiquetutorial

Introduction à SPARQL — Interroger des données RDF

· Michel Héon

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

FormeRôleRetourne
SELECTRécupérer des variables liéesTable de résultats
CONSTRUCTExtraire un sous-grapheNouveau graphe RDF
ASKTester l’existence d’un patternBooléen vrai/faux
DESCRIBEDécrire une ressourceGraphe 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 WHERE contient des patterns de triplets séparés par .
  • ORDER BY, LIMIT, OFFSET fonctionnent 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


Vidéo d’introduction


Ressources pour aller plus loin