Skip to content

Enrichir ses tableurs Excel ou LibreOffice Calc grâce à des API (2/4) : résultats SPARQL

22/07/2016

J’ai donné dans le billet précédent les principes de la fonctionnalité

=FILTREXML(SERVICEWEB(url);"xpath")

Voyons comment ça fonctionne si au lieu d’une API « classique » on veut exploiter un SPARQL Endpoint.

Je reste sur mon exemple de tableau ISBN-Titre-Auteur-Editeur-Date auquel on a rajouté la fois précédente une colonne PPN

fichier 6 colonnes

Si en plus du PPN, je veux ajouter l’ARK BNF (c’est-à-dire son identifiant pérenne exprimé sous la forme d’un ARK). La BnF ne propose pas d’API de conversion isbn2ark, à l’image de ce que fait l’Abes. En revanche le Sparql Endpoint de DataBnF (qui ne contient pas encore tout le catalogue pour l’instant) peut fonctionner de la même manière qu’une API : on construit une requête, ça génère une URL, on récupère le résultat.

La requête pour convertir l’ISBN en ARK

La propriété bnf-onto:isbn sert à déclarer l’ISBN d’une manifestation (notice bibliographique). La requête sera donc, pour un ISBN donné :

PREFIX bnf-onto: <http://data.bnf.fr/ontology/bnf-onto/&gt;
select ?uri where {
?uri bnf-onto:isbn "2-11-072340-8"
}

Si je l’exécute dans le Sparql Endpoint de DataBnF, le résultat ressemble à ça : une page blanche, avec un tout petit tableau en haut à gauche

isbn2ark

Si je veux uniquement l’ARK, non préfixé « http://data.bnf.fr/ &raquo;, je peux raffiner un peu : considérer l’URI de la ressource comme une chaîne de caractères (la fonction str(?uri) sert à ça) puis en supprimer les 20 premiers caractères pour ne garder que l’ARK :

PREFIX bnf-onto: <http://data.bnf.fr/ontology/bnf-onto/&gt;
select (substr(str(?uri),20,22) as ?ark) where {
?uri bnf-onto:isbn "2-11-072340-8"
}

Une fois qu’on a trouvé la bonne requête, on en récupère l’URL correspondante pour la donner à Excel/Calc.

Format en sortie HTML ?

SPARQL permet de sélectionner le format en sortie voulue.

Spontanément, il serait logique de choisir le XML puisqu’on utilise une fonction FILTREXML. On va voir tout à l’heure que c’est possible (et sans doute parfois souhaitable) mais dans les faits c’est plus compliqué.

En réalité, pour des utilisations simples comme celle ci-dessus, le HTML convient très bien, vu que c’est du XHTML (non déclaré comme tel) au sens où toutes les balises HTML sont correctement fermées.

Voici le code source de la page de résultats pour la requête ci-dessus :

<table class="sparql" border="1">
  <tr>
    <th>ark</th>
  </tr>
  <tr>
    <td>"ark:/12148/cb34311898n"</td>
  </tr>
</table>

Ca ressemble beaucoup à un résultat de l’API isbn2ppn, à la seule différence que le navigateur préfère l’afficher non sous forme d’arbre XML mais de tableau.

Le chemin XPath pour accéder à l’information est facile à définir : "//td"
(sur XPath, c’est par là)

Donc si je reprends les 3 étapes décrites dans le billet précédent, mais imbriquées dans une seule cellule, je vais mettre en cellule G2 la formule suivante :

=FILTREXML(SERVICEWEB("http://data.bnf.fr/sparql?default-graph-uri=&query=PREFIX+bnf-onto%3A+%3Chttp%3A%2F%2Fdata.bnf.fr%2Fontology%2Fbnf-onto%2F%3Eselect+substr%28str%28%3Furi%29%2C20%2C22%29+where+%7B++%3Furi+bnf-onto%3Aisbn+%22"&A2&"%22%0D%0A%7D&format=text%2Fhtml&timeout=0&should-sponge=&debug=on");"//td")

Pour construire l’URL, j’ai simplement repris l’URL d’une page de résultats, et j’ai modifié 2-11-072340-8 l’ISBN par "&A2&"

ajout ARK

A noter qu’une fois obtenu ce résultat, on a intérêt à écraser la colonne G par un copier-coller de ses valeurs (Sélectionner la colonne > Copier > Collage spécial > Texte) pour éviter que chaque cellule ne s’actualise à chaque réouverture du fichier (avec un temps d’attente plus ou moins long pour interroger le Sparql Endpoint pour chaque ISBN).

Format en sortie XML ?

Bien sûr, Excel et Calc sont capables de récupérer des infos du flux XML plutôt que HTML.

L’URL du XML

Première difficulté pratique : récupérer l’URL du flux XML renvoyé par le Sparql Endpoint. En effet quand au lieu de HTML on sélectionner le format XML en sortie, le navigateur n’affiche pas le résultat (cf. ce billet, mais surtout les commentaires qui sont dessous vu que je me suis complètement planté et que j’ai été heureusement corrigé) mais propose systématiquement d’ouvrir le fichier dans un autre logiciel (bloc-notes, éditeur XML, etc.) ou de le télécharger.

fichier XML à télécharger

Il faut donc récupérer l’URL d’un résultat HTML et y remplacer la valeur du paramètre format=text%2Fhtml en format=application%2Fsparql-results%2Bxml

http://data.bnf.fr/sparql?default-graph-uri=&query=PREFIX+bnf-onto%3A+%3Chttp%3A%2F%2Fdata.bnf.fr%2Fontology%2Fbnf-onto%2F%3Eselect+%28substr%28str%28%3Furi%29%2C20%2C22%29+as+%3Fark%29+where+%7B++%3Furi+bnf-onto%3Aisbn+%222-11-072340-8%22%7D&amp;format=application%2Fsparql-results%2Bxml&timeout=0&should-sponge=&debug=on

A côté de mes ARK déjà récupérés, je vais ajouter une colonne SERVICEWEB pour récupérer le contenu de ce fichier XML. La formule sera donc :

=SERVICEWEB("http://data.bnf.fr/sparql?default-graph-uri=&query=PREFIX+bnf-onto%3A+%3Chttp%3A%2F%2Fdata.bnf.fr%2Fontology%2Fbnf-onto%2F%3Eselect+%28substr%28str%28%3Furi%29%2C20%2C22%29+as+%3Fark%29+where+%7B++%3Furi+bnf-onto%3Aisbn+%22"&A2&"%22%0D%0A%7D&format=application%2Fsparql-results%2Bxml&timeout=0&should-sponge=&debug=on")

Et voilà le résultat (pour les 3 premières lignes)

resultat XML

Je remets ici le contenu d’une des cellules pour pouvoir commenter :

<sparql xmlns="http://www.w3.org/2005/sparql-results#" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/sw/DataAccess/rf1/result2.xsd">
<head>
<variable name="ark"/>
</head>
<results distinct="false" ordered="true">
<result>
<binding name="ark"><literal>ark:/12148/cb34657300h</literal></binding>
</result>
</results>
</sparql>

 

Le chemin XPath dans ce fichier XML

C’est un fichier XML assez simple. Et on voit que le résultat est dans une balise <binding> dont l’attribut name contient le nom de ma variable ark. La balise <literal/> précise le type de données qu’on traite.

Donc mon XPath sera simple aussi : "//binding[@name='ark']"

Et si je rajoute une colonne I à côté de ma colonne H (qui contient les résultats XML), la cellule I2 contiendra :

=FILTREXML(H2;"//binding[@name='ark']")

Et là vous avez une belle colonne
Ah tiens, non…

Flux XML - résultat Erreur

Et ça, c’est la faute aux espaces de nom.

D’où mon prochain billet.

En attendant :

  1. pour interroger des Sparql Endpoint, utilisez les sorties HTML
  2. pour les autres API, espérez qu’il n’y a pas d’espace de nom caché quelque part (c’est de plus en plus fréquent)

Ce prochain billet prendra le temps d’expliquer ce que sont les espaces de nom (mais à la limite, vous pouvez trouver ça dans plein d’endroits sur Internet, voire même le savoir déjà), et surtout comment vous en débarrasser sous Calc et Excel. Et là, je n’ai pas encore trouvé de documentation qui l’explique (si vous en avez, ça m’intéresse et ça m’économisera un billet).

 

%d blogueurs aiment cette page :