Aller au contenu

TP : Linked Open Data & SPARQL

SPARQL DBpedia Outil

Auteurs


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 :

  1. Ouvrez yasgui.triply.cc dans votre navigateur.
  2. L’endpoint par défaut est DBpedia (https://dbpedia.org/sparql) — parfait pour la Partie 1.
  3. Pour changer d’endpoint (Partie 2), cliquez sur l’URL en haut de l’interface et remplacez-la.
  4. Tapez votre requête dans la zone de texte, puis cliquez sur Run (ou Ctrl+Entrée).
  5. 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

foaf : http://xmlns.com/foaf/0.1/
rdf : http://www.w3.org/1999/02/22-rdf-syntax-ns#
rdfs : http://www.w3.org/2000/01/rdf-schema#
dbo : http://dbpedia.org/ontology/
dbr : http://dbpedia.org/resource/
dbp : http://dbpedia.org/property/
xsd : http://www.w3.org/2001/XMLSchema#

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)

  1. 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 !).

  1. 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.

  2. Afficher les noms des lyonnais ne contenant pas de virgule (fonction contains).


Bloc 2 — Filtres et dates (requêtes 4 à 6)

  1. Afficher les noms (sans virgule) et dates de naissance des lyonnais.

  2. Afficher les noms et dates de naissance des lyonnais nés après 1900 (FILTER(year(?date)>1900)).

  3. 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).


Bloc 3 — Relations spatiales (requêtes 7 et 8)

  1. Afficher les noms de tous les lyonnais morts à Lyon.

  2. 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
?deathPlace a ?deathPlaceType.
FILTER ((?deathPlaceType = dbo:Country && ?deathPlace != dbr:France) || 
    (?deathPlaceType = dbo:City && NOT EXISTS { ?deathPlace dbo:country dbr:France }))

Bloc 4 — Relations entre entités (requêtes 9 à 11)

  1. Afficher toutes les villes françaises dont le maire est natif de cette même ville.

  2. Afficher tous les maires français (i.e. d’une ville de France) nés hors de France.

  3. Afficher tous les maires nés hors du pays où ils sont maires (requête généralisée, toutes nationalités).


Bloc 5 — Agrégation (requêtes 12 à 14)

  1. Afficher le nombre de maires français nés hors de France (COUNT).

  2. Afficher pour 10 villes françaises le nombre de natifs présents dans DBpedia (GROUP BY, LIMIT).

  3. 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).


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 :

    1. Le SPARQL endpoint utilisé (ex. http://data.nobelprize.org/sparql).
    2. Le dessin RDF de la requête — vous pouvez utiliser diagrams.net.
    3. Le code SPARQL de la requête (que nous puissions la rejouer).
    4. Les 3 ou 4 premiers résultats (capture d’écran).
  • 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 :

SELECT ?obj (COUNT(?sub) AS ?count)
WHERE { ?sub a ?obj . }
GROUP BY ?obj
ORDER BY DESC(?count)
LIMIT 20

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.


  1. Prix Nobelaccè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


  1. War Sampoaccè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
PREFIX prisoners: <http://ldf.fi/schema/warsa/prisoners/>

SELECT ?causeDeath (COUNT(?causeDeath) AS ?count)
WHERE {
  ?p prisoners:cause_of_death ?causeDeath;
}
GROUP BY ?causeDeath
ORDER BY DESC(?count)
LIMIT 50


  1. WikiDataaccè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". }
}


  1. Yagoaccès au endpoint
Exemple — propriétés d'Elvis Presley
PREFIX yago: <http://yago-knowledge.org/resource/>

SELECT ?property (GROUP_CONCAT(DISTINCT ?valueOrObject; separator=", ") AS ?values)
WHERE {
    yago:Elvis_Presley ?property ?valueOrObject .
} 
GROUP BY ?property


  1. European Patent Ontologyaccè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


  1. Bibliothèque Nationale de Franceaccès au endpoint
Exemple — auteurs avec dates de naissance et de décès
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX bio: <http://vocab.org/bio/0.1/>

SELECT ?auteur ?jour ?date1 ?date2 ?nom
WHERE {
  ?auteur foaf:birthday ?jour;
          bio:birth ?date1;
          bio:death ?date2.
  OPTIONAL { ?auteur foaf:name ?nom. }
}
ORDER BY (?jour)
LIMIT 100


  1. Musiekwebaccès au endpoint

Base de données musicale néerlandaise (artistes, albums, enregistrements).

Exemple #1 — liste d'artistes
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX vocab: <https://data.muziekweb.nl/vocab/>

SELECT *
WHERE {
  ?artist a vocab:Performer;
          rdfs:label ?artistlabel.
}
LIMIT 10


Exemple #2 — propriétés disponibles
PREFIX vocab: <https://data.muziekweb.nl/vocab/>

SELECT DISTINCT ?prop
WHERE {
  ?artist a vocab:Performer;
          ?prop ?val.
}


  1. OpenStreetMap via QLeverinterface · 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)
PREFIX osmkey: <https://www.openstreetmap.org/wiki/Key:>

SELECT ?hopital ?nom WHERE {
  ?hopital osmkey:amenity "hospital" ;
           osmkey:name ?nom .
}
LIMIT 20


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
  1. DBLPaccè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é
PREFIX dblp: <https://dblp.org/rdf/schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

SELECT ?school (COUNT(DISTINCT ?thesis) AS ?count) WHERE {
  ?thesis rdf:type dblp:Book ;
          dblp:thesisAcceptedBySchool ?school .
}
GROUP BY ?school 
ORDER BY DESC(?count)
LIMIT 20


  1. Europeanaaccè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


  1. ScholarlyDataaccè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


  1. Autres