Tutoriel sous forme d'exercices pour découvrir le sparql endpoint mis à disposition par la plateforme HAL, archive ouverte d'article scientifiques de toutes disciplines des institutions de recherches françaises. Attention ! Ce tutoriel a pour pré-requis la connaissance du langage de requêtes SPARQL.
1. Découverte du
SPARQL Endpoint de HAL
Gautier Poupeau ,
gautier.poupeau@gmail.com
@lespetitescases
http://www.lespetitescases.net
2. Web sémantique dans HAL
• Un sparql endpoint
https://data.archives-ouvertes.fr/sparql
dont la documentation est disponible à
https://data.archives-ouvertes.fr/doc/schema
• Des dumps calculés une fois par mois
https://data.archives-ouvertes.fr/backup
• Pas de négociation de contenu
https://data.archives-ouvertes.fr/
3. Le modèle des documents (1)
Exemple : https://data.archives-ouvertes.fr/document/hal-00000001v2
4. Le modèle des documents (2)
Document
versionné
document/
hal-00000001v2
Document
document/
hal-00000001
Fichier PDF
hal-
00000001v2/file/mq-
anglais.pdf
dcterms:hasVersion
ore:aggregates
Type de
document
Fabio URI
rdf:type
Auteur
Nœud blanc
dcterms:creator
Forme de
l’auteur
author/63529
hal:person
Stringfoaf:name
5. Astuce 1
trouver l’URI correspondant à un préfixe
Vous saisissez le préfixe
Le système renvoie une ou
plusieurs URIs
correspondantes
7. Rechercher les métadonnées associées à toutes les versions d’un document
URI utile
Document : https://data.archives-ouvertes.fr/document/inria-00362381
Exercice 1
select ?version ?p ?object
where
{
doc:inria-00362381 dcterms:hasVersion ?version.
?version ?p ?object.
}
8. Rechercher l’URI, le titre, le lien vers le PDF et les auteurs des différentes version du
document
URI utile
Document : https://data.archives-ouvertes.fr/document/inria-00362381
Exercice 2
select ?version ?title ?pdf ?person ?name
where
{
doc:inria-00362381 dcterms:hasVersion ?version.
?version dcterms:title ?title; dcterms:creator ?creator; ore:aggregates ?pdf.
?creator hal:person ?person.
?person foaf:name ?name
}
9. Astuce 3
concaténer les réponses d’une variable
select ?version ?title ?pdf GROUP_CONCAT(?name,',') AS ?authors
where
{
doc:inria-00362381 dcterms:hasVersion ?version.
?version dcterms:title ?title; dcterms:creator ?creator; ore:aggregates ?pdf.
?creator hal:person ?person.
?person foaf:name ?name
}
GROUP BY ?version ?title ?pdf
On regroupe les résultats par tous les autres éléments de la requête
On utilise le mot-clé GROUP_CONCAT(?variable,séparateur)
10. Type de dépôt et domaine
Exemple : https://data.archives-ouvertes.fr/doctype/Article
11. Rechercher l’URI et l’étiquette préférentielle des types de documents correspondants aux
différentes version d’un document
URI utile
Document : https://data.archives-ouvertes.fr/document/inria-00362381
Exercice 3
select ?version ?type ?label
where
{
doc:inria-00362381 dcterms:hasVersion ?version.
?version dcterms:type ?type.
?type skos:prefLabel ?label.
}
12. Astuce 4
Afficher uniquement la chaîne en français
select ?version ?type ?label
where
{
doc:inria-00362381 dcterms:hasVersion ?version.
?version dcterms:type ?type.
?type skos:prefLabel ?label.
FILTER (lang(?label)='fr')
}
Utilisation du mot-clé « FILTER »
13. Afficher l’étiquette préférentielle de tous les types de documents distincts avec la forme
« Fabien Gandon » pour auteur
URI utile
Forme auteur : https://data.archives-ouvertes.fr/author/827904
Exercice 4
select DISTINCT ?label
where
{
?document dcterms:hasVersion ?version.
?version dcterms:creator ?creator; dcterms:type ?type.
?creator hal:person <https://data.archives-ouvertes.fr/author/827904>.
?type skos:prefLabel ?label.
FILTER (lang(?label)='fr')
}
14. Astuce 5
Utiliser les opérateurs d’agrégation
count, sum, avg, min, max
select count(distinct ?person) AS ?nbPerson
where
{
doc:inria-00362381 dcterms:hasVersion ?version.
?version dcterms:creator ?creator.
?creator hal:person ?person
}
Rechercher le nombre d’auteurs d’un document toutes versions confondues
URI utile
Document : https://data.archives-ouvertes.fr/document/inria-00362381
15. Astuce 5
Utiliser les opérateurs d’agrégation
count, sum, avg, min, max
select ?version, count(distinct ?person) AS ?nbperson
where
{
doc:inria-00362381 dcterms:hasVersion ?version.
?version dcterms:creator ?creator.
?creator hal:person ?person
}
GROUP BY ?version
Rechercher le nombre d’auteurs par version d’un document
URI utile
Document : https://data.archives-ouvertes.fr/document/inria-00362381
16. Afficher le nombre de documents pour chaque types de documents distincts avec la forme
« Fabien Gandon » pour auteur
URI utile
Forme auteur : https://data.archives-ouvertes.fr/author/827904
Exercice 5
select ?type ?label count(distinct ?document)
where
{
?document dcterms:hasVersion ?version.
?version dcterms:creator ?creator; dcterms:type ?type.
?creator hal:person <https://data.archives-ouvertes.fr/author/827904>.
?type skos:prefLabel ?label.
FILTER (lang(?label)='fr')
}
GROUP BY ?type ?label
17. Astuce 6
Ordonner un résultat
select ?type ?label count(distinct ?document) AS ?nbdoc
where
{
?document dcterms:hasVersion ?version.
?version dcterms:creator ?creator; dcterms:type ?type.
?creator hal:person <https://data.archives-ouvertes.fr/author/827904>.
?type skos:prefLabel ?label.
FILTER (lang(?label)='fr')
}
GROUP BY ?type ?label
ORDER BY DESC(?nbdoc)
Afficher de manière décroissante le nombre de documents pour chaque types de
documents distincts avec la forme « Fabien Gandon » pour auteur
URI utile
Document : https://data.archives-ouvertes.fr/document/inria-00362381
18. Astuce 7
Manipuler les dates
Afficher le nombre de document associé à la forme « Fabrien Gandon » par an
URI utile
Forme auteur : https://data.archives-ouvertes.fr/author/827904
select year(?date) count(distinct ?document)
where
{
?document dcterms:hasVersion ?version.
?version dcterms:creator ?creator; dcterms:issued ?date.
?creator hal:person <https://data.archives-ouvertes.fr/author/827904>.
}
GROUP BY year(?date)
ORDER BY year(?date)
19. Afficher le nombre de documents pour chaque types de documents et chaque année avec
la forme « Fabien Gandon » pour auteur et ordonnée par année
URI utile
Forme auteur : https://data.archives-ouvertes.fr/author/827904
Exercice 7
select year(?date) ?label count(distinct ?document)
where
{
?document dcterms:hasVersion ?version.
?version dcterms:creator ?creator; dcterms:issued ?date; dcterms:type ?type.
?creator hal:person <https://data.archives-ouvertes.fr/author/827904>.
?type skos:prefLabel ?label.
FILTER (lang(?label)='fr')
}
GROUP BY year(?date) ?label
ORDER BY year(?date)
20. Modèle pour la forme d’un auteur
Exemple : https://data.archives-ouvertes.fr/author/827904
21. Afficher toutes les métadonnées associées à la forme « Fabien Gandon »
URI utile
Forme auteur : https://data.archives-ouvertes.fr/author/827904
Exercice 8
select ?p ?o
where
{
<https://data.archives-ouvertes.fr/author/827904> ?p ?o
}
22. Afficher les URIs de toutes les formes associées à la forme « Fabien Gandon » via l’IdHAL
URI utile
Forme auteur : https://data.archives-ouvertes.fr/author/827904
Exercice 9
select ?forme
where
{
<https://data.archives-ouvertes.fr/author/827904> ore:isAggregatedBy ?o.
?forme ore:isAggregatedBy ?o.
}
23. Afficher le nombre de documents associés à chaque forme associés à l’IdHAL relié à la
forme « Fabien Gandon »
URI utile
Forme auteur : https://data.archives-ouvertes.fr/author/827904
Exercice 10
select ?forme count(DISTINCT ?document)
where
{
<https://data.archives-ouvertes.fr/author/827904> ore:isAggregatedBy ?o.
?forme ore:isAggregatedBy ?o.
?creator hal:person ?forme.
?version dcterms:creator ?creator.
?document dcterms:hasVersion ?version
}
GROUP BY ?forme
24. Afficher le nombre de documents associés à chaque forme associés à l’IdHAL relié à la
forme Fabien Gandon par an
URI utile
Forme auteur : https://data.archives-ouvertes.fr/author/827904
Exercice 11
select year(?date) AS ?year count(DISTINCT ?document) AS ?nbdoc
where
{
<https://data.archives-ouvertes.fr/author/827904> ore:isAggregatedBy ?o.
?forme ore:isAggregatedBy ?o.
?creator hal:person ?forme.
?version dcterms:creator ?creator; dcterms:issued ?date.
?document dcterms:hasVersion ?version
}
GROUP BY year(?date)
25. Astuce 8
Requête et sous requête
Afficher la moyenne des documents par an associés à toutes les formes liées à « Fabien
Gandon »
URI utile
Forme auteur : https://data.archives-ouvertes.fr/author/827904
SELECT avg(?nbdoc)
WHERE {
select year(?date) AS ?year count(DISTINCT ?document) AS ?nbdoc
where
{
<https://data.archives-ouvertes.fr/author/827904> ore:isAggregatedBy ?o.
?forme ore:isAggregatedBy ?o.
?creator hal:person ?forme.
?version dcterms:creator ?creator; dcterms:issued ?date.
?document dcterms:hasVersion ?version
}
GROUP BY year(?date)
}
26. Afficher tous les identifiants externes liées à Fabien Gandon
URI utile
Forme auteur : https://data.archives-ouvertes.fr/author/827904
Exercice 12
select DISTINCT ?idhal ?identifiant
where
{
<https://data.archives-ouvertes.fr/author/827904> ore:isAggregatedBy ?idhal.
?forme ore:isAggregatedBy ?idhal.
?forme owl:sameAs ?identifiant
}
27. Astuce 9
Faire une recherche dans une chaîne de caractères
Afficher les identifiants ORCID distincts liés à toutes les formes liées à « Fabien Gandon »
URI utile
Forme auteur : https://data.archives-ouvertes.fr/author/827904
select DISTINCT ?idhal ?orcid
where
{
<https://data.archives-ouvertes.fr/author/827904> ore:isAggregatedBy ?idhal.
?forme ore:isAggregatedBy ?idhal.
?forme owl:sameAs ?orcid.
FILTER regex(str(?orcid), 'orcid.org')
}
28. Afficher les identifiants ORCID de tous les membres d’INRIA et pour chaque ORCID,
concaténer les différentes URIs des formes associées
URI utile
INRIA : https://data.archives-ouvertes.fr/structure/300009
Exercice 13
select ?orcid ?name GROUP_CONCAT(str(?forme),',')
where
{
?forme foaf:member <https://data.archives-ouvertes.fr/structure/300009>;
foaf:name ?name;
owl:sameAs ?orcid.
FILTER regex(str(?orcid),'orcid.org')
}
GROUP BY ?orcid ?name
ORDER BY ?name
29. Afficher tous les membres d’INRIA et pour chaque membre, éventuellement l’identifiant
ORCID et l’identifiant idHal
URI utile
INRIA : https://data.archives-ouvertes.fr/structure/300009
Astuce 10
OPTIONAL
select DISTINCT ?name ?orcid ?idHal
where
{
?forme foaf:member <https://data.archives-ouvertes.fr/structure/300009>;
foaf:name ?name.
OPTIONAL {?forme owl:sameAs ?orcid. FILTER regex(?orcid,'orcid.org')}
OPTIONAL {?forme ore:isAggregatedBy ?idHal}
}
ORDER BY ?name
30. Astuce 11
La négation
Afficher les membres qui ont un identifiant idHAL mais pas d’ORCID
URI utile
INRIA : https://data.archives-ouvertes.fr/structure/300009
select DISTINCT ?idHal ?name
where
{
?forme foaf:member <https://data.archives-ouvertes.fr/structure/300009>;
foaf:name ?name; ore:isAggregatedBy ?idHal
FILTER NOT EXISTS {?forme owl:sameAs ?orcid. FILTER regex(?orcid,'orcid.org')}
}
ORDER BY ?name
31. Afficher tous les membres d’INRIA qui n’ont pas d’identifiant idHAL et concaténés par la
forme
URI utile
INRIA : https://data.archives-ouvertes.fr/structure/300009
Exercice 14
select ?name, GROUP_CONCAT(str(?forme), '|')
where
{
?forme foaf:member <https://data.archives-ouvertes.fr/structure/300009>;
foaf:name ?name.
FILTER NOT EXISTS {?forme ore:isAggregatedBy ?idHal}
}
GROUP BY ?name
ORDER BY ?name
32. Afficher tous les domaines des membres d’INRIA et pour chaque domaine le nombre de
documents associés ordonné de manière décroissante
URI utile
INRIA : https://data.archives-ouvertes.fr/structure/300009
Exercice 15
select ?topic ?prefLabel count(DISTINCT ?document) AS ?nbdoc
where
{
?forme foaf:member <https://data.archives-ouvertes.fr/structure/300009>.
?version hal:topic ?topic; dcterms:creator ?creator.
?creator hal:person ?forme.
?topic skos:prefLabel ?prefLabel.
?document dcterms:hasVersion ?version.
FILTER (lang(?prefLabel)='fr')
}
GROUP BY ?topic ?prefLabel
ORDER BY DESC(?nbdoc)
33. Afficher tous les co-auteurs de Fabien Gandon et le nombre d’articles pour chacun d’entre
eux
URI utile
idHal de Fabien Gandon : https://data.archives-ouvertes.fr/structure/300009
Exercice 16
select ?name count(DISTINCT ?document) AS ?nbdoc
where
{
?forme ore:isAggregatedBy <https://data.archives-ouvertes.fr/author/fabien-
gandon>.
?version hal:topic ?topic; dcterms:creator ?creator.
?creator hal:person ?forme.
?document dcterms:hasVersion ?version.
?version dcterms:creator ?autresCreator.
?autresCreator hal:person ?autresformes.
?autresformes foaf:name ?name.
FILTER (?name !='Fabien Gandon')
}
GROUP BY ?name
ORDER BY DESC(?nbdoc)
34. Astuce 12
Limiter les résultats de comptage
Afficher tous les co-auteurs de Fabien Gandon et le nombre d’articles pour chacun d’entre
eux et ayant plus de 1 document en commun
URI utile
idHal de Fabien Gandon : https://data.archives-ouvertes.fr/author/fabien-gandon
select ?name count(DISTINCT ?document) AS ?nbdoc
where
{
?forme ore:isAggregatedBy <https://data.archives-ouvertes.fr/author/fabien-
gandon>.
?version hal:topic ?topic; dcterms:creator ?creator.
?creator hal:person ?forme.
?document dcterms:hasVersion ?version.
?version dcterms:creator ?autresCreator.
?autresCreator hal:person ?autresformes.
?autresformes foaf:name ?name.
FILTER (?name !='Fabien Gandon')
}
GROUP BY ?name
HAVING (count(DISTINCT ?document) > 1)
ORDER BY DESC(?nbdoc)
35. Modèle pour les personnes IdHAL
C’est beau mais malheureusement,
ce n’est pas dans le triple store
36. Modèle pour les structures
Exemple : https://data.archives-ouvertes.fr/structure/300009
37. Afficher toutes les organisations et leur terme préférentiel
URI utile
Classe Organisation : http://www.w3.org/ns/org#Organization
INRIA : https://data.archives-ouvertes.fr/structure/300009
Exercice 17
select ?structure ?prefLabel
where
{
?structure a org:Organization; skos:prefLabel ?prefLabel.
}
38. Modèle pour les revues
https://data.archives-ouvertes.fr/revue/109707
39. Modèles pour les projets
Exemple : https://data.archives-ouvertes.fr/anrProject/1001
https://data.archives-ouvertes.fr/europeanProject/129494
40. Afficher toutes les projets ANR dont sont issues les documents écrits par des membres de
l’INRIA
URI utile
Classe projet : http://www.eurocris.org/ontologies/cerif/1.3/
INRIA : https://data.archives-ouvertes.fr/structure/300009
Exercice 18
select DISTINCT ?projet ?title ?acronym ?startDate
where
{
?forme foaf:member <https://data.archives-ouvertes.fr/structure/300009>.
?version dcterms:source ?projet; dcterms:creator ?creator.
?creator hal:person ?forme.
?projet a cerif:Project; cerif:title ?title; cerif:startDate ?startDate.
OPTIONAL {?projet cerif:acronym ?acronym}
FILTER regex(str(?projet),'anrProject')
}
ORDER BY DESC(?startDate)
41. Afficher toutes les projets ANR dont sont issues les documents écrits par des membres de
l’INRIA et pour chacun le nombre de documents associés
URI utile
Classe projet : http://www.eurocris.org/ontologies/cerif/1.3/
INRIA : https://data.archives-ouvertes.fr/structure/300009
Exercice 19
select ?projet ?title ?acronym ?startDate count(DISTINCT ?document) AS ?nbdoc
where
{
?forme foaf:member <https://data.archives-ouvertes.fr/structure/300009>.
?version dcterms:source ?projet; dcterms:creator ?creator.
?creator hal:person ?forme.
?projet a cerif:Project; cerif:title ?title; cerif:startDate ?startDate.
OPTIONAL {?projet cerif:acronym ?acronym}
FILTER regex(str(?projet),'anrProject')
?document dcterms:hasVersion ?version.
}
GROUP BY ?projet ?title ?acronym ?startDate
ORDER BY DESC(?nbdoc)