TP : Linked Open Data & SPARQL
Auteurs
- Stéphane Derrode & Lamia Derrode, Centrale Lyon, Dpt Mathématiques & Informatique
Organisation de la séance (4h)¶
| Durée | Activité |
|---|---|
| ~15 min | Introduction : mini-cours LOD & SPARQL |
| ~2h30 | Partie 1 — 14 requêtes guidées sur DBpedia |
| ~1h15 | Partie 2 — Requête originale sur une base LOD de votre choix |
| ~30 min | Rédaction et dépôt du compte-rendu (début ; à finaliser chez vous) |
⚠️ Compte-rendu : le rendu est individuel et doit être déposé sur Pedagogie3 en respectant la deadline communiquée en début de séance.
Objectifs¶
- Maîtriser les bases du langage SPARQL pour interroger un graphe RDF.
- Répondre à 14 requêtes guidées sur la base DBpedia.
- Concevoir une requête originale sur une base Linked Open Data de votre choix.
Références utiles :
- Spécification officielle : SPARQL 1.1 Query Language
- Aide-mémoire : SPARQL By Example — Cheat Sheet
- Préfixes : prefix.cc
- Validateur et reformatteur de requêtes : SPARQL query-validator
- Pour aller plus loin : le dossier du TP contient testPythonSparQL.py et testDBPedia.ipynb — ressources optionnelles pour interroger SPARQL depuis Python avec la librairie SPARQLWrapper.
Table des matières¶
Démarrage avec Yasgui¶
Pour toutes les requêtes de ce TP, vous utiliserez le client en ligne Yasgui — aucune installation requise.
Prise en main rapide :
- Ouvrez yasgui.triply.cc dans votre navigateur.
- L’endpoint par défaut est DBpedia (
https://dbpedia.org/sparql) — parfait pour la Partie 1. - Pour changer d’endpoint (Partie 2), cliquez sur l’URL en haut de l’interface et remplacez-la.
- Tapez votre requête dans la zone de texte, puis cliquez sur Run (ou
Ctrl+Entrée). - Les résultats s’affichent sous forme de tableau dans l’onglet Table.
💡 Bonne pratique : ajoutez toujours un
LIMIT 100à vos requêtes exploratoires pour éviter les timeouts et les résultats excessifs. Retirez-le seulement quand vous êtes sûr de votre requête.
Travaux pratiques sur DBpedia¶
Quelques URIs utiles¶
| foaf:Person | Classe | Classe des personnes |
| dbo:Country | Classe | Classe des pays |
| dbo:City | Classe | Classe des villes |
| foaf:name | Propriété | Nom d’une personne (entre autres) |
| dbo:birthDate | Propriété | Date de naissance d’une personne |
| dbo:birthPlace | Propriété | Lieu de naissance d’une personne |
| dbo:deathDate | Propriété | Date de décès d’une personne |
| dbo:deathPlace | Propriété | Lieu de décès d’une personne |
| dbo:city | Propriété | Ville |
| dbo:country | Propriété | Pays auquel un lieu appartient |
| dbo:mayor | Propriété | Maire d’une ville |
| dbr:Lyon | Instance | La ville de Lyon |
| dbr:France | Instance | La France |
Préfixes utilisés pour accéder aux vocabulaires¶
Pour trouver un préfixe inconnu, consultez prefix.cc.
14 requêtes à programmer¶
TIP : pour vérifier et reformater une requête, utilisez sparql.org/query-validator.
Bloc 1 — Sélection simple (requêtes 1 à 3)¶
- Afficher les URLs des lyonnais (i.e. personnes nées à Lyon). Voici la réponse attendue pour vous aider à démarrer avec Yasgui :
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbr: <http://dbpedia.org/resource/>
SELECT ?p
WHERE {
?p a foaf:Person;
dbo:birthPlace dbr:Lyon.
}
Vérifier que préciser ou non ?p comme une personne ne change pas le résultat (la propriété dbo:birthPlace ne s’applique qu’aux personnes dans DBpedia, il n’est donc pas besoin de préciser qu’on en cherche une !).
Auto-évaluation — Q1
Vous devez obtenir un peu plus de mille URI (l’effectif fluctue avec les mises à jour de DBpedia, prévoir un ordre de grandeur de 1 000–1 500), une seule colonne ?p, par exemple :
http://dbpedia.org/resource/Antoine_de_Saint-Exupéry
http://dbpedia.org/resource/Bertrand_Tavernier
http://dbpedia.org/resource/Bernard_Pivot
…
- Afficher les URLs et les noms (
foaf:name) des lyonnais (i.e. personnes nées à Lyon), dans l’ordre alphabétique. Pourquoi certains lyonnais portent un nom vide ? (TIP : allez voir leur fiche DBpedia). Il ne vous est pas demandé de résoudre ce problème.
Auto-évaluation — Q2 (solution de référence)
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT *
WHERE {
?p dbo:birthPlace dbr:Lyon ; foaf:name ?name .
}
ORDER BY ASC(?name)
?p, ?name). Le tri alphabétique fait remonter en premier les personnes dont le nom est une chaîne vide (les caractères “vides” précèdent les autres dans l’ordre Unicode). En cliquant sur leur fiche DBpedia, on constate qu’ils n’ont pas de propriété foaf:name renseignée — un trou de données dans la source.
- Afficher les noms des lyonnais ne contenant pas de virgule (fonction
contains).
Auto-évaluation — Q3 (solution de référence)
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbr: <http://dbpedia.org/resource/>
SELECT DISTINCT ?p ?name ?strname
WHERE {
?p dbo:birthPlace dbr:Lyon;
foaf:name ?name.
BIND(str(?name) AS ?strname)
FILTER(!contains(?strname, ','))
}
ORDER BY ASC(?name)
BIND(str(?name) AS ?strname) pour pouvoir appliquer contains sur la forme littérale (et non sur le triple (littéral, langue)). Vous devez perdre quelques centaines de résultats par rapport à Q2 (les noms du type “Nom, Prénom”).
Bloc 2 — Filtres et dates (requêtes 4 à 6)¶
- Afficher les noms (sans virgule) et dates de naissance des lyonnais.
Auto-évaluation — Q4 (solution de référence)
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbr: <http://dbpedia.org/resource/>
SELECT DISTINCT ?p ?strname ?bdate
WHERE {
?p dbo:birthPlace dbr:Lyon;
foaf:name ?name;
dbo:birthDate ?bdate.
BIND(str(?name) AS ?strname)
FILTER(strlen(?name) != 0)
FILTER(!contains(?name, ","))
}
ORDER BY ASC(?strname)
dbo:birthDate.
-
Afficher les noms et dates de naissance des lyonnais nés après 1900 (
FILTER(year(?date)>1900)). -
Afficher les noms et dates de naissance des lyonnais nés après 1900 avec, le cas échéant, leur date de décès (
OPTIONAL).
Auto-évaluation — Q5 et Q6 (solution combinée)
Q5 et Q6 partagent la même structure ; Q6 ajoute simplement le bloc OPTIONAL { ?p dbo:deathDate ?ddate }.
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT ?p ?strname ?bdate ?ddate
WHERE {
?p dbo:birthPlace dbr:Lyon;
foaf:name ?name;
dbo:birthDate ?bdate.
BIND(str(?name) AS ?strname)
FILTER(strlen(?name) != 0)
FILTER(!contains(?name, ","))
FILTER(?bdate >= "1900"^^xsd:gYear)
OPTIONAL { ?p dbo:deathDate ?ddate } # retirer cette ligne pour Q5
}
ORDER BY ASC(?bdate)
?ddate est vide pour les lyonnais encore vivants — c’est exactement le rôle de OPTIONAL. Si toutes vos lignes ont une date de décès, votre OPTIONAL est mal placé (probablement combiné avec un FILTER à l’extérieur).
Bloc 3 — Relations spatiales (requêtes 7 et 8)¶
- Afficher les noms de tous les lyonnais morts à Lyon.
Auto-évaluation — Q7 (solution de référence)
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbr: <http://dbpedia.org/resource/>
SELECT ?p ?strname ?ddate
WHERE {
?p dbo:birthPlace dbr:Lyon;
foaf:name ?name;
dbo:deathPlace dbr:Lyon.
BIND(str(?name) AS ?strname)
FILTER(strlen(?name) != 0)
FILTER(!contains(?name, ","))
OPTIONAL { ?p dbo:deathDate ?ddate }
}
ORDER BY DESC(?ddate)
- Afficher les noms de tous les lyonnais morts hors de France.
On est obligé de distinguer le cas où le lieu de décès est un pays ou une ville : si c’est un pays, il suffit de vérifier que ce n’est pas la France ; si c’est une ville, il faut vérifier que cette ville n’est pas en France.
Piste si vous bloquez
Auto-évaluation — Q8 (solution de référence simplifiée)
Une formulation plus simple que la piste : on impose que le lieu de décès soit lié à un pays différent de la France via dbo:country.
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
SELECT ?p ?strname ?dcountry ?ddate
WHERE {
?p dbo:birthPlace dbr:Lyon;
foaf:name ?name;
dbo:deathPlace ?dplace.
?dplace dbo:country ?dcountry.
FILTER(?dcountry != dbr:France)
BIND(str(?name) AS ?strname)
FILTER(strlen(?name) != 0)
FILTER(!contains(?name, ","))
OPTIONAL { ?p dbo:deathDate ?ddate }
}
ORDER BY DESC(?ddate)
?dplace est directement un pays (et n’a donc pas de dbo:country lui-même). La piste de l’énoncé est plus rigoureuse — utile à discuter en groupe.
Bloc 4 — Relations entre entités (requêtes 9 à 11)¶
- Afficher toutes les villes françaises dont le maire est natif de cette même ville.
Auto-évaluation — Q9 (solution de référence)
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbr: <http://dbpedia.org/resource/>
PREFIX dbp: <http://dbpedia.org/property/>
SELECT ?strmayorname ?cityname
WHERE {
?city dbo:country dbr:France;
dbo:mayor ?mayor;
dbp:name ?cityname.
?mayor dbo:birthPlace ?city;
foaf:name ?mayorname.
BIND(str(?mayorname) AS ?strmayorname)
FILTER(strlen(?mayorname) != 0)
}
?city dans dbo:birthPlace ?city — c’est ce qui force l’égalité (lieu de naissance = ville où il est maire). Plusieurs dizaines de résultats attendus.
- Afficher tous les maires français (i.e. d’une ville de France) nés hors de France.
Auto-évaluation — Q10 (solution de référence)
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbr: <http://dbpedia.org/resource/>
SELECT ?strmayorname ?country
WHERE {
?city dbo:country dbr:France;
dbo:mayor ?mayor.
?mayor foaf:name ?mayorname;
dbo:birthPlace ?bplace.
?bplace dbo:country ?country.
FILTER(?country != dbr:France)
BIND(str(?mayorname) AS ?strmayorname)
}
France dans la colonne ?country.
- Afficher tous les maires nés hors du pays où ils sont maires (requête généralisée, toutes nationalités).
Auto-évaluation — Q11 (solution de référence)
Q10 généralisé : on remplace dbr:France par une variable ?mcountry côté ville.
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbr: <http://dbpedia.org/resource/>
SELECT ?strmayorname ?city ?mcountry ?bcountry
WHERE {
?city dbo:country ?mcountry;
dbo:mayor ?mayor.
?mayor dbo:birthPlace ?bplace;
foaf:name ?mayorname.
?bplace dbo:country ?bcountry.
FILTER(?mcountry != ?bcountry)
BIND(str(?mayorname) AS ?strmayorname)
}
!= et non =).
Bloc 5 — Agrégation (requêtes 12 à 14)¶
- Afficher le nombre de maires français nés hors de France (
COUNT).
Auto-évaluation — Q12 (solution de référence)
Une seule ligne, une seule colonne. La valeur attendue est de l’ordre de quelques dizaines (souvent 30-60 selon l’état de DBpedia). Si vous obtenez 0, votre filtre est inversé.- Afficher pour 10 villes françaises le nombre de natifs présents dans DBpedia (
GROUP BY,LIMIT).
Auto-évaluation — Q13 (solution de référence)
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbr: <http://dbpedia.org/resource/>
SELECT ?ville (COUNT(?p) AS ?nb_natifs)
WHERE {
?ville dbo:country dbr:France.
?p dbo:birthPlace ?ville.
}
GROUP BY ?ville
LIMIT 10
ORDER BY, les 10 villes affichées sont arbitraires — c’est l’objectif de cet exercice (préparer Q14). Vous devez voir 2 colonnes : ?ville (URI) et ?nb_natifs (entier).
- Afficher les 10 villes ayant le plus de natifs dans DBpedia, triées dans l’ordre décroissant du nombre de natifs (
GROUP BY,ORDER BY DESC,LIMIT).
Auto-évaluation — Q14 (solution de référence)
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbr: <http://dbpedia.org/resource/>
SELECT ?ville (COUNT(?p) AS ?nb_natifs)
WHERE {
?ville dbo:country dbr:France.
?p dbo:birthPlace ?ville.
}
GROUP BY ?ville
ORDER BY DESC(?nb_natifs)
LIMIT 10
ORDER BY (manque le DESC ?).
Requête originale sur une base Linked Data¶
Consignes pour le compte-rendu¶
Énoncé : choisissez une base de données Linked Open Data (autre que DBpedia) et inventez une (1) requête originale sur cette base. Des exemples de bases sont proposés ci-dessous. Pour les étudiants les moins à l’aise, il est conseillé d’utiliser la base des Prix Nobel.
Le compte-rendu porte uniquement sur cette partie du TP. C’est un travail personnel et le rendu est donc individuel. Déposez votre CR sur Pedagogie3 en respectant les consignes suivantes :
-
Rédigez un rapport court (1 à 1,5 page) comprenant :
- Le SPARQL endpoint utilisé (ex.
http://data.nobelprize.org/sparql). - Le dessin RDF de la requête — vous pouvez utiliser diagrams.net.
- Le code SPARQL de la requête (que nous puissions la rejouer).
- Les 3 ou 4 premiers résultats (capture d’écran).
- Le SPARQL endpoint utilisé (ex.
-
Si votre CR est au format PDF, copiez également votre requête dans un fichier texte séparé (les copier-coller depuis un PDF sont souvent problématiques).
-
Nommez votre archive
VotreNom_rendu1.zip(ou.rar,.tgz) et déposez un seul fichier sur l’espace Moodle de votre groupe de TP. -
La note prend en compte l’originalité de la requête et la qualité du code. Attention à la triche : si votre requête est retrouvée sur Internet ou dans un autre rendu, la note attribuée est 0/20.
-
Téléchargez avec ce lien un exemple de rendu conforme aux consignes.
Bases LoD disponibles¶
💡 Conseil avant de commencer : vérifiez toujours qu’un endpoint répond avant d’investir du temps dessus. Lancez d’abord cette requête générique pour découvrir les classes les plus représentées :
Beaucoup de bases référencées sur des moteurs de recherche LOD sont inaccessibles (obsolètes). Les bases listées ci-dessous ont été testées en avril 2026 — les endpoints LOD peuvent devenir inaccessibles sans préavis.
- Prix Nobel — accès au endpoint
La description de la structure des données est disponible sur ce lien — bien faite et relativement simple.
Exemple
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX nobel: <http://data.nobelprize.org/terms/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT DISTINCT ?name ?year WHERE {
?person a nobel:Laureate;
rdfs:label ?name;
nobel:laureateAward ?award.
?award nobel:year ?year.
} ORDER BY DESC(?year) LIMIT 20
- War Sampo — accès au endpoint
War Sampo documente la guerre de Continuation en Finlande (Seconde Guerre mondiale). ⚠️ Les libellés de données sont en finnois et suédois — les résultats peuvent être difficiles à interpréter sans traducteur.
Exemple
- WikiData — accès au endpoint
Les propriétés et classes sont codées (wd:Q6256, wdt:P31) ce qui rend les requêtes peu lisibles. En revanche, l’interface query.wikidata.org offre une autocomplétion intelligente, des centaines d’exemples prêts à l’emploi et un éditeur visuel. À préférer si votre sujet porte sur des faits contemporains non couverts par DBpedia.
Exemple — pays membres de l'UE
PREFIX bd: <http://www.bigdata.com/rdf#>
PREFIX wikibase: <http://wikiba.se/ontology#>
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
SELECT ?object ?objectLabel
WHERE {
?object wdt:P31 wd:Q6256.
?object wdt:P463 wd:Q458.
SERVICE wikibase:label { bd:serviceParam wikibase:language "fr,en". }
}
- Yago — accès au endpoint
Exemple — propriétés d'Elvis Presley
- European Patent Ontology — accès au endpoint
La description de la structure est disponible ici.
Exemple — demandes de brevet récentes
PREFIX patent: <http://data.epo.org/linked-data/def/patent/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT ?application ?appNum ?filingDate ?authority {
?application rdf:type patent:Application ;
patent:applicationNumber ?appNum ;
patent:filingDate ?filingDate ;
patent:applicationAuthority ?authority.
} LIMIT 10
- Bibliothèque Nationale de France — accès au endpoint
Exemple — auteurs avec dates de naissance et de décès
- Musiekweb — accès au endpoint
Base de données musicale néerlandaise (artistes, albums, enregistrements).
Exemple #1 — liste d'artistes
Exemple #2 — propriétés disponibles
- OpenStreetMap via QLever — interface · endpoint Yasgui :
https://qlever.dev/api/osm-planet
Données OpenStreetMap converties en RDF, maintenues par l’Université de Fribourg-en-Brisgau. Les objets géographiques (rues, bâtiments, points d’intérêt) sont décrits avec des tags OSM (osmkey:amenity, osmkey:name…) et leurs géométries (geo:hasGeometry). Des requêtes spatiales sont possibles via les prédicats GeoSPARQL standard (ogc:sfContains, ogc:sfIntersects).
💡 L’interface native de QLever (qlever.dev/osm-planet) propose des exemples intégrés et une autocomplétion. Pour utiliser Yasgui, entrez l’URL SPARQL ci-dessus à la place de l’URL de DBpedia.
Exemple A — hôpitaux (requête simple par tag)
Exemple B — cafés à Lyon (requête spatiale avec GeoSPARQL)
La ville de Lyon est identifiée dans OSM par la relation `71525`. Le prédicat `ogc:sfContains` teste la **contenence géographique** : il filtre les entités situées à l'intérieur du périmètre administratif de Lyon.PREFIX osmkey: <https://www.openstreetmap.org/wiki/Key:>
PREFIX osmrel: <https://www.openstreetmap.org/relation/>
PREFIX ogc: <http://www.opengis.net/rdf#>
PREFIX geo: <http://www.opengis.net/ont/geosparql#>
SELECT ?cafe ?nom ?geometrie WHERE {
osmrel:71525 ogc:sfContains ?cafe .
?cafe osmkey:amenity "cafe" ;
osmkey:name ?nom .
OPTIONAL { ?cafe geo:hasGeometry/geo:asWKT ?geometrie . }
}
LIMIT 30
- DBLP — accès au endpoint
Base de référence en informatique : articles, conférences, thèses, auteurs. Interface humaine disponible sur dblp.org.
Exemple — thèses par université
- Europeana — accès au endpoint
Portail du patrimoine culturel européen : tableaux, livres, musiques, films issus de milliers de musées et bibliothèques. Documentation disponible sur pro.europeana.eu.
Exemple — enregistrements sonores
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX edm: <http://www.europeana.eu/schemas/edm/>
PREFIX ore: <http://www.openarchives.org/ore/terms/>
SELECT ?item ?title ?creator ?mediaURL
WHERE {
?item edm:type "SOUND";
ore:proxyIn ?proxy;
dc:title ?title;
dc:creator ?creator.
?proxy edm:isShownBy ?mediaURL.
}
LIMIT 10
OFFSET 100
- ScholarlyData — accès au endpoint
Base de données sur les publications, auteurs, organisations et événements de la communauté Web sémantique.
Exemple — articles sur le Big Data
PREFIX conf: <https://w3id.org/scholarlydata/ontology/conference-ontology.owl#>
SELECT DISTINCT ?title ?name ?keyword
WHERE {
?paper a conf:InProceedings;
conf:hasAuthorList ?authorList;
conf:title ?title;
conf:keyword ?keyword.
?authorList conf:hasFirstItem ?item.
?item conf:hasContent ?person.
?person conf:name ?name.
FILTER(contains(?keyword, "Big Data"))
}
LIMIT 20
- Autres
- Bio2RDF — données biologiques et médicales (génomes, médicaments, maladies)
- The Linked Open Data Cloud — répertoire de toutes les bases LOD disponibles