Guide — Interroger un triplestore avec SPARQL¶
Problème : Vous avez des données RDF publiées et souhaitez les interroger de manière expressive.
Solution : Utiliser SPARQL, le langage de requête du Web sémantique.
Quand utiliser ce guide¶
- Vous avez un triplestore (Virtuoso, GraphDB, Fuseki…)
- Vous souhaitez extraire, filtrer ou agréger des données RDF
- Vous voulez fédérer des requêtes sur plusieurs sources
1. Structure d'une requête SPARQL de base¶
PREFIX legal: <http://www.w3.org/ns/legal#>
PREFIX schema: <http://schema.org/>
SELECT ?nom ?siret
WHERE {
?org a legal:LegalEntity ;
legal:legalName ?nom ;
schema:identifier ?siret .
}
LIMIT 10
2. Filtrer par valeur¶
PREFIX legal: <http://www.w3.org/ns/legal#>
PREFIX locn: <http://www.w3.org/ns/locn#>
SELECT ?org ?nom ?cp
WHERE {
?org a legal:LegalEntity ;
legal:legalName ?nom ;
legal:registeredAddress ?adresse .
?adresse locn:postCode ?cp .
FILTER(STRSTARTS(?cp, "75")) # Uniquement Paris (75xxx)
}
ORDER BY ?nom
3. Requête sur un SPARQL endpoint distant (requête fédérée)¶
Interroger data.europa.eu depuis votre propre endpoint :
PREFIX org: <http://www.w3.org/ns/org#>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
SELECT ?label
WHERE {
SERVICE <https://publications.europa.eu/webapi/rdf/sparql> {
<http://publications.europa.eu/resource/authority/country/FRA>
skos:prefLabel ?label .
FILTER(LANG(?label) = "fr")
}
}
Note : la requête fédérée (
SERVICE) permet de combiner vos données locales avec des référentiels européens sans les dupliquer.
4. Compter et agréger¶
PREFIX legal: <http://www.w3.org/ns/legal#>
PREFIX locn: <http://www.w3.org/ns/locn#>
SELECT ?departement (COUNT(?org) AS ?nb)
WHERE {
?org a legal:LegalEntity ;
legal:registeredAddress ?adresse .
?adresse locn:adminUnitL2 ?departement .
}
GROUP BY ?departement
ORDER BY DESC(?nb)
5. Appel SPARQL depuis Python¶
import requests
ENDPOINT = "https://data.example.gouv.fr/sparql"
QUERY = """
PREFIX legal: <http://www.w3.org/ns/legal#>
SELECT ?nom WHERE {
?org a legal:LegalEntity ;
legal:legalName ?nom .
}
LIMIT 5
"""
response = requests.get(
ENDPOINT,
params={"query": QUERY, "format": "json"},
headers={"Accept": "application/sparql-results+json"}
)
data = response.json()
for binding in data["results"]["bindings"]:
print(binding["nom"]["value"])
Endpoints SPARQL publics utiles¶
| Source | URL |
|---|---|
| Publications Office EU | https://publications.europa.eu/webapi/rdf/sparql |
| DBpedia | https://dbpedia.org/sparql |
| Wikidata | https://query.wikidata.org/sparql |
| data.europa.eu | https://data.europa.eu/sparql |