Requêter le contenu de DBPedia avec SPARQL

Le W3C a défini des standards pour l’accès aux données brutes, via l’approche du “web sémantique” ou “web des données” qui seul permet une réutilisation généralisée des données, par la mise en réseau massive des silos de données ouvertes où qu’ils se trouvent sur le web. 
Ces standards publiés par le W3C s’appellent RDFOWL et SPARQL. Ils sont désormais matures et de nombreux outils existent pour les mettre en œuvre.

La donnée brute en RDF, publiée dans le nuage du “Linked Open Data” est la seule vraie façon pérenne de permettre une ré exploitation massive des données. Il suffit de regarder la croissance de ce nuage depuis 2007 pour remarquer la puissance grandissante de ce phénomène.

2007

2009

2011

Afin de nous familiariser avec le langage de requête SPARQL, nous avons exécuté plusieurs requêtes sur l’un des noyaux du Web émergent de l’Open Data : DBPedia.

DBPedia est la plus grosse base de données RDF actuelle pour le Web sémantique. C’est avant tout un projet communautaire permettant d’extraire les articles contenus sur Wikipédia sous forme de triplets RDF, afin de rendre ces informations utilisables par les méthodes du Web sémantique. Les données peuvent être soit consultées en ligne, soit téléchargées. DBPedia est mis à jour très régulièrement pour ajouter les nouvelles pages de Wikipédia, ce qui veut dire qu’un article sur Wikipédia n’est pas forcément disponible sur DBPedia.

SPARQL, pour SPARQL Protocole and RDF Query Language, est un langage de requêtes RDF. Ce langage est très proche d’un autre langage de requêtes traditionnel : SQL (Structured Query Language).

Pour accéder aux données, on peut effectuer des requêtes sur DBPedia en se connectant sur un serveur de requêtes SPARQL de DBPedia : http://dbpedia.org/sparql.

Nous allons maintenant analyser quelques requêtes que nous avons pu écrire et tester.

Tout d’abord, il faut définir les préfixes. Le “PREFIX” est grosso modo l’équivalent SPARQL de la déclaration d’espaces de noms (namespace) en XML : il associe un libellé court à une URI précise. Exactement comme pour les espaces de noms, le libellé ne contient pas de signification particulière : c’est juste un libellé. Il permet de ne pas avoir à réécrire l’URI dans le corps des requêtes. Voici les préfixes que nous avons utilisé :

PREFIX : <http://dbpedia.org/resource/>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dbpedia: <http://dbpedia.org/>
PREFIX dbpedia2: <http://dbpedia.org/property/>
PREFIX dbpedia3: <http://dbpedia.org/ontology/>

Le vrai début de la requête est le mot SELECT. Comme dans une requête SQL, SELECT permet de définir les données que la requête doit récupérer.

Voici donc quelques requêtes SPARQL :

Personnes recensées sur DBPedia, qui sont nées à Rennes, après 1900, même si elles sont mortes.

SELECT DISTINCT ?person ?birth ?death
WHERE
{
 ?person dbpedia2:birthPlace <http://dbpedia.org/resource/Rennes>.
 ?person dbpedia3:birthDate ?birth.
 OPTIONAL {?person dbpedia3:deathDate ?death}.
 FILTER (?birth > "1900-01-01"^^xsd:date).
}

L’utilisation du mot clé FILTER permet de filtrer les résultats afin de récupérer seulement les personnes né après 1er janvier 1900. Le mot clé OPTIONNAL permet de dire que l’on souhaite récupérer aussi la date de décès si elle est indiquée dans la ressource.

Liste des département de la région “Pays de la Loire”.

SELECT distinct ?departement
WHERE
{
 ?departement dbpedia3:isPartOf <http://dbpedia.org/resource/Pays_de_la_Loire>
}

Communes du Finistère dont la population est supérieure à 50000 habitants.

SELECT distinct ?communes ?population
WHERE
{
 ?communes dbpedia3:department <http://dbpedia.org/resource/Finist%C3%A8re>.
 ?communes dbpedia3:populationTotal ?population.
 FILTER (?population > 50000)
}

Les villes de Brest et de Quimper sont retournées.

Communes du finistère dont la population est inférieure à 50000 habitants et dont le nom commence par “Plou”.

SELECT DISTINCT ?commune ?population
WHERE
{
 ?commune dbpedia3:department <http://dbpedia.org/resource/Finist%C3%A8re>.
 ?commune dbpedia3:populationTotal ?population.
 FILTER (?population < 50000).
 FILTER (regex(?commune, "/Plou"))
}

SPARQL fournit une opération pour tester les chaînes de caractères, basée sur les expressions régulières : la fonction regex permet donc d'extraire les communes qui commencent par "Plou".

 Nom et prénom des personnes nées à Brest, qui sont ou ont été footballeur. Les résultats doivent être triées par ordre croissant des noms et des prénoms.

SELECT DISTINCT ?surname ?givenname
WHERE
{
 ?person dbpedia3:birthPlace <http://dbpedia.org/resource/Brest,_France>.
 ?person dbpedia2:shortDescription "Footballer"@en.
 ?person foaf:givenName ?givenname.
 ?person foaf:surname ?surname
}
ORDER BY ?surname ?givenname

Nom, prénom et club des personnes qui ont entraîné les clubs de football de Guingamp ou de Brest et qui sont françaises.

SELECT DISTINCT ?givenname ?surname ?clubs
WHERE
{
 ?person rdf:type dbpedia3:SoccerManager.
 ?person dbpedia2:managerclubs ?clubs.
 ?person foaf:givenName ?givenname.
 ?person foaf:surname ?surname.
 ?person dbpedia2:birthPlace <http://dbpedia.org/resource/France>.
 { ?clubs dbpedia2:fullname "En Avant de Guingamp"@en }
 UNION
 { ?clubs dbpedia2:fullname "Stade Brestois 29"@en }
}
ORDER BY ?clubs ?givenname

Le mot clé UNION permet de spécifier que le club de foot entraîné peut être soit Guingamp, soit Brest.

Liste des chansons de Jean-Jacques Goldman qui sont sorties en 1988.

SELECT DISTINCT ?chansons ?certification
WHERE
{
 ?chansons dbpedia3:writer <http://dbpedia.org/resource/Jean-Jacques_Goldman>.
 ?chansons dbpedia2:certification ?certification.
 FILTER (regex(?certification, "1988"))
}

Il est donc possible de comprendre assez rapidement les rudiments de SPARQL, étant donné la similarité entre SPARQL et SQL. Le fait d’écrire ces requêtes permet également de bien comprendre le principe des ontologies et de la façon dont sont organisées les données. Ce dernier exercice nous a donc permis de comprendre beaucoup de choses que nous avions étudié pendant notre module.

Sources :

http://blog.antidot.net/2011/12/08/grande-semaine-pour-lopen-data-francais/
http://fr.dbpedia.org/wiki/Exemples_SPARQL
http://pagesperso-systeme.lip6.fr/Jean-Francois.Perrot/inalco/XML/RDF/SPARQL/IntroSPARQL.html#mozTocId530787
http://www.w3.org/standards/techs/sparql#w3c_all
http://www.w3.org/TR/rdf-sparql-query/
This entry was posted in Uncategorized. Bookmark the permalink.

Leave a Reply

Your email address will not be published. Required fields are marked *