Tutoriel SPARQL

Apprenez à interroger des graphes RDF avec le langage standard du web sémantique

01

📖 Introduction à SPARQL

SPARQL (prononcé "sparkle") est le langage de requête standard du W3C pour interroger des graphes RDF. C'est l'équivalent du SQL pour les bases de données relationnelles, mais spécialisé pour les graphes de connaissances.

💡 À retenir : SPARQL permet d'extraire des informations d'un graphe RDF en utilisant des motifs de triplets.
📝 Dans ce tutoriel :
Nous utiliserons une base RDF sur les orateurs et discours pour illustrer les requêtes.
02

📝 Syntaxe de base

Une requête SPARQL se compose de :

  • Des déclarations PREFIX pour raccourcir les IRIs
  • D'une clause SELECT pour spécifier les variables à retourner
  • D'une clause WHERE contenant les motifs de triplets
PREFIX schema: 
PREFIX foaf: 

SELECT ?nom ?dateNaissance
WHERE {
  ?orateur a foaf:Person ;
           foaf:name ?nom ;
           schema:birthDate ?dateNaissance .
}
LIMIT 10
💡 Notation :
  • ?variable : variable qui sera liée à des valeurs
  • a : raccourci pour rdf:type
  • ; : permet d'enchaîner les propriétés du même sujet
03

🔍 Requêtes SELECT

La requête SELECT est la plus utilisée. Elle retourne un tableau de résultats.

Exemple 1 : Tous les discours

PREFIX schema: 

SELECT ?titre ?date
WHERE {
  ?discours a schema:Speech ;
            schema:title ?titre ;
            schema:date ?date .
}
ORDER BY ?date
Résultat :
| titre | date |
| "Appel du 18 juin" | "1940-06-18" |
| "Appel du 22 juin" | "1940-06-22" |
| "Discours de Bayeux" | "1946-06-16" |

Exemple 2 : Discours d'un orateur spécifique

PREFIX schema: 

SELECT ?titre ?date
WHERE {
  
      schema:author ?discours .
  ?discours schema:title ?titre ;
            schema:date ?date .
}
ORDER BY ?date
04

🎯 Filtres (FILTER)

La clause FILTER permet de restreindre les résultats selon des conditions.

Exemple 1 : Discours après 1940

PREFIX schema: 
PREFIX xsd: 

SELECT ?titre ?date
WHERE {
  ?discours a schema:Speech ;
            schema:title ?titre ;
            schema:date ?date .
  FILTER(?date > "1940-01-01"^^xsd:date)
}
ORDER BY ?date

Exemple 2 : Discours contenant un mot-clé

PREFIX schema: 

SELECT ?titre ?contenu
WHERE {
  ?discours schema:title ?titre ;
            schema:content ?contenu .
  FILTER(CONTAINS(?contenu, "résistance"))
}

Exemple 3 : Conditions combinées

SELECT ?nom ?date
WHERE {
  ?orateur foaf:name ?nom ;
           schema:birthDate ?date .
  FILTER(?date > "1800-01-01"^^xsd:date && ?date < "1900-01-01"^^xsd:date)
}
# Orateurs nés au XIXe siècle
05

📊 Tri et limite (ORDER BY, LIMIT)

Exemple : Les 5 discours les plus récents

PREFIX schema: 

SELECT ?titre ?date
WHERE {
  ?discours a schema:Speech ;
            schema:title ?titre ;
            schema:date ?date .
}
ORDER BY DESC(?date)
LIMIT 5

Avec OFFSET (pagination)

SELECT ?titre ?date
WHERE {
  ?discours a schema:Speech ;
            schema:title ?titre ;
            schema:date ?date .
}
ORDER BY ?date
LIMIT 10
OFFSET 20   # Ignore les 20 premiers résultats
06

🔀 Requêtes OPTIONAL

OPTIONAL permet d'inclure des données qui peuvent ne pas exister.

PREFIX schema: 
PREFIX foaf: 

SELECT ?nom ?discours
WHERE {
  ?orateur foaf:name ?nom .
  OPTIONAL {
    ?orateur schema:author ?discours .
    ?discours schema:title ?titre
  }
}
# Retourne tous les orateurs, même ceux sans discours
07

📈 Agrégations (GROUP BY, COUNT)

Compter les discours par orateur

PREFIX schema: 
PREFIX foaf: 

SELECT ?nom (COUNT(?discours) AS ?nbDiscours)
WHERE {
  ?orateur foaf:name ?nom ;
           schema:author ?discours .
}
GROUP BY ?nom ?orateur
ORDER BY DESC(?nbDiscours)
Résultat :
| nom | nbDiscours |
| "Victor Hugo" | 15 |
| "Charles de Gaulle" | 12 |
| "Emmanuel Macron" | 8 |
08

🏋️ Exercices pratiques

Exercice 1

Trouvez tous les discours de Victor Hugo.

Voir la solution
PREFIX schema: 
PREFIX foaf: 

SELECT ?titre ?date
WHERE {
  ?orateur foaf:name "Victor Hugo" ;
           schema:author ?discours .
  ?discours schema:title ?titre ;
            schema:date ?date .
}
ORDER BY ?date

Exercice 2

Trouvez les orateurs nés au XXe siècle (après 1900).

Voir la solution
PREFIX schema: 
PREFIX foaf: 
PREFIX xsd: 

SELECT ?nom ?dateNaissance
WHERE {
  ?orateur foaf:name ?nom ;
           schema:birthDate ?dateNaissance .
  FILTER(?dateNaissance > "1900-01-01"^^xsd:date)
}
ORDER BY ?dateNaissance

Exercice 3

Comptez le nombre total de discours par année.

Voir la solution
PREFIX schema: 

SELECT ?annee (COUNT(?discours) AS ?nbDiscours)
WHERE {
  ?discours a schema:Speech ;
            schema:date ?date .
  BIND(YEAR(?date) AS ?annee)
}
GROUP BY ?annee
ORDER BY ?annee
🚀 Pour aller plus loin : 📖 Tutoriel SPARQL avancé →