Premiers contacts avec l’accès SPARQL de l’éditeur Springer

Note du 14/5/2018: l’accès SPARQL mentionné dans cet article a disparu; nous allons prochainement étudier la nouvelle politique d’accès aux données de Springer

Dans le cadre du projet SemBib, je vais découvrir avec vous l’accès SPARQL public de l’éditeur scientifique Springer à l’adresse http://lod.springer.com/sparql-form/index.html. Pour un premier contact, il faut faire connaissance et quelques requêtes classiques vont nous y aider.

D’abord, découvrir les propriétés utilisées:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX spr: <http://lod.springer.com/data/ontology/property/> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
select distinct ?p ?label where {
?s ?p ?o .
OPTIONAL {
?p rdfs:label ?label .
}
}
limit 100

qui met environ 23 secondes (j’ai un peu triché: je l’ai exécutée une première fois pour voir les URI utilisées et en déduire des préfixes à définir et avoir le résultat plus compact ci-dessous, grâce aux préfixes).

Elle donne :

--------------------------------------------------------------
| p                           | label                        |
==============================================================
| rdf:type                    |                              |
| dc:creator                  |                              |
| dc:date                     |                              |
| dc:description              |                              |
| dc:publisher                |                              |
| dc:rights                   |                              |
| rdfs:label                  |                              |
| rdfs:domain                 |                              |
| rdfs:range                  |                              |
| rdfs:subPropertyOf          |                              |
| spr:hasDBLPID               | "has DBLP ID"@en             |
| spr:confSeriesName          | "conference series name"@en  |
| spr:confYear                | "conference year"@en         |
| spr:confAcronym             | "conference acronym"@en      |
| spr:confName                | "conference name"@en         |
| spr:confCity                | "conference city"@en         |
| spr:confCountry             | "conference country"@en      |
| spr:confStartDate           | "conference start date"@en   |
| spr:confEndDate             | "conference end date"@en     |
| spr:hasSeries               | "ConferenceSeries"@en        |
| spr:volumeNumber            | "Volume number"@en           |
| spr:title                   | "Title"@en                   |
| spr:subtitle                | "Subtitle"@en                |
| spr:ISBN                    | "ISBN"@en                    |
| spr:EISBN                   | "eISBN"@en                   |
| spr:bookSeriesAcronym       | "book series acronym"@en     |
| spr:hasConference           | "Conference"@en              |
| spr:bookDOI                 | "DOI"@en                     |
| spr:isIndexedByScopus       | "Is indexed by Scopus"@en    |
| spr:scopusSearchDate        | "Scopus search date"@en      |
| spr:isAvailableAt           | "Available at"@en            |
| spr:isIndexedByCompendex    | "Is indexed by Compendex"@en |
| spr:compendexSearchDate     | "Compendex search date"@en   |
| spr:confNumber              | "conference number"@en       |
| spr:copyrightYear           | "Copyright year"@en          |
| spr:firstPage               | "First page"@en              |
| spr:lastPage                | "Last page"@en               |
| spr:chapterRegistrationDate | "Registration date"@en       |
| spr:chapterOf               | "Book"@en                    |
| spr:chapterOnlineDate       | "Online date"@en             |
| spr:copyrightHolder         | "Copyright Holder"@en        |
| spr:metadataRights          | "Metadata Rights"@en         |
| spr:abstractRights          | "Abstract Rights"@en         |
| spr:bibliographyRights      | "Bibliography Rights"@en     |
| spr:bodyHtmlRights          | "Body HTML Rights"@en        |
| spr:bodyPdfRights           | "Body PDF Rights"@en         |
| spr:esmRights               | "ESM Rights"@en              |
--------------------------------------------------------------

D’une part cela nous montre que les performances ne sont pas exceptionnelles. D’autre part, on voit que pour l’essentiel Springer a défini sa propre ontologie: des données sont accessibles, mais pas vraiment reliées au reste du monde par des concepts partagés. Les données sont définies avec 47 prédicats (propriétés).

La requête suivante -sans répéter les préfixes ci-dessus définis- nous donne le nombre de ‘sujets’ distincts renseignés dans la base: 451277.

select (count(distinct ?s) as ?size) where {
?s ?p ?o .
}

et celle qui suit donne le nombre de triplets qui renseignent ces sujets: 3490865, soit environ 8 prédicats par sujet différent, ce qui est peu pour renseigner de façon détaillée des références bibliographiques. On peut supposer qu’on aura donc peu de données sur chaque référence.

select (count(?s) as ?size) where {
?s ?p ?o .
}

Le relativement faible de prédicats par sujet me suggère de chercher les plus utilisés:

select ?p (count(?p) as ?freq) where {
?s ?p ?o .
}
group by ?p
order by desc(?freq)

ce qui donne (en enlevant les moins utilisés, concernant essentiellement des questions de droits):

----------------------------------------
| p                           | freq   |
========================================
| rdf:type                    | 451316 |
| spr:bookDOI                 | 441266 |
| spr:title                   | 439864 |
| spr:chapterOf               | 381656 |
| spr:firstPage               | 381646 |
| spr:lastPage                | 381646 |
| spr:chapterRegistrationDate | 245143 |
| spr:chapterOnlineDate       | 188209 |
| spr:EISBN                   | 59611  |
| spr:isIndexedByScopus       | 59370  |
| spr:scopusSearchDate        | 59370  |
| spr:ISBN                    | 59101  |
| spr:isAvailableAt           | 59101  |
| spr:copyrightYear           | 55964  |
| spr:subtitle                | 40321  |
| spr:volumeNumber            | 34988  |
| spr:bookSeriesAcronym       | 17665  |
| spr:compendexSearchDate     | 11400  |
| spr:isIndexedByCompendex    | 11400  |
| spr:hasConference           | 9509   |
| spr:confCity                | 8487   |
| spr:confCountry             | 8487   |
| spr:confName                | 8487   |
| spr:hasSeries               | 8487   |
| spr:confEndDate             | 8479   |
| spr:confStartDate           | 8479   |
| spr:confYear                | 8479   |
| spr:confAcronym             | 8233   |
| spr:confNumber              | 8021   |
----------------------------------------

On voit que l’essentiel de l’information disponible sur un élément de la base consiste en: son type, son numéro DOI, son titre, de quoi l’élément est un chapitre, à partir de quelle page et jusqu’à quelle page. Les autres informations concernent notamment des conférences d’où peuvent provenir les documents.

Prédicats avec domain et range

On voit que les propriétés domain -qui nous donne la catégorie d’objets à laquelle s’applique le prédicat- et range -qui nous donne la catégorie des valeurs possibles pour ce prédicat- semblent renseignées pour certains prédicats .

Avec la même petite tricherie que ci-dessus pour les préfixes, la requête suivante nous donne en 15 secondes les domain et range utilisés:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX spr: <http://lod.springer.com/data/ontology/property/>               
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xs: <http://www.w3.org/2001/XMLSchema#>
PREFIX sxs: <https://www.w3.org/2001/XMLSchema#>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX spc:<http://lod.springer.com/data/ontology/class/>                       
select distinct ?p ?domain ?range  where {
?s ?p ?o .
?p rdfs:domain ?domain .
?p rdfs:range ?range .
}
limit 100

Le résultat est:

------------------------------------------------------------------------------
| p                           | domain                | range                |
==============================================================================
| spr:confSeriesName          | spc:ConferenceSeries  | rdf:langString       |
| spr:confYear                | spc:Conference        | xs:date              |
| spr:confAcronym             | spc:Conference        | rdf:langString       |
| spr:confName                | spc:Conference        | rdf:langString       |
| spr:confCity                | spc:Conference        | rdf:langString       |
| spr:confCountry             | spc:Conference        | rdf:langString       |
| spr:confStartDate           | spc:Conference        | xs:date              |
| spr:confEndDate             | spc:Conference        | xs:date              |
| spr:hasSeries               | spc:Conference        | spc:ConferenceSeries |
| spr:confNumber              | spc:Conference        | xs:int               |
| spr:volumeNumber            | spc:ProceedingsVolume | rdfs:literal         |
| spr:title                   | spc:ProceedingsVolume | rdf:langString       |
| spr:subtitle                | spc:ProceedingsVolume | rdf:langString       |
| spr:ISBN                    | spc:ProceedingsVolume | rdfs:literal         |
| spr:EISBN                   | spc:ProceedingsVolume | rdfs:literal         |
| spr:bookSeriesAcronym       | spc:ProceedingsVolume | rdfs:literal         |
| spr:hasConference           | spc:ProceedingsVolume | spc:Conference       |
| spr:bookDOI                 | spc:ProceedingsVolume | rdf:langString       |
| spr:isIndexedByScopus       | spc:ProceedingsVolume | sxs:boolean          |
| spr:scopusSearchDate        | spc:ProceedingsVolume | sxs:dateTime         |
| spr:isIndexedByCompendex    | spc:ProceedingsVolume | sxs:boolean          |
| spr:compendexSearchDate     | spc:ProceedingsVolume | sxs:dateTime         |
| spr:volumeNumber            | spc:Book              | rdfs:literal         |
| spr:title                   | spc:Book              | rdf:langString       |
| spr:subtitle                | spc:Book              | rdf:langString       |
| spr:ISBN                    | spc:Book              | rdfs:literal         |
| spr:EISBN                   | spc:Book              | rdfs:literal         |
| spr:bookSeriesAcronym       | spc:Book              | rdfs:literal         |
| spr:bookDOI                 | spc:Book              | rdf:langString       |
| spr:isIndexedByScopus       | spc:Book              | sxs:boolean          |
| spr:scopusSearchDate        | spc:Book              | sxs:dateTime         |
| spr:copyrightYear           | spc:Book              | sxs:date             |
| spr:isIndexedByCompendex    | spc:Book              | sxs:boolean          |
| spr:compendexSearchDate     | spc:Book              | sxs:dateTime         |
| spr:title                   | spc:BookChapter       | rdf:langString       |
| spr:subtitle                | spc:BookChapter       | rdf:langString       |
| spr:bookDOI                 | spc:BookChapter       | rdf:langString       |
| spr:firstPage               | spc:BookChapter       | sxs:int              |
| spr:lastPage                | spc:BookChapter       | sxs:int              |
| spr:chapterRegistrationDate | spc:BookChapter       | sxs:date             |
| spr:chapterOnlineDate       | spc:BookChapter       | sxs:date             |
| spr:chapterOf               | spc:BookChapter       | spc:Book             |
| spr:copyrightYear           | spc:BookChapter       | sxs:date             |
| spr:copyrightHolder         | spc:BookChapter       | rdf:string           |
| spr:metadataRights          | spc:BookChapter       | rdf:string           |
| spr:abstractRights          | spc:BookChapter       | rdf:string           |
| spr:bibliographyRights      | spc:BookChapter       | rdf:string           |
| spr:bodyHtmlRights          | spc:BookChapter       | rdf:string           |
| spr:bodyPdfRights           | spc:BookChapter       | rdf:string           |
| spr:esmRights               | spc:BookChapter       | rdf:string           |
------------------------------------------------------------------------------

Exploration de quelques prédicats

dc:creator

Je m’attendais à un usage de dc:creator pour les noms d’auteurs. Mais dc:creator ne prends qu’une seule valeur: « Springer »@en. Sans doute pour désigner le créateur de la base. Aucun autre prédicat ne semble pouvoir être porteur du nom des auteurs.

rdf:type

La requête suivante va nous permettre de voir la répartition des types utilisés:

select distinct ?o (count(?o) as ?typecount) where {
?s a ?o .
}
group by ?o
order by desc(?typecount)

donne

----------------------------------------------------------------
| o                                                | typecount |
================================================================
| spc:BookChapter                                  | 381657    |
| spc:Book                                         | 50102     |
| spc:ProceedingsVolume                            | 9509      |
| spc:Conference                                   | 8487      |
| spc:ConferenceSeries                             | 1477      |
| rdf:Property                                     | 39        |
| <http://www.w3.org/2002/07/owl#DatatypeProperty> | 34        |
| <http://www.w3.org/2002/07/owl#Class>            | 5         |
| <http://www.w3.org/2002/07/owl#ObjectProperty>   | 5         |
| <http://rdfs.org/ns/void#Dataset>                | 2         |
----------------------------------------------------------------

spr:bookDOI

Ce prédicat permet probablement d’associer un numéro DOI à chaque document. Par nature, il est désigne de façon unique un document. Je vais m’intéresser à la forme utilisée pour enregistrer le numéro DOI par Springer (j’ai noté, par exemple, que dans la base de Telecom ParisTech, diverses formes sont utilisées).

select ?doi  where {
?s spr:bookDOI ?doi .
}
limit 5

donne

----------------------------------
| doi                            |
==================================
| "10.1007/978-3-319-09147-1"@en |
| "10.1007/978-3-319-09147-1"@en |
| "10.1007/978-3-319-10762-2"@en |
| "10.1007/978-3-319-10762-2"@en |
| "10.1007/978-3-319-07785-7"@en |
----------------------------------

On voit une représentation homogène des numéros DOI dans la base de Springer. J’ai vérifié cela sur un plus grand nombre d’exemple.

Des prédicats au sujet des conférences

Plusieurs prédicats semblent concerner des séries de conférences. Je vais chercher combien sont concernées et quelles séries conférences ont eu le plus d’occurrences.

On trouve 1477 sujets de type spc:ConferenceSeries (cf ci-dessus les types les plus fréquents).

La requête suivante va nous donner les 20 séries de conférences qui ont le plus donné lieu à publication par Springer:

select ?name (count(distinct ?conf) as ?c) where {
?conf a spc:Conference  .
?conf spr:hasSeries ?serie  .
?serie a spc:ConferenceSeries  .
?serie spr:confSeriesName ?name
}
group by ?name
order by desc(?c)
limit 20

donne

--------------------------------------------------------------------------------------------------------
| name                                                                                            | c  |
========================================================================================================
| "International Colloquium on Automata, Languages, and Programming"@en                           | 40 |
| "International Symposium on Mathematical Foundations of Computer Science"@en                    | 38 |
| "Annual Cryptology Conference"@en                                                               | 33 |
| "Annual International Conference on the Theory and Applications of Cryptographic Techniques"@en | 33 |
| "International Conference on Applications and Theory of Petri Nets and Concurrency"@en          | 32 |
| "International Workshop on Graph-Theoretic Concepts in Computer Science"@en                     | 32 |
| "International Symposium on Distributed Computing"@en                                           | 29 |
| "International Conference on Computer Aided Verification"@en                                    | 28 |
| "International Conference on Concurrency"@en                                                    | 28 |
| "International Conference on Information Security and Cryptology"@en                            | 28 |
| "International Conference on Advanced Information Systems Engineering"@en                       | 27 |
| "International Semantic Web Conference"@en                                                      | 27 |
| "Ada-Europe International Conference on Reliable Software Technologies"@en                      | 26 |
| "European Conference on Object-Oriented Programming"@en                                         | 26 |
| "European Symposium on Programming Languages and Systems"@en                                    | 25 |
| "International Conference on Conceptual Modeling"@en                                            | 25 |
| "International Workshop on Languages and Compilers for Parallel Computing"@en                   | 25 |
| "Annual Symposium on Combinatorial Pattern Matching"@en                                         | 24 |
| "Annual Symposium on Theoretical Aspects of Computer Science"@en                                | 24 |
| "International Conference on Algorithmic Learning Theory"@en                                    | 24 |
--------------------------------------------------------------------------------------------------------

Cela donne probablement un aperçu des thématiques les plus abordées par Springer.

Actualisation de la base

Des documents scientifiques sont publiés chaque mois.

Pour me faire une idée de la fraîcheur des données disponibles ici, je fais un premier test sur un livre auquel j’ai contribué -« Multimodal Interaction with W3C Standards »- dont le DOI est: 10.1007/978-3-319-42816-1. Il n’est pas dans la base le 3/12/2016.

Quelques prédicats suggèrent des informations de date. Je vais chercher la date la plus récente présente dans la base. Je vais utiliser le prédicat de ce type le plus fréquent: spr:chapterRegistrationDate, qui donne des dates de la forme

 "2002-01-01"^^xs:date

La requête

select distinct ?date where {
?s spr:chapterRegistrationDate ?date  .
}
order by desc(?date)
limit 5

donne le résultat surprenant suivant

-------------------------
| date                  |
=========================
| "2017-09-09"^^xs:date |
| "2017-07-25"^^xs:date |
| "2017-06-14"^^xs:date |
| "2017-05-20"^^xs:date |
| "2016-12-19"^^xs:date |
-------------------------

Le dernier document enregistré l’a été dans le futur!?!

En tout cas, cela suggère que cette base est régulièrement actualisée -même si les dates affichées doivent être interprétées d’une façon que j’ignore pour le moment.

Conclusion

Cette exploration confirme ce dont j’ai l’intuition depuis le début du projet SemBib: il y a de plus en plus de sources de données bibliographiques, mais chacune a ses propres objectifs et est incomplète pour d’autres objectifs, comme ceux de Sembib.

Cela confirme aussi l’axe choisi pour Sembib: constituer un graphe de données propre à SemBib, mais interconnecté avec d’autres graphes. SemBib plaide pour une fédération de graphes bibliographiques interconnectés.

A propos Moissinac

Maitre de conférence à Télécom Paris, Département Image, Données, Signal - Groupe Multimédia Jean-Claude Moissinac a mené des recherches sur les techniques avancées pour la production, le transport, la représentation et l’utilisation des documents multimédia. Ces travaux d'abord ont évolué vers la représentation sémantique de données liées au multimédia (process de traitement de médias, description d'adaptations de média, description formelle d'interactions utilisateurs). Aujourd'hui, les travaux portent sur la constitution de graphes de connaissances. Principaux axes de recherche actuel : représentations sémantiques de connaissances, constitution de graphes de connaissances, techniques d'apprentissage automatique sur ces graphes
Ce contenu a été publié dans Données publiques, SemBib, SPARQL. Vous pouvez le mettre en favoris avec ce permalien.