[ Lire le billet qui introduit cette série « Mettre nos données en réseau – un démonstrateur » ]
Une des forces de SPARQL est d’être non seulement un langage de requêtes, comme SQL, mais aussi un protocole, s’appuyant sur des requêtes http. Un sparql endpoint fonctionne donc comme un web service. Mais il y a mieux : comme il est standard, il permet à un endpoint d’en interroger n’importe quel autre, distant. A condition, bien entendu, que chacun d’eux ait été configuré pour cela. Cet appel distant est introduit par une sous requête SERVICE {…}
Ainsi que la requête suivante interrogera la BNF : http://data.bnf.fr/sparql, qui nous renverra les métadonnées du document identifié par l’ISBN 978-3-540-38409-0
PREFIX bnf-onto: <http://data.bnf.fr/ontology/bnf-onto/> SELECT DISTINCT * WHERE { SERVICE <http://data.bnf.fr/sparql> {?bookbnf bnf-onto:isbn "978-3-540-38409-0" ; ?p ?o} }
Évidemment, jusqu’ici cela ne présente qu’un intérêt limité : mieux vaut interroger directement data.bnf.fr.
Ce qui est plus intéressant, c’est de croiser des données locales et distantes :
PREFIX rdaw: <http://rdaregistry.info/Elements/w/> PREFIX rdarelationships: <http://rdvocab.info/RDARelationshipsWEMI/> PREFIX bnf-onto: <http://data.bnf.fr/ontology/bnf-onto/> PREFIX dcterms: <http://purl.org/dc/terms/> PREFIX owl: <http://www.w3.org/2002/07/owl#> SELECT * FROM <http://hub.abes.fr/springer/ebooksLN2011/SPR_EBOOK_ALL_25DEC> FROM <http://hub.abes.fr/rameau_avril2015/ppns> WHERE { ?bookspringer bibo:isbn ?isbn. SERVICE <http://data.bnf.fr/sparql> {?bookbnf bnf-onto:isbn ?isbn ; dcterms:subject ?rameau} ?rameau owl:sameAs ?idref. } limit 5
Cette fois, on cherche les documents (plus précisément les manifestations) ayant le même ISBN que tel e-book du corpus Springer, et on récupère des identifiants Rameau, avec lesquels on rebondit sur IdRef via les alignements contenus dans le graphe <http://www.hub.abes.fr/rameau_avril2015/ppns > ayant le même ISBN que tel livre du corpus Springer. Magique, non ?
Voilà comment on peut obtenir une partie des triplets du graphe <http://www.hub.abes.fr/springer/ebooksLN2011/SPR_EBOOK_ALL_25DEC/rameauppn > :
SELECT * FROM <http://hub.abes.fr/springer/ebooksLN2011/SPR_EBOOK_ALL_25DEC/rameauppn> WHERE {?s ?p ?o} LIMIT 50
(En réalité on a procédé autrement pour descendre au niveau des chapitres)
… Attention, la requête prend du temps.
Voyons à présent un cas plus sophistiqué. Soit une base de données rencontrée au fil de nos errances sur le web de données : bio2rdf.org
Cette base agrège un grand nombre de thésaurus et bases de connaissances biomédicales anglophones, reliés entre eux dans un capharnaüm plus ou moins organisé. Après avoir dressé une cartographie sommaire des lieux, on découvre qu’elle contient notamment la quasi totalité des descripteurs Mesh, déjà mentionnés dans une précédente étude de cas. Et que certains d’entre eux (apparemment plutôt ceux décrivant des pathologies) ont été alignés avec d’autres vocabulaires, qui eux-mêmes sont associés à des références d’articles dans Pubmed, également sommairement chargé dans cette base.
Muni de ces informations, et de la présence, chez nous, de nos notices FMESH francophones, il est possible d’obtenir, à partir d’une notice IdRef ou de son libellé, une liste de références dans Pubmed.
PREFIX owl: <http://www.w3.org/2002/07/owl#> PREFIX skos: <http://www.w3.org/2004/02/skos/core#> SELECT ?label ?citation ?uriPubmed { SELECT * where { <http://www.idref.fr/040671224/id> skos:prefLabel ?label ; owl:sameAs ?mesh. BIND (URI(REPLACE(str(?mesh), 'http://id.nlm.nih.gov/mesh/', 'http://bio2rdf.org/mesh:')) AS ?mesh2). SERVICE <http://pubmed.bio2rdf.org/sparql> { ?concept <http://bio2rdf.org/ctd_vocabulary:disease> ?mesh2 ; <http://bio2rdf.org/ctd_vocabulary:article> [ <http://bio2rdf.org/clinicaltrials_vocabulary:citation> ?citation ; <http://bio2rdf.org/bio2rdf_vocabulary:x-identifiers.org> ?uriPubmed]. } } LIMIT 1000 } GROUP BY ?label ?citation ?uriPubmed
Le résultat donne une idée du potentiel des requêtes fédérées, tout en pointant leurs limites actuelles : c’est long ! Et la fiabilité n’est pas absolue : on n’est pas à l’abri du « time out » ou d’une absence de résultat. En l’occurrence, ici, on rencontre une difficulté pour obtenir la liste des articles, les plus nombreux, pour lesquels on n’a que le lien et pas de citation bibliographique (?uripubmed sans ?citation). Voilà pourquoi, en attendant des lendemains qui chantent sur le web de données, on préfère généralement charger une copie (un « dump ») des données distantes, pour les manipuler à loisir dans sa propre cuisine.
Ping : Mettre nos données en réseau – un démonstrateur. [1] Introduction. | Punktokomo ;