Comment interroger la Bnf et Wikidata avec Sparql ?

Le web de données (linked data) permet de formaliser la publication de données structurées sur le web en les reliant entre elles et les rendant disponibles. Un document structuré est un ensemble de triplets: sujet, prédicat, objet. Le sujet et l’objet peuvent eux même être identifiés par une URL décrivant un autre document. RDF est un modèle destiné à décrire les ressources du web de données. Il peut s’exprimer dans plusieurs formats comme xml, n3, nt, json-ld etc.)

Nous pouvons interroger librement certains réservoirs de données en Sparql. Ce langage permet d’exprimer des requêtes. C’est l’objet de mon billet de blog. Je me suis demandée ce que je pouvais récupérer comme données provenant de la Bnf et Wikidata en utilisant leurs points d’accès dans le but d’enrichir une notice à l’opac.

Vous trouverez ci-dessous une toute petite partie de ce qu’on peut faire. Ce n’est pas un cours pour vous expliquer comment ça marche. Ce sont des exemples à tester et vous approprier. Vous pourrez ainsi découvrir, et voir ce que vous pourriez en tirer. Si vous voulez aller plus loin, il existe un grand nombre de ressources très bien faites pour en apprendre plus.

Je suis très intéressée de savoir ce que ça évoque pour vous ou ce que vous aimeriez en faire en terme applicatif. Comment, par exemple, ces informations pourraient être rendues dans vos catalogues et SIGB pour apporter une expérience utilisateur plus riche. À titre (très) expérimental, j’ai publié un petite bout de code sur bugzilla.

Une requête Sparql est composée au moins d’une partie SELECT et WHERE. Vous pouvez déclarer des PREFIX pour écrire une requête plus synthétique.

Vous pouvez tester les requêtes concernant la Bnf sur son point d’entrée Sparql: http://data.bnf.fr/sparql/

Pour un ark donné, si je veux connaître les prédicats disponibles et les objets associés (il suffit de retirer le « ?o » du SELECT pour n’avoir que les prédicats) je peux écrire :


SELECT DISTINCT ?p ?o
WHERE {
<http://data.bnf.fr/ark:/12148/cb13173759h#about> ?p ?o .
}

Essayer la requête

« http://data.bnf.fr/ark:/12148/cb13173759h#about » décrit une œuvre. Le créateur de cette œuvre est disponible sur l’entité avec « http://purl.org/dc/terms/creator ».

Si je veux trouver le créateur de cette œuvre, j’ai simplement à écrire:


PREFIX dcterms: <http://purl.org/dc/terms/>
SELECT DISTINCT ?creator
WHERE {
<http://data.bnf.fr/ark:/12148/cb13173759h#about> dcterms:creator ?creator .
}

Essayer la requête

Cependant si je veux trouver l’auteur d’une expression je dois procéder comme suit:

# vérifier les propriétés disponibles
SELECT DISTINCT ?p
WHERE {
<http://data.bnf.fr/ark:/12148/cb34336868b#Expression> ?p ?o .
}

Essayer la requête

# Trouver l'auteur
PREFIX bnfroles: <http://data.bnf.fr/vocabulary/roles/>
SELECT DISTINCT ?author
WHERE {
<http://data.bnf.fr/ark:/12148/cb34336868b#Expression> bnfroles:r70 ?author .
}

Essayer la requête

Vous trouverez des précisions sur le modèle de la bnf sur leur page “opendata”.

Le type de l’entité est stocké dans « http://www.w3.org/1999/02/22-rdf-syntax-ns#type » et a pour valeurs possibles:

  • http://rdvocab.info/uri/schema/FRBRentitiesRDA/Work
  • http://rdvocab.info/uri/schema/FRBRentitiesRDA/Expression
  • http://rdvocab.info/uri/schema/FRBRentitiesRDA/Manifestation etc.

On peut ensuite trouver des informations sur l’auteur:


PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX bio: <http://vocab.org/bio/0.1/>
SELECT ?name ?birth ?death ?page ?bio ?country ?image
WHERE {
<http://data.bnf.fr/ark:/12148/cb11888092r#about> foaf:name ?name .
<http://data.bnf.fr/ark:/12148/cb11888092r#about> bio:birth ?birth .
<http://data.bnf.fr/ark:/12148/cb11888092r#about> bio:death ?death .
<http://data.bnf.fr/ark:/12148/cb11888092r#about> foaf:page ?page .
<http://data.bnf.fr/ark:/12148/cb11888092r#about> foaf:depiction ?image .
<http://data.bnf.fr/ark:/12148/cb11888092r#about> <http://rdvocab.info/ElementsGr2/biographicalInformation> ?bio .
<http://data.bnf.fr/ark:/12148/cb11888092r#about> <http://rdvocab.info/ElementsGr2/countryAssociatedWithThePerson> ?country .
}

Essayer la requête

Je vous invite à prendre connaissance du tutoriel publié par Thomas Francart qui vous fait explorer d’autres requêtes Sparql. Vous pouvez également lire Le petit laboratoire sémantique : expérimentation à la BM de Fresnes qui explique avec requêtes à l’appui comment ils rendent des informations à l’utilisateur à partir de Dbpedia, Bnf et Europeana.

Je me suis également aventurée sur le point d’accès de Wikidata. « Wikidata est une base de données libre, collaborative, multilingue, et secondaire qui collecte des données structurées pour alimenter Wikipédia, Wikimedia Commons, les autres projets du mouvement Wikimédia et pour n’importe qui sur la planète. »

Les « prédicats » sont appelés « propriétés » dans Wikidata. Vous pouvez en trouver une liste ou les trouver dans ce navigateur ou encore cet explorateur. Chaque élément (sujet ou objet) est identifié par Q*.

L’interface utilisateur de requêtage est très agréable à utiliser et fournit une assistance efficace: http://query.wikidata.org/

Si je reprends l’exemple précédent, je commence par chercher l’entité Wikidata qui contient une partie de mon ark:

SELECT ?wdwork
WHERE {
?wdwork wdt:P268 ?idbnf
FILTER CONTAINS(?idbnf, "13173759h") .
}

Essayer la requête

Je peux ensuite chercher tous les prédicats et objets de cette entité:

SELECT DISTINCT ?p ?o
WHERE {
wd:Q25169 ?p ?o .
}

Essayer la requête

ou trouver quelques informations sur l’auteur:


SELECT ?wdauthor ?birthdate ?deathdate ?image ?workperiod ?name
WHERE {
wd:Q25169 wdt:P50 ?wdauthor.
OPTIONAL { ?wdauthor wdt:P18 ?image. }
OPTIONAL { ?wdauthor wdt:P2031 ?workperiod. }
OPTIONAL { ?wdauthor wdt:P570 ?deathdate} .
OPTIONAL { ?wdauthor wdt:P1477 ?name. }
OPTIONAL { ?wdauthor wdt:P569 ?birthdate. }
}

Essayer la requête

ainsi que ses occupations:


SELECT ?occupation ?occupationLabel
WHERE {
wd:Q43361 wdt:P50 ?auteur.
OPTIONAL { ?auteur wdt:P106 ?occupation. }
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
}

Essayer la requête

ou encore des informations sur l’œuvre:

SELECT ?wdwork ?wdworkDescription ?wdauthor ?wdauthorLabel ?countryoriginLabel ?serieLabel ?pubdate ?genreLabel
WHERE
{
?wdwork wdt:P268 ?idbnf
FILTER CONTAINS(?idbnf, "13173759h").
?wdwork wdt:P50 ?wdauthor .
OPTIONAL { ?wdwork wdt:P495 ?countryorigin .}
OPTIONAL { ?wdwork wdt:P577 ?pubdate .}
OPTIONAL { ?wdwork wdt:P179 ?serie .}
OPTIONAL { ?wdwork wdt:P136 ?genre .}
SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],fr". }
}

Essayer la requête

Pour aller plus loin:

Les réservoirs de données, ne manquent pas, je pourrais juste citer la bnf, wikidata, geonames, europeana etc. (voir Lod Cloud – quand il sera rétabli)

N’hésitez pas à partager vos expériences, vos envies, vos problèmes pour construire une requête, vos rêves d’application en commentaire, je me ferai un plaisir d’étudier tout ça !

À vous 🙂

Share

A propos Claire Hernandez

Développement, agilité, facilitation et R&D au service des utilisateurs de logiciels libres pour la culture.

5 Commentaires

  1. Merci pour les exemples de requêtes SPARQL sur data.bnf et Wikidata. Ce sont des outils précieux pour les bibliothécaires et les wikimédiens.

  2. Retour PingSPARQL et Wikidata. Partie 2 : images, cartes, frises chronologiques et graphes – AHP numérique

  3. Retour PingLa BnF et SPARQL. Partie 1 : le modèle de données – AHP numérique

  4. Retour PingLa BnF et SPARQL. Partie 2 : les entités de Data – AHP numérique

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *