API SPARQL

Interrogez vos graphes RDF avec le langage standard du web sémantique

01

📖 Qu'est-ce que l'API SPARQL ?

L'API SPARQL est un endpoint REST qui permet d'interroger un graphe de connaissances via le langage SPARQL, standard du web sémantique. Elle expose un point d'accès unique pour exécuter des requêtes SELECT, CONSTRUCT, ASK et DESCRIBE.

💡 À retenir : SPARQL est au web sémantique ce que SQL est aux bases relationnelles. L'API SPARQL est l'équivalent d'un serveur SQL pour vos graphes RDF.
🌐 Endpoint public :
https://lemondesemantique.fr/api/sparql

Caractéristiques :

  • ✅ Support des requêtes SELECT, CONSTRUCT, ASK, DESCRIBE
  • ✅ Authentification par clé API
  • ✅ Résultats en JSON, XML, CSV, TSV, RDF/XML, Turtle
  • Rate limiting pour protéger le service
  • Timeout configurable pour les requêtes complexes
02

🔌 SPARQL Endpoint

Le SPARQL Endpoint accepte les requêtes via GET et POST.

Requête GET

curl "https://lemondesemantique.fr/api/sparql?query=SELECT+*+WHERE{?s+?p+?o}+LIMIT+10&format=json" \
  -H "X-API-Key: votre_clé_api"

Requête POST (recommandée)

curl -X POST https://lemondesemantique.fr/api/sparql \
  -H "X-API-Key: votre_clé_api" \
  -H "Content-Type: application/sparql-query" \
  -d "SELECT * WHERE { ?s ?p ?o } LIMIT 10"

Paramètres disponibles

ParamètreDescriptionExemple
query La requête SPARQL (URL encodée en GET) SELECT * WHERE { ?s ?p ?o }
format Format de réponse json, xml, csv, ttl, rdfxml
limit Nombre maximum de résultats 100 (défaut), 1000 max
timeout Temps maximum d'exécution (secondes) 30 (défaut), 120 max
03

📊 Types de requêtes SPARQL

SELECT - Extraire des données

PREFIX schema: 
PREFIX foaf: 

SELECT ?nom ?dateNaissance
WHERE {
  ?orateur a foaf:Person ;
           foaf:name ?nom ;
           schema:birthDate ?dateNaissance .
}
ORDER BY ?dateNaissance
LIMIT 20

CONSTRUCT - Créer un nouveau graphe

PREFIX schema: 

CONSTRUCT {
  ?orateur schema:name ?nom .
}
WHERE {
  ?orateur a schema:Person ;
           schema:name ?nom .
}

ASK - Tester l'existence

ASK {
  ?discours schema:author  .
}

DESCRIBE - Décrire une ressource

DESCRIBE 
04

🎯 Exemples concrets

1. Tous les orateurs

curl -X POST https://lemondesemantique.fr/api/sparql \
  -H "X-API-Key: votre_clé" \
  -H "Content-Type: application/sparql-query" \
  -d "PREFIX foaf: 
      SELECT ?nom WHERE {
        ?orateur a foaf:Person ;
                 foaf:name ?nom .
      } ORDER BY ?nom"

2. Discours d'un orateur spécifique

curl -X POST https://lemondesemantique.fr/api/sparql \
  -H "X-API-Key: votre_clé" \
  -H "Content-Type: application/sparql-query" \
  -d "PREFIX schema: 
      SELECT ?titre ?date WHERE {
        
            schema:author ?discours .
        ?discours schema:title ?titre ;
                  schema:date ?date .
      } ORDER BY ?date"

3. Recherche par mot-clé dans les discours

curl -X POST https://lemondesemantique.fr/api/sparql \
  -H "X-API-Key: votre_clé" \
  -H "Content-Type: application/sparql-query" \
  -d "PREFIX schema: 
      SELECT ?titre ?contenu WHERE {
        ?discours schema:title ?titre ;
                  schema:content ?contenu .
        FILTER(CONTAINS(?contenu, 'résistance'))
      }"

4. Graphe de connaissances (2 sauts)

curl -X POST https://lemondesemantique.fr/api/sparql \
  -H "X-API-Key: votre_clé" \
  -H "Content-Type: application/sparql-query" \
  -d "PREFIX ex: 
      SELECT ?orateur1 ?orateur2 ?discoursCommun WHERE {
        ?orateur1 ex:aPrononce ?discoursCommun .
        ?orateur2 ex:aPrononce ?discoursCommun .
        FILTER(?orateur1 != ?orateur2)
      } LIMIT 10"
📝 Réponse JSON :
{
  "head": { "vars": ["nom", "dateNaissance"] },
  "results": {
    "bindings": [
      { "nom": { "value": "Victor Hugo" }, "dateNaissance": { "value": "1802-02-26" } },
      { "nom": { "value": "Charles de Gaulle" }, "dateNaissance": { "value": "1890-11-22" } }
    ]
  }
}
05

📄 Formats de réponse

L'API SPARQL supporte plusieurs formats via le paramètre format ou le header Accept.

FormatParamètre formatAccept Header
JSON json application/json
XML xml application/xml
CSV csv text/csv
TSV tsv text/tab-separated-values
Turtle (RDF) ttl text/turtle
RDF/XML rdfxml application/rdf+xml
💡 Astuce : Pour les requêtes CONSTRUCT, privilégiez les formats RDF (Turtle, RDF/XML). Pour SELECT, utilisez JSON ou CSV.
06

🔗 Intégration dans vos applications

Python avec SPARQLWrapper

from SPARQLWrapper import SPARQLWrapper, JSON

sparql = SPARQLWrapper("https://lemondesemantique.fr/api/sparql")
sparql.setCredentials("", "votre_clé_api", "X-API-Key")
sparql.setQuery("""
    PREFIX foaf: 
    SELECT ?nom WHERE {
        ?orateur a foaf:Person ;
                 foaf:name ?nom .
    } LIMIT 10
""")
sparql.setReturnFormat(JSON)
results = sparql.query().convert()

for result in results["results"]["bindings"]:
    print(result["nom"]["value"])

JavaScript / Node.js

const query = `
  PREFIX foaf: 
  SELECT ?nom WHERE {
    ?orateur a foaf:Person ;
             foaf:name ?nom .
  } LIMIT 10
`;

fetch('https://lemondesemantique.fr/api/sparql', {
  method: 'POST',
  headers: {
    'X-API-Key': 'votre_clé_api',
    'Content-Type': 'application/sparql-query'
  },
  body: query
})
.then(response => response.json())
.then(data => console.log(data));

PHP

$ch = curl_init('https://lemondesemantique.fr/api/sparql');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'X-API-Key: votre_clé_api',
    'Content-Type: application/sparql-query'
]);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
$response = curl_exec($ch);
$data = json_decode($response, true);
07

⚠️ Bonnes pratiques et limites

Bonnes pratiques

  • ✅ Utilisez POST pour les requêtes longues
  • ✅ Spécifiez LIMIT pour éviter des résultats trop volumineux
  • ✅ Utilisez des PREFIX pour améliorer la lisibilité
  • ✅ Préférez DESCRIBE à SELECT * pour explorer une ressource
  • ✅ Testez vos requêtes sur l'interface web avant intégration

Limites techniques

LimiteValeur
Timeout maximum120 secondes
LIMIT maximum10 000 résultats
Taille requête10 MB
Requêtes par minute (gratuit)60
Requêtes par minute (pro)600
⚠️ Attention : Les requêtes non optimisées sur de grands graphes peuvent être lentes. Utilisez des filtres et des limites pour améliorer les performances.