Spatio-temporal Wikidata. Exploration de données ouvertes et liées du Web 3.0

Histoire de cadre : élaboration d’une trajectoire spatio-temporelle

Raphaëlle Krummeich (UMR IDEES, université de Rouen Normandie)

Hugues Pecout (UMR Géographie-cités, CNRS)

Sébastien Rey-Coyrehourcq (UMR IDEES, université de Rouen Normandie)

featured

Cet article est le fruit d’un dialogue interdisciplinaire entre membres du GT Notebook initié dans le cadre d’un atelier proposé à la journée d’études normande sur les données de la recherche qui s’est déroulée en décembre 2021. Il présente une analyse exploratoire reproductible de données ouvertes et liées d’un fragment de graphe Wikidata, interrogeables sous la forme de triplets RDF. Les enjeux d’un tel processus inter-disciplinaire sont esquissés en conclusion. Une ébauche des requêtes SPARQL élaborées a fait l’objet d’une présentation et d’échanges au sein des ateliers du Web Sémantique au printemps 2021.

Introduction

Cet article ou notebook présente une exploration du graphe Wikidata (cf. parties 1.2 et 3) et le traitement des données extraites (cf. parties 2 et 4).

Du requêtage en langage SPARQL (cf. partie 1.3) au traitement et à la représentation des données issues du graphe Wikidata, il présente, étape par étape, l’ensemble de la chaîne de traitement réalisée. Le processus exploratoire, parfois itératif, a été conservé afin de mieux comprendre l’approche réflexive des auteurs et autrice. Ce notebook retranscrit les démarches scientifique et méthodologique adoptées.

Le schéma organisant ces données est esquissé dans la partie 1. Afin de permettre une reproduction des traitements et des résultats présentés, les données automatiquement collectées au 11 mars 2025 et utilisées sont mises à disposition (cf. partie 2.2). L’idée de départ conduit à la démarche suivante en 3 étapes :

  • requêter les données (ou suivre des chemins) du graphe Wikidata,
  • identifier certaines des modalités du graphe pouvant comporter une dimension spatiale et temporelle et ainsi,
  • reconstruire et représenter une ou des trajectoires dans le temps et l’espace.

Compte tenu du formalisme et de l’hétérogénéité des données non supervisées de Wikidata, deux images d’objet sont choisies pour l’étude : un artiste peintre et une de ses peintures, exposée au sein de musées ou d’institutions culturelles dans le monde. Pour reproduire partiellement l’expérimentation, un exemple d’exploration du graphe Wikidata pour diverses images d’artistes peintres est proposée dans la partie 7.


NB : le terme “image” utilisé ici correspond à une sémantique de l’individu présent dans l’espace numérique sous la forme de données et de métadonnées en relation avec d’autres images d’objet, selon Hui (2015). En ce sens, les œuvres elles-mêmes, photographiées ou scannées sous différents formats (eg. .jpg .png) sont désignées par le terme d’“illustrations” ou de fichiers. Pour simplifier le discours, l’image d’individu est désignée par l’individu lui-même : par exemple, l’image du peintre Johannes Vermeer, l’entité Wikidata de valeur Q41264 définie par ses relations dans l’espace numérique, est désignée par Johannes Vermeer ou Vermeer. Le fichier .jpg Wikidmédia de son autoportrait supposé, fragment de l’œuvre intitulée “l’Entremetteuse”, est une illustration représentant le peintre.


1 Wikimédia, Wikidata & W3C

1.1 Données ouvertes et liées du graphe Wikidata

Wikidata est une base de connaissances libre, éditée de manière collaborative et hébergée par la fondation Wikimedia. Son contenu étant placé sous licence CC0 (« Transfert dans le Domaine Public »), elle permet de centraliser l’accès aux données utilisées par différents projets Wikimedia (Wikipédia (2021)).

Les informations saisies dans Wikidata sont des données ouvertes “brutes” multilingues non supervisées qui sont liées, notamment, aux articles de l’encyclopédie contributive Wikipedia. Wikidata est à différencier de l’ontologie DBpedia1 (figure 1) au sens où l’ontologie sous-jacente de Wikidata n’est pas formalisée a priori - ce qui est le cas de DBpedia -, mais elle émerge des usages et pratiques de la communauté Wikidata. En effet, les deux dispositifs à vocation encyclopédique diffèrent dans leurs finalités initiales. DBpedia est un effort de la communauté scientifique pour extraire des informations structurées du projet encyclopédique Wikipedia et les lier à d’autres formalismes de données du Web sémantique. Wikidata est un dispositif de curation2 ou d’annotation de données par les contributeurs et contributrices de Wikipedia ou Wikidata.

Figure 1 : Principales différences entre des données Wikipedia (DBpedia) et des données Wikidata. Dbpedia est la façon dont Wikipedia est traduit en dépôts de triplets RDF statique.
Source : Wikidata-Basics | Wikidata Hackathon event for the Festival of Creative Learning, 2018


La base Wikidata fournit un support à de nombreux autres sites et services au-delà des seuls projets de Wikimedia. Son contenu est exporté dans des formats standards et peut être lié ou aligné à d’autres ensembles de données ouvertes sur le Web des données3. Wikidata offre ainsi un large domaine d’informations générales sur notre univers ou ses représentations et des liens vers d’autres graphes ou bases de données. Il contient à ce jour plus de 100 millions d’items.
La dynamique de création collective de ce projet encyclopédique peut être saisie à l’oreille grâce à l’application développée par Stephen LaPorte et Mahmoud Hashemi.

1.2 Standard RDF du W3C

Le RDF (Resource Data Framework) est un cadre général de modélisation utilisé pour décrire formellement les ressources du Web4 via leurs métadonnées afin de permettre le traitement par inférence de telles descriptions. Développé par le W3C5, le RDF est le formalisme de base du Web sémantique.

Au sein de ce paradigme, un document ou une ressource consiste en un ensemble de triplets6, chacun associant un sujet, un prédicat et un objet :

  • le “sujet” du prédicat représente la ressource à décrire,
  • le “prédicat” représente un type de propriété applicable à cette ressource,
  • l’“objet” représente une donnée, une autre ressource ou une valeur associée à la propriété (ou prédicat).

Le sujet et l’objet, dans le cas où ce sont des ressources, peuvent être identifiés par un identifiant unique de la ressource (URI7), une valeur ou être des nœuds anonymes. Le prédicat est nécessairement identifié par un identifiant unique de la ressource. Par exemple, la déclaration “Bob s’intéresse à Mona Lisa” est formalisée de la manière suivante :

Figure 2 : Exemple de représentation des composantes génériques d’un triplet RDF.
Source : W3C


Un dépôt de triplets RDF ainsi formé correspond à un multigraphe orienté étiqueté : chaque triplet correspond alors à une arête orientée dont l’étiquette est le prédicat, le sujet est le nœud source et l’objet est le nœud cible (figure 3).

Figure 3 : Exemple de graphe formé par plusieurs triplets RDF.
Source : W3C


1.3 Le langage SPARQL

SPARQL8 (prononcé sparkle, en français : « étincelle ») est à la fois un langage de requête et un protocole qui permettent de rechercher, d’ajouter, de modifier ou de supprimer des triplets RDF disponibles à travers le Web. Aujourd’hui, le Web de données (représenté par le nuage du Linked Open Data ou ses domaines) est interrogeable via des centaines de services SPARQL qui mettent à disposition de plus en plus de graphes de données ouvertes et liées comme c’est le cas du projet plurilingue Wikidata (Wikipédia (2022)).

Vocabulaire ou espace de noms

Dans Wikidata les entités et leurs coordonnées spatiales et temporelles sont modélisées selon les fragments de graphes lisibles par l’humain et la machine dans divers formats9 : XML, json, turtle, etc. Ces différents formats proposent une sérialisation différente d’un même modèle, le RDF. Ce sont des graphes de connaissances qui décrivent des entités et leurs relations. Pour Wikidata comme pour d’autres modèles de données, il existe un vocabulaire spécifique. En général, les ontologies du Web sémantique disposent d’un vocabulaire décrit au sein d’espaces de noms associés au micro-monde décrit.

Par exemple, pour modéliser les données des réseaux sociaux, il existe un vocabulaire dédié Friend of a friend (FOAF) ; pour les ressources bibliographiques, la BnF mobilise notamment le vocabulaire Functional Requirements for Bibliographic Records (FRBR) élaboré par la Fédération internationale des associations et institutions de bibliothèques (IFLA) etc. Un autre exemple est l’ontologie du domaine associée à la diffusion de la musique fondée en 2002 avec l’initiative MusicBrainz (Swartz 2002), “corne d’abondance des communs” musicaux, déployée avec l’émergence du Web.

L’espace de nom de l’ontologie de Wikipedia, DBpedia est accessible à cette URL : https://dbpedia.org/ontology/.

Préfixes et requêtes

À chaque vocabulaire utilisé pour construire la requête sont associés différents préfixes10. Dans le cas présenté, la déclaration du vocabulaire mobilisé (celui de Wikidata notamment) est intégrée aux packages utilisés. Toutefois, en général, il est nécessaire de le préciser dans l’en-tête de la requête SPARQL, sous une certaine forme :

PREFIX préfixe: <espace de nom>

Les éléments d’un triplet prennent alors la forme suivante :

prédicat = préfixe:propriété
domaine/co-domaine = préfixe:entité

Le préfixe identifie le cadre de définition de concept. Par exemple, l’entité “ville” peut être décrite par “la ville de l’urbaniste”, “la ville du géographe”, “la ville selon l’Insee”, etc. En effet, les ontologies et les vocabulaires sont généralement construits dans un cadre disciplinaire (histoire, épidémiologie, géographie, biologie, etc.) ou de domaine d’activité (bibliothèques, musées, archives, etc.). Il est donc possible de retrouver un même terme désignant une entité ou un concept, mais qui le définit différemment. Par exemple, supposons que les termes ou concepts d’un champ de l’urbanisme sont décrits dans l’espace numérique dans une page http://mondomaineurbanisme.fr/, et ceux d’un champ de la géographie dans une autre page http://mondomainegeographie.fr/ (toutes deux fictives ici). Les préfixes associés, respectivement PREFIX urba:<http://mondomaineurbanisme.fr/#> et PREFIX geo:<http://mondomainegeographie.fr/#> par exemple, permettent non seulement de simplifier la syntaxe : <http://mondomaineurbanisme.fr/#>:ville en urba:ville ou <http://mondomainegeographie.fr/#>:ville en geo:ville mais aussi de résoudre les questions de définition ou de polysémie d’un même terme (ici “ville”) dans deux domaines disciplinaires différents.

Classiquement, pour rechercher dans le vocabulaire DBpedia (dbo) des entités qui ont pour type ville dans le vocabulaire RDF (rdf), on peut écrire le triplet sous la forme suivante :

?city rdf:type dbo:city

sous réserve de déclarer en tête de la requête SPARQL les préfixes des vocabulaires DBpedia et RDF :

PREFIX dbo: <http://dbpedia.org/ontology/> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 

Puis, si on souhaite connaître leur pays de rattachement, dans le vocabulaire DBpedia, on peut écrire un second triplet :

?city dbo:country ?country

Au sein des deux triplets, le point d’interrogation ? permet de préciser, dans la requête, quelles sont les entités recherchées : des objets de type ville (dbo:city) dans la variable ?city et leur pays respectif (dbo:country) dans la variable ?country.

Avec la déclaration des espaces de noms et la simplification de la syntaxe utilisant des préfixes, il est possible d’interroger des graphes (bases de données dites NoSQL11) au moyen d’un protocole SPARQL sur un point de présence (SPARQLEndPoint) au sein d’un réseau HTTP.

Dans la suite, plusieurs préfixes Wikidata spécifiques aux entités et aux types de propriétés sont utilisés. Dans le cadre de notre étude, le tableau suivant récapitule les classes et propriétés utilisées, ainsi que quelques préfixes du schéma Wikidata utilisés pour former les triplets :

classe ou propriété préfixe exemple(s) de chemin label Wikidata
P31 wdt ?identifiant wdt:P31 ?naturedelelement nature de l’élément
Q5 wd ?identifiant wdt:P31 wd:Q5 être humain
P373 wdt ?identifiant wdt:P373 ‘Johannes Vermeer’ a pour catégorie
P18 wdt ?identifiant wdt:P18 ?image a pour image
P170 wdt, ps ?oeuvre wdt:P170 wd:Q41264 OU
?oeuvreSt ps:P170 wd:Q41264
créé par
(Q41264 identifie le peintre Johannes Vermeer)
P276 wdt, p ?oeuvre wdt:P276 ?lieu OU
?oeuvre p:P276 ?lieuSt
a pour lieu
P625 wdt ?musee wdt:P625 ?coord coordonnées
P580 pq ?lieuSt pq:P580 ?dated a pour date de début
P582 pq ?lieuSt pq:P582 ?datef a pour date de fin
label, language wikibase SERVICE wikibase:label {
bd:serviceParam wikibase:language “[AUTO_LANGUAGE], fr,en”.}
syntaxe du service de nom et de langue de l’API WikidataQueryService

Dans le cas où le prédicat de Wikidata est utilisé avec le préfixe p, ps ou pq, la donnée associée est une assertion (spécifiée dans la tableau par le suffixe -St), c’est-à-dire un autre triplet. Ces spécificités du graphe Wikidata sont abordées dans la partie 3.

2 Packages et données

2.1 Packages utilisés

Les packages utilisés pour réaliser l’ensemble de la chaîne de traitement présenté dans ce document sont les suivants :

  • wikidataR12 (et son extension WikidataQueryServiceR) : permet d’écrire une requête pour interroger le graphe de données Wikidata au moyen d’une interface de programmation d’application (API) pour le service de requêtes Wikidata en langage SPARQL13 ;
  • rnaturalearth : met à disposition les données géographiques de Natural Earth ;
  • sf : permet la gestion et la manipulation de données géographiques vectorielles ;
  • dplyr : pour la manipulation des données ;
  • mapview : pour l’affichage interactif de données géographiques (repose sur la librairie JavaScript Leaflet) ;
  • tmap : pour la création de cartes thématiques ;
  • ggplot2 : permet la production de graphiques basés sur la grammaire graphique (Wilkinson 2005) ;
  • av : génère des vidéos à partir d’images ou de graphiques R ;
  • patchwork : permet de combiner plusieurs graphiques ggplot2 dans la fenêtre graphique ;
  • jpeg : permet l’import, l’enregistrement et l’affichage des images matricielles (format bitmap) ;

Vous pouvez utiliser les lignes de code suivantes pour installer ces packages :

# Liste des packages du CRAN nécessaires
liste_packages <- c("WikidataR",
                    "WikidataQueryServiceR",
                    "remotes",
                    "rnaturalearth",
                    "sf",
                    "dplyr",
                    "mapview",
                    "tmap",
                    "ggplot2",
                    "av",
                    "patchwork",
                    "jpeg")

# Packages à installer
liste_packages_a_installer <- liste_packages[!(liste_packages %in% installed.packages()[,"Package"])]

# Installation des packages manquants
install.packages(liste_packages_a_installer)

# Pour les versions les plus récentes de RStudio
# see https://stackoverflow.com/questions/78402917/compiling-error-for-packages-installation\
#-after-updating-to-r-4-4-on-ubuntu-22-0 et, le cas échéant, décommenter ci-dessous.
# install.packages("progress")

Les informations sur le système d”exploitation et les versions des packages utilisés pour générer ce notebook sont disponibleq en fin de document.

2.2 Données collectées

Plusieurs sources de données sont utilisées pour ce travail exploratoire :

  1. des données issues du graphe Wikidata ;
  2. une couche géographique Natural Earth ;
  3. des fonds de carte accessibles via Leaflet.
Afin de maximiser la reproductibilité du code présenté, les jeux de données 1 et 2 ont été archivés et sont disponibles au téléchargement :


Télécharger les données



3 Exploration du graphe Wikidata

Voici quelques éléments basiques du langage SPARQL permettant d’interroger la base de données Wikidata :

  • la clause SELECT des données interrogées renvoie les variables spécifiques (avec COUNT, qui renvoie le nombre des ces données ou avec GROUP_CONCAT, qui les concatène au sein d’une collection, regroupées par GROUP BY et triées par ORDER BY),
  • qui, accompagnée de la clause WHERE { }, les lie à l’interrogation de propriétés et données associées, suivant les chemins du graphe,
  • avec un service WikiLabel spécifique au point d’accès Wikidata Query Service, du fait du caractère plurilingue de certaines données du graphe Wikidata, permettant de limiter le résultat à la langue choisie wikibase:language du label wikibase:label associé à l’entité ou la propriété recherchée,
  • ou encore avec la fonctionnalité OPTIONAL de la clause WHERE qui permet de renvoyer les variables même si les données liées aux propriétés ne sont pas instanciées (nœuds vides),
  • et les différents préfixes associés aux spécificités des propriétés simples, directes et indirectes, etc. des fragments de graphe de Wikidata (+d’info).

Afin de permettre une bonne compréhension des requêtes réalisées pour la collecte de données sans entrer dans le détail de la syntaxe propre à SPARQL, celles-ci sont formulées de la manière suivante :

SELECT [données interrogées] [comptage ou concatenage] WHERE 
  { 
  [chemins principaux du graphe]
  [chemins optionnels du graphe]
  [service Wikilabel]
  } 
[groupe]
[ordonne]


3.1 Modèle des données : artistes peintres et trajectoires de leurs œuvres

Le fragment de graphe de l’image Wikidata d’une peinture, objet du processus exploratoire, est illustré sous la forme d’un tableau dans la figure 4 ci-dessous.

Figure 4 : Représentation tabulaire d’une entité Wikidata avec les principaux termes utilisés. Les déclarations de localisation ou du créateur (“statements” en jaune sur le schéma) peuvent utiliser des valeurs (en vert) et des qualificatifs (“qualifiers”, en orange), ici associés aux données de lieux et aux laps de temps.
Source : Wikidata


Pour plus d’informations, vous pouvez consulter l’introduction à Wikidata ou la page Wikibase dédiée au formalisme du dépôt de données Wikidata.

Après plusieurs explorations, nous avons décidé de nous intéresser, dans une première étape, au peintre néerlandais du XVIIe siècle, Johannes Vermeer.

Les fonctions find_item et find_property du package WikidataR permet d’interroger le graphe à partir d’une chaîne de caractères.

# Chargement du package WikidataR
library(WikidataR)

1. Entités liées à “Johannes Vermeer”

Il est par exemple possible de collecter les entités (item) correspondant à la chaîne de caractères “Johannes Vermeer” :

# Chercher les entités du graphe Wikidata correspondant à "Johannes Vermeer"
resultat_item <- find_item("Johannes Vermeer")

print(resultat_item)

    Wikidata item search

Number of results:   10 

Results:
1    Johannes Vermeer (Q41264) - Dutch painter (1632–1675) 
2    Jan Vermeer van Haarlem the Elder (Q3159680) - painter from the Northern Netherlands and father of Barend, Isaac, and Jan Vermeer or van der Meer II (1628-1691) 
3    Johannes Vermeer (Q15283995) - art exhibition 
4    Johannes Vermeer (Q102229722) - Ph.D. Vrije Universiteit Amsterdam 1983 
5    Johannes Vermeer (exhibition catalogue) (Q15284018) - catalogue of the Johannes Vermeer exhibition at the National Gallery of Art, 1995-1996 
6    Johannes Vermeer catalog raisonné, 1908 (Q26235177) - catalog raisonné of Vermeer works by Cornelis Hofstede de Groot 
7    Johannes Vermeer (Q2164464) - international train between Amsterdam and Cologne 
8    Johannes Vermeer (Q124100835) - civil servant in the Dutch East Indies 
9    Johannes Vermeer (Q19280548) - street in Ouderkerk aan de Amstel, the Netherlands 
10   Johannes Vermeer Award (Q2141982) - Dutch art award 

Une seule entité de valeur Q41264 parmi les dix collectées semble correspondre à l’image au sens de (Hui 2015) de l’objet Johannes Vermeer, le peintre recherché. Le résultat de la requête find_item est composé d’un ensemble d’informations ($id, $repository, etc.).

resultat_item[[1]]
$id
[1] "Q41264"

$title
[1] "Q41264"

$pageid
[1] 43555

$concepturi
[1] "http://www.wikidata.org/entity/Q41264"

$repository
[1] "wikidata"

$url
[1] "//www.wikidata.org/wiki/Q41264"

$display
$display$label
$display$label$value
[1] "Johannes Vermeer"

$display$label$language
[1] "en"


$display$description
$display$description$value
[1] "Dutch painter (1632–1675)"

$display$description$language
[1] "en"



$label
[1] "Johannes Vermeer"

$description
[1] "Dutch painter (1632–1675)"

$match
$match$type
[1] "label"

$match$language
[1] "en"

$match$text
[1] "Johannes Vermeer"

Le champ match correspond à la chaîne de caractères recherchée : il est de $type label, en$language en, sous forme de $text Johannes Vermeer.


2. Propriétés liées à “artiste”

Pour connaître les propriétés (properties) associées à celle des termes “artiste” ou “peintre” par exemple, on utilise find_property.

find_property("artiste")

    Wikidata property search

Number of results:   5 

Results:
1    creator (P170) - maker of this creative work or other object (where no more specific property exists) 
2    Joconde author ID (P7711) - identifier for a person in the Service des Musées de France Joconde authority file 
3    Artists in Canada record number (P5239) - authority control maintained by National Gallery of Canada Library listing biographical data for artists who were born in Canada or worked in Canada 
4    make-up artist (P4805) - person in charge of make-up 
5    game artist (P3080) - game artist(s) that produced art assets for role-playing games, collectible card games, video game, etc. 

3. Propriétés liées à “peintre”

resultat_property <- find_property("peintre")

print(resultat_property)

    Wikidata property search

Number of results:   1 

Results:
1    creator (P170) - maker of this creative work or other object (where no more specific property exists) 

La propriété associée au terme choisi “peintre” (P170) semble être celle liant un créateur à son œuvre ou autre objet. On comprend comment ce terme est lié à cette propriété dans le modèle de Wikidata en explicitant le champ $match :

resultat_property[[1]]$match
$type
[1] "alias"

$language
[1] "fr"

$text
[1] "peintre"

La chaîne de caractères “peintre” est une forme textuelle $text de $type “alias” de la propriété P170, dans la langue française.

3.2 Déterminer l’identifiant Wikidata d’un peintre

Ces premières investigations du graphe permettent de comprendre que, pour collecter de manière précise des données spatio-temporelles associées aux œuvres créées par Johannes Vermeer, les modalités d’interrogation nécessitent d’identifier de manière suffisamment explicite l’entité recherchée telle qu’elle est modélisée au sein du fragment de graphe (figure 5).

Figure 5 : Schéma des triplets de données d’entrée et de sortie du fragment de graphe Wikidata exploré. La clause SELECT s’applique aux éléments figurés en données en sortie. Les propriétés et objets associés (en entrée ou sortie), c’est-à-dire les chemins du graphe, sont insérés dans l’accolade de WHERE.


Formalisation de la requête de recherche d’identifiant :

Sélection  de(s) identifiant(s) où  {
   l'identifiant est de type humain;                   # chemin principal
   et il entre dans la catégorie "Johannes Vermeer";   # chemin principal (fin)
   } 
 

Écriture de la requête en SPARQL :

SELECT ?identifiant 
          WHERE
          {
            ?identifiant wdt:P31 wd:Q5;
            wdt:P373 'Johannes Vermeer'.
          }

Schéma : Image de la requête saisie dans le service de requête de wikidata accessible ici : https://query.wikidata.org/


Assignation de la requête dans R sous forme de chaîne de caractères dans un objet (le symbole “\” est un caractère d’échappement permettant de conserver une structure verbeuse de la requête) :

query <- "SELECT ?identifiant  \
          WHERE \
          { \
            ?identifiant wdt:P31 wd:Q5; \
            wdt:P373 'Johannes Vermeer'. \
          }"

A l’aide de la fonction query_wikidata du package WikidataR, nous commençons dans un premier temps par obtenir l’identifiant Wikidata du peintre. Il est possible de réaliser la même requête avec le package WikidataQueryServiceR.

# Chargement des packages nécessaires
library(WikidataR)
library(WikidataQueryServiceR)

WikidataR

Exécution de la requête avec WikidataR :

data1_WR <- WikidataR::query_wikidata(query)

Données récupérées :

WikidataQueryServiceR

Exécution de la requête avec WikidataQueryServiceR :

data1_WQSR <- WikidataQueryServiceR::query_wikidata(query)

Données récupérées :


3.3 Lister les œuvres du peintre et trouver leurs localisations géographiques

Dans cette seconde étape, on se propose de lister les œuvres de Johannes Vermeer avec leurs localisations. Au sein du graphe Wikidata, on fait l’hypothèse que les coordonnées de la localisation d’une œuvre, c’est-à-dire la valeur point(x,y), sont celles du musée ou de l’institution où l’œuvre est actuellement exposée ou située. Afin d’obtenir cette localisation à partir de l’identifiant du peintre, on trace un premier chemin du graphe tel qu’illustré dans la figure 6.

On utilise le terme SPARQL OPTIONAL pour permettre de collecter les données y compris dans le cas où l’information de localisation d’une œuvre n’existerait pas dans Wikidata.

Figure 6 : Entités, valeurs et propriétés simples du graphe Wikidata mobilisées pour la localisation des œuvres de Johannes Vermeer. La valeur point(x,y) donne les coordonnées géographiques dans le système de référence World Geodetic System (WGS84). Le nom des œuvres et des musées (suffixe “Label”) est obtenu par le service wikibase:label du package WikidataQueryServiceR, dans la langue wikibase:language choisie ou la fonction sqp_label du package glitter.


3.3.1 Construction des requêtes

WikidataR

Formalisation de la recherche des œuvres de Vermeer et de leur localisation :

Sélectionner les données œuvre, musée et coordonnées telles que {
    l'œuvre a pour peintre Johannes Vermeer;               # chemin principal
    en option {
                 l'œuvre est localisée dans un musee          # chemin optionnel
                 ce musée a pour localisation les coordonnées  # chemin optionnel
              }
}

Écriture de la requête en SPARQL :

SELECT ?oeuvre ?musee ?coord WHERE 
           { 
             ?oeuvre wdt:P170 wd:Q41264 . 
             OPTIONAL 
             {  
               ?oeuvre wdt:P276 ?musee . 
               ?musee wdt:P625 ?coord 
             } 
           }

Schéma : Image de la requête saisie dans le service de requête de wikidata accessible ici : https://query.wikidata.org/


Assignation de la requête dans R sous forme de chaîne de caractères dans un objet et exécution de la requête :

 query <- "SELECT ?oeuvre ?musee ?coord WHERE \
           { \
             ?oeuvre wdt:P170 wd:Q41264 . \
             OPTIONAL \
             { \ 
               ?oeuvre wdt:P276 ?musee . 
               ?musee wdt:P625 ?coord \
             } \ 
           }"

## Exécution de la requête
data2_WR <- WikidataR::query_wikidata(query)

Données récupérées :


WikidataQueryServiceR

Formalisation de la recherche des œuvres de Vermeer et de leur localisation désignées par leur nom en anglais :

Sélectionner les noms des données oeuvre, musée et les coordonnées telles que { 
    l'œuvre a pour peintre Johannes Vermeer;                 # chemin principal
    en option {
                l'œuvre est localisée dans un musee           # chemin optionnel
                ce musée a pour localisation les coordonnées   # chemin optionnel
                }
    en langue anglaise (en)                                    # service Wikilabel
} 

Écriture de la requête en SPARQL :

SELECT ?oeuvreLabel ?museeLabel ?coord WHERE
                 {
                   ?oeuvre wdt:P170 wd:Q41264 .
                   OPTIONAL
                    {
                      ?oeuvre wdt:P276 ?musee . 
                      ?musee wdt:P625 ?coord
                    }
                   SERVICE wikibase:label
                    {
                      bd:serviceParam wikibase:language "[AUTO_LANGUAGE], en".
                    }
                  }

Schéma : Image de la requête saisie dans le service de requête de wikidata accessible ici : https://query.wikidata.org/


Assignation de la requête dans R sous forme de chaîne de caractères dans un objet et exécution de la requête :

query_label <- "SELECT ?oeuvreLabel ?museeLabel ?coord WHERE \
                 { \
                   ?oeuvre wdt:P170 wd:Q41264 . \
                   OPTIONAL \
                    { \ 
                      ?oeuvre wdt:P276 ?musee . 
                      ?musee wdt:P625 ?coord \
                    } \
                   SERVICE wikibase:label \
                    { \
                      bd:serviceParam wikibase:language \"[AUTO_LANGUAGE], en \". \
                    } \
                  }"

## Exécution de la requête
data2_WQSR <- query_wikidata(query_label)

Données récupérées :


3.4 Premiers éléments d’analyse exploratoire

3.4.1 Quelques constats sur le graphe et les données

On constate que les données (non supervisées) du graphe Wikidata concernant les lieux d’exposition des œuvres de Vermeer et leurs coordonnées géographiques sont hétérogènes :

  • certaines œuvres semblent n’avoir aucune localisation, l’information n’étant pas disponible dans le graphe Wikidata tel qu’interrogé (voir ci-dessous),
  • d’autres semblent être liées à des lieux correspondant à des données d’une autre nature qu’un musée ou une institution (par exemple, Frick Collection ou Gallery of Honour),
  • enfin, parmi les œuvres localisées, certaines présentent plusieurs localisations de nature différente (par exemple, l’œuvre “A Young Woman Standing at a Virginal”) et, dans certains cas, plusieurs fois le même musée avec éventuellement des coordonnées très légèrement distinctes (par exemple, “The Geographer” au Städel Museum).

Plusieurs hypothèses peuvent être esquissées, outre la question des différentes langues qui peuvent générer des doublons :

  • un même musée peut avoir plusieurs coordonnées géographiques renseignées (plusieurs couples du Point(x,y) très proches, par exemple pour le Städel Museum),

  • la localisation d’une œuvre peut conduire à une entité qui n’est ni un musée ni une institution culturelle mais le nom d’une collection (par exemple The Frick Collection) ou d’une salle d’un musée,

  • une même œuvre peut être située dans plusieurs musées (ou plusieurs fois dans un même musée), peut-être à des périodes différentes.

Ces constats sont liés non seulement au caractère non supervisé et collectif (hétérogène, voire lacunaire) de la production des données, mais aussi à la complexité de la saisie des données dans le graphe Wikidata. En effet, les modalités d’interrogation du graphe Wikidata sont multiples, en fonction notamment de la profondeur du graphe qui est sondée et de la qualité de l’affectation de valeurs à ses instances.

La série de requêtes présentées jusqu’à présent interroge les entités Wikidata renseignées au moyen des valeurs simples du prédicat de localisation, c’est-à-dire avec le préfixe wdt. Pour aller plus en profondeur dans le graphe, vérifier la qualité de l’information de localisation et déterminer sa composante temporelle, il est nécessaire d’entrer plus en détail dans une autre forme d’instanciation du graphe, spécifique à Wikidata, à savoir les valeurs complexes ou déclarations (voir notamment la figure 7).

Figure 7 : Extrait du graphe de Wikidata avec les ensembles de relations entre entités au moyen des propriétés simples (préfixe wdt) et les relations au sein des déclarations au moyen des propriétés directes spécifiques (préfixes p, ps ou pq) utilisées infra.
Source : Wikibase


3.4.2 Le corpus des œuvres de (P170) Johannes Vermeer selon Wikidata

Pour bien comprendre la différence entre l’interrogation “en surface” du graphe et celle “en profondeur”, on sonde deux modalités de la propriété P170 créé par dont le peintre Vermeer est l’objet pour identifier le corpus de ses œuvres.

Valeurs simples ou “quasi-vérités”

Formalisation de la recherche d’une liste ordonnée des œuvres de Vermeer, en langue anglaise, mobilisant le préfixe Wikidata wdt associé aux valeurs simples :

Sélectionner les données œuvre et leur nom telles que { 
   l'œuvre a pour créateur le peintre Johannes Vermeer;  # chemin principal
   en langue anglaise   (en)                              # service Wikilabel
} 
par ordre décroissant       # ordonne        

Écriture de la requête en SPARQL :

SELECT ?oeuvre ?oeuvreLabel 
WHERE
     {
       ?oeuvre wdt:P170 wd:Q41264
       SERVICE wikibase:label
               {
                bd:serviceParam wikibase:language "[AUTO_LANGUAGE], en ".
               }
      }
ORDER BY DESC(?oeuvre)

Schéma : Image de la requête saisie dans le service de requête de wikidata accessible ici : https://query.wikidata.org/


Assignation de la requête dans R sous forme de chaîne de caractères dans un objet et exécution de la requête :

query_valeur_simple <- "SELECT  ?oeuvre ?oeuvreLabel WHERE \
                        { \
                          ?oeuvre wdt:P170 wd:Q41264 \ 
                            SERVICE wikibase:label \
                            { \
                              bd:serviceParam wikibase:language \"[AUTO_LANGUAGE], en \". \
                            } \
                        } \
                        ORDER BY DESC( ?oeuvre )"

## Exécution de la requête
resultats_oeuvres_valeur_simple <- WikidataQueryServiceR::query_wikidata(query_valeur_simple)

Nombre d’œuvres associées avec une valeur simple :

nrow(resultats_oeuvres_valeur_simple)
[1] 37

Valeurs complexes ou déclarations

Formalisation de la recherche d’une liste ordonnée des œuvres de Vermeer, en langue anglaise, mobilisant les préfixes Wikidata p/ps associés aux déclarations (valeurs complexes) :

Sélectionner les données œuvre et leur nom telles que { 
   l'œuvre est liée à une assertion de création au peintre Johannes Vermeer; # chemin principal
   en langue anglaise   (en)                                                  # service Wikilabel
} 
par ordre décroissant       # ordonne     

Écriture de la requête en SPARQL :

SELECT ?oeuvre ?oeuvreLabel 
WHERE
     {
     ?oeuvre p:P170/ps:P170 wd:Q41264  
     SERVICE wikibase:label
             {
              bd:serviceParam wikibase:language "[AUTO_LANGUAGE], en ".
             } 
     } 
ORDER BY DESC(?oeuvre)

Schéma : Image de la requête saisie dans le service de requête de wikidata accessible ici : https://query.wikidata.org/


Assignation de la requête dans R sous forme de chaîne de caractères dans un objet et exécution de la requête :

query_declaration <- "SELECT ?oeuvre ?oeuvreLabel WHERE \
                      { \
                        ?oeuvre p:P170/ps:P170 wd:Q41264  
                            SERVICE wikibase:label \
                            { \
                              bd:serviceParam wikibase:language \"[AUTO_LANGUAGE], en \". \
                            } \ 
                      } \ 
                      ORDER BY DESC( ?oeuvre )"
 
## Exécution de la requête
resultats_oeuvres_exhaustif <- WikidataQueryServiceR::query_wikidata(query_declaration)

Nombre d’œuvres associées avec une assertion exhaustive :

nrow(resultats_oeuvres_exhaustif)
[1] 44

La requête effectuée sur le graphe renvoie 2 résultats différents :

  • le premier cas correspond à la propriété prop/direct/P170 qui associe l’identifiant aux valeurs simples (préfixe wd), c’est-à-dire avec le préfixe wdt: on compte 38 œuvres pour Vermeer (Q41264);
  • le second cas correspond à la propriété prop/statement/P170 (préfixe p) qui associe l’identifiant à une assertion (préfixe wds, soit un ou plusieurs triplets) dont les termes sont acheminés au moyen du préfixe ps : le graphe compte alors 44 œuvres pour Vermeer, soit un écart de 6 œuvres.

En différenciant les modalités d’interrogation associées aux différents types de prédicats d’attribution des œuvres à Vermeer, il est possible de connaître la liste de ces œuvres objets d’une assertion au sein du fragment de graphe Wikidata, qui ne sont pas des valeurs simples, voir figure 7) :

subset(resultats_oeuvres_exhaustif, !oeuvre %in% resultats_oeuvres_valeur_simple$oeuvre)
# A tibble: 7 × 2
  oeuvre                                   oeuvreLabel                          
  <chr>                                    <chr>                                
1 http://www.wikidata.org/entity/Q50987175 Portrait of a Woman                  
2 http://www.wikidata.org/entity/Q3739200  Girl with a Flute                    
3 http://www.wikidata.org/entity/Q28062107 Interior with man and woman at the h…
4 http://www.wikidata.org/entity/Q28060447 Christ and the woman taken in adulte…
5 http://www.wikidata.org/entity/Q20198312 The Geographer                       
6 http://www.wikidata.org/entity/Q20084490 Woman busy sewing in an interior     
7 http://www.wikidata.org/entity/Q17335893 A Man Reading                        

Cette différence de résultat peut conduire à poursuivre l’investigation du corpus tel que modélisé et instancié dans le graphe Wikidata. Par exemple, pour connaître la nature de la relation de ces œuvres au peintre Johannes Vermeer (sont-elles réellement de Vermeer ?), il est possible de sonder le fragment de graphe sur d’autres valeurs, notamment au moyen :

  • de prédicats qualifiant l’attribution de l’œuvre dans le champ d’histoire de l’art (dits qualifiers avec le préfixe pq:) comme par exemple : P1777 à la manière de, P1778 faux imitant, P1778 d'après une œuvre de, P1774 atelier de et P1775 suiveur de Johannes Vermeer,
  • mais aussi d’autres chemins du graphe Wikidata qui permettent de préciser la qualité de l’information non supervisée comme par exemple le rang (wikibase:rank) de l’assertion d’attribution (ps:P170) de l’œuvre à Vermeer.

Ces autres chemins du graphe Wikidata concernant “la main” du peintre, ou plus généralement la qualité des informations collectées, ne sont pas développés ici.

La pertinence de l’usage des prédicats de qualification sera démontrée dans la suite avec l’exemple de la localisation au sein d’une valeur complexe spatio-temporelle de l’œuvre choisie pour notre cas d’étude, mobilisant la propriété P276 de lieu.


3.4.3 Choisir l’œuvre de Vermeer qui a le plus voyagé

La qualité de l’information de localisation est déterminante dans notre démarche. Celle-ci peut avoir plusieurs valeurs dans le graphe Wikidata, comme nous l’avons montré dans le tableau au paragraphe précédent. Elle peut avoir des formes différentes, dont celle d’une assertion, c’est-à-dire une localisation complexe dans l’espace et le temps, selon le modèle de Wikidata.

Pour choisir l’œuvre de Vermeer qui a le plus voyagé, nous allons voir ici que des modalités d’interrogation avec deux prédicats de lieu, c’est-à-dire ceux construits à partir de la propriété P276, donnent des résultats très différents.

“à la surface” du graphe

Formalisation de la recherche d’une liste ordonnée du nombre de musées où se trouve une œuvre de Vermeer, en langue anglaise, mobilisant le préfixe Wikidata wdt associé aux valeurs simples pour les musées :

Sélectionne le nom des données œuvre et compte leur nombre de coordonnées distinctes telles que {
    l'œuvre a pour créateur le peintre Johannes Vermeer;      # chemin principal
                    localisation un musée.                     # chemin principal
    ce musée a pour localisation les coordonnées        # chemin principal (fin)
    en langue anglaise (en)                             # service Wikilabel
} 
pour chaque nom d'œuvre     # groupe
par ordre décroissant        # ordonne

Écriture de la requête en SPARQL :

SELECT ?oeuvreLabel (COUNT(DISTINCT?coord) AS ?count) 
WHERE
  {
   ?oeuvre p:P170/ps:P170 wd:Q41264 ; wdt:P276 ?musee .
   ?musee wdt:P625 ?coord
   SERVICE wikibase:label
        {
         bd:serviceParam wikibase:language "[AUTO_LANGUAGE], en ".
        } 
   }
GROUP BY ?oeuvreLabel
ORDER BY DESC(?count)

Schéma : Image de la requête saisie dans le service de requête de wikidata accessible ici : https://query.wikidata.org/


Assignation de la requête dans R sous forme de chaîne de caractères dans un objet et exécution de la requête :

query <- "SELECT ?oeuvreLabel \
                  (COUNT(DISTINCT?coord) AS ?count) WHERE \
          { \
              ?oeuvre p:P170/ps:P170 wd:Q41264 ; wdt:P276 ?musee . \
              ?musee wdt:P625 ?coord \
                    SERVICE wikibase:label \
                    { \ 
                      bd:serviceParam wikibase:language \"[AUTO_LANGUAGE], en \".\
                    } \ 
          } \
          GROUP BY ?oeuvreLabel \
          ORDER BY DESC(?count)"


# Exécution de la requête
metadonnees_localisation_oeuvres_valeur_simple <- WikidataQueryServiceR::query_wikidata(query)

Données récupérées :

dans la partie “immergée” du graphe

Formalisation de la recherche d’une liste ordonnée du nombre de musées où se trouve une œuvre de Vermeer, en langue anglaise, mobilisant les préfixes Wikidata p/ps associés aux valeurs complexes ou déclarations pour les musées :

Sélectionne le nom des données œuvre et compte leur nombre de coordonnées distinctes telles que { 
    l'œuvre est liée à une assertion de création au peintre Johannes Vermeer;   # chemin principal
                                      de localisation au musée.                  # chemin principal
    ce musée a pour localisation les coordonnées        # chemin principal (fin)
    en langue anglaise (en)                             # service Wikilabel
} 
pour chaque nom d'œuvre     # groupe
par ordre décroissant        # ordonne

Écriture de la requête en SPARQL :

SELECT ?oeuvreLabel (COUNT(DISTINCT?coord) AS ?count) 
WHERE
  {
   ?oeuvre p:P170/ps:P170 wd:Q41264 ; p:P276/ps:P276 ?musee .
   ?musee wdt:P625 ?coord
   SERVICE wikibase:label
        {
         bd:serviceParam wikibase:language "[AUTO_LANGUAGE], en ".
        } 
   }
GROUP BY ?oeuvreLabel
ORDER BY DESC(?count)

Schéma : Image de la requête saisie dans le service de requête de wikidata accessible ici : https://query.wikidata.org/


Assignation de la requête dans R sous forme de chaîne de caractères dans un objet et exécution de la requête :

query <- "SELECT ?oeuvreLabel \
                  (COUNT(DISTINCT?coord) AS ?count) WHERE \
          { \
              ?oeuvre p:P170/ps:P170 wd:Q41264 ; p:P276/ps:P276 ?musee . \
              ?musee wdt:P625 ?coord \
                    SERVICE wikibase:label \
                    { \ 
                      bd:serviceParam wikibase:language \"[AUTO_LANGUAGE], en \". \
                    } \ 
          } \
          GROUP BY ?oeuvreLabel \
          ORDER BY DESC(?count)"


# Exécution de la requête
metadonnees_localisation_oeuvres <- WikidataQueryServiceR::query_wikidata(query)

Données récupérées :

On le comprend ici, dans le cas d’une requête limitée aux valeurs simples, il n’est pas possible d’identifier les localisations réelles successives des œuvres. Les valeurs associées sont d’une autre nature.

Par contre, en mobilisant l’information de localisation complexe “réelle”, c’est-à-dire fondée sur des chemins adaptés du graphe, l’œuvre intitulée “Dame assise au virginal” (entité Q4660880) est, selon Wikidata, l’œuvre de Johannes Vermeer qui a le plus voyagé pour être exposée. Cela signifie que cette instance de la classe “œuvres” possède le plus grand nombre de valeurs associées au prédicat “a pour lieu” p:P276/ps:P276 dans les déclarations exhaustives de localisation désignant des musées ou institutions. Leurs coordonnées sont des valeurs simples données par le prédicat wdt:P625.

Ce constat ouvre une nouvelle perspective en matière d’analyse exploratoire. Nous allons donc nous intéresser à la trajectoire spatio-temporelle de cette œuvre.


3.5 Troisième requête SPARQL : déclaration spatiale et temporelle

Comme illustré dans la figure 8, la localisation spatio-temporelle d’une entité est déclarée au moyen d’un prédicat direct (p:P276), qui permet l’accès à une forme complexe de localisation de l’œuvre choisie :

  • dont les valeurs du prédicat ps:P276 sont des lieux (géographiques et institutionnels) caractérisés par l’ensemble des déclarations de localisations spatiales point(x,y), valeurs du prédicat wdt:P625 ;
  • dont les valeurs des prédicats de type qualifiers de la déclaration ?lieu donnent des périodes temporelles (date de début : pq:P580, date de fin : pq:P582) ou date/point dans le temps de l’évènement associé pq:P585.

Figure 8 : Classes et propriétés spécifiques de Wikidata mobilisées pour la localisation spatio-temporelle dans le cas d’une déclaration (statement).


3.5.1 Construction des requêtes

3.5.1.1 La circulation spatio-temporelle de l’œuvre

Pour connaître les modalités de circulation de l’œuvre dans divers musées et institutions, la requête SPARQL ci-dessous collecte les déclarations relatives aux lieux d’exposition (P276) et la période pendant laquelle l’œuvre (Q4660880) semble y avoir été présente. .

Formalisation de la recherche d’une liste des musées et d’intervalles de temps associés où se trouvent l’œuvre choisie de Vermeer, en langue anglaise, mobilisant le préfixe de propriété directe Wikidata p associé à la localisation P276 de l’œuvre dans le temps :

Sélectionne le nom des données musée, dates et coordonnées telles que { 
   l'œuvre choisie est localisée directement au lieu.                    # chemin principal
   ce lieu est lié dans une assertion de localisation à un musée;         # chemin principal 
           est lié dans une assertion de temporalité à une date de début; # chemin principal
           est lié dans une assertion de temporalité à une date de fin.   # chemin principal 
   ce musée a pour localisation les coordonnées .                         # chemin principal 
   en langue anglaise   (en)           # service Wikilabel
  } 

Écriture de la requête en SPARQL :

SELECT ?museeLabel ?dated ?datef ?coord 
WHERE  
    {
      wd:Q4660880 p:P276 ?lieu .
      ?lieu ps:P276 ?musee ; 
            pq:P580 ?dated ;
            pq:P582 ?datef .
      ?musee wdt:P625 ?coord .
      SERVICE wikibase:label
            {
             bd:serviceParam wikibase:language "[AUTO_LANGUAGE], en ".
            }
    }

Schéma : Image de la requête saisie dans le service de requête de wikidata accessible ici : https://query.wikidata.org/


Assignation de la requête dans R sous forme de chaîne de caractères dans un objet et exécution de la requête :

query <- "SELECT ?museeLabel ?dated ?datef ?coord WHERE \
          { \
            wd:Q4660880 p:P276 ?lieu . \
            ?lieu ps:P276 ?musee ; 
                  pq:P580 ?dated ;
                  pq:P582 ?datef . \
            ?musee wdt:P625 ?coord . \
                  SERVICE wikibase:label \
                  { \
                    bd:serviceParam wikibase:language \"[AUTO_LANGUAGE], en \". \
                  }  \
          }"


## Exécution de la requête
data3_WQSR <- WikidataQueryServiceR::query_wikidata(query)

Données récupérées :

Enregistrement et (ré)import des données :

# Enregistrement des données en format csv
write.csv(x = data3_WQSR, file = "data/data3_WQSR.csv", row.names = FALSE)
# Import du fichier de données enregistrées
data3_WQSR <- read.csv("data/data3_WQSR.csv", row.names = NULL)

3.5.1.2 L’illustration de l’œuvre

La requête ci-dessous permet d’obtenir l’illustration (figure 9) de l’œuvre ciblée (P18).

Formalisation de la recherche d’une illustration de l’œuvre choisie de Vermeer :

Sélectionner la donnée image telle que { 
    l'œuvre choisie a pour image une représentation numérique .   # chemin principal
} 

Écriture de la requête en SPARQL :

SELECT ?image 
WHERE
     {
      wd:Q4660880 wdt:P18 ?image
     }

Schéma : Image de la requête saisie dans le service de requête de wikidata accessible ici : https://query.wikidata.org/


Assignation de la requête dans R sous forme de chaîne de caractères dans un objet et exécution de la requête :

query_image <- "SELECT ?image WHERE \
                { \
                  wd:Q4660880 wdt:P18 ?image \
                }"


## Exécution de la requête
image_oeuvre <- WikidataQueryServiceR::query_wikidata(query_image)

Enregistrement de l’image de l’œuvre :

download.file(url = image_oeuvre[[1]],
              destfile = 'data/images/Q4660880.jpg',
              mode = 'wb')

Figure 9 : Illustration de l’œuvre “A Young Woman Seated at the Virginals” de Johannes Vermeer, 1670.



4 Exploration spatiale

Les données non supervisées collectées nécessitent toujours d’être contrôlées et nettoyées avant d’être exploitées. De plus, les données obtenues comportent des coordonnées géographiques qui permettent de les convertir en véritable couche géographique afin de les cartographier et ainsi d’exploiter leur dimension spatiale.

4.1 Les œuvres de Johannes Vermeer

Les données issues de la seconde requête SPARQL (data2_WQSR) listent l’ensemble des œuvres de Vermeer et leurs localisations respectives (nom du musée et coordonnées géographiques quand elles existent) selon Wikidata. Avant de les cartographier, quelques traitements sont nécessaires :

  1. Suppression des doublons et des œuvres sans aucune localisation renseignée ;
  2. Calcul du nombre d’œuvres par musée (localisation) ;
  3. Géoréférencement14 des musées abritant des œuvres de Vermeer.

4.1.1 Nettoyage des données

Dans cette partie, nous allons uniquement nous intéresser à la dimension spatiale des données collectées, sans prendre en compte la dimension temporelle. Si aucune coordonnée géographique n’est renseignée (cf. partie 3.3), nous ne prenons pas en compte le musée recensé. En revanche, nous considérons l’ensemble des localisations comportant des coordonnées géographiques, peu importe la temporalité qui leur est associée.

Commençons par supprimer les localisations (musée ou institution) qui ne sont pas associées à des coordonnées géographiques dans Wikidata :

data2_WQSR <- data2_WQSR[!is.na(data2_WQSR$coord), ]

Nous pouvons ensuite supprimer les doublons, que l’on peut expliquer par le fait qu’une œuvre ait pu être exposée à plusieurs reprises dans un même musée, ou qu’un même lieu ait pu être renseigné par plusieurs couples de coordonnées géographiques dans Wikidata.

Pour cela, nous utilisons la fonction duplicated, appliquée au couple “nom de l’œuvre + lieu d’exposition”

data2_WQSR <- data2_WQSR[!duplicated(data2_WQSR[, c("oeuvreLabel", "museeLabel")]), ]

Affichage des données filtrées :


4.1.2 Regroupement par musée

Plusieurs œuvres semblent avoir été exposées dans les mêmes lieux. Afin de cartographier les musées ayant exposé différentes œuvres de Johannes Vermeer, nous réalisons un regroupement des œuvres par intitulé des musées (musee), tout en calculant le nombre d’œuvres que chacune de ces institutions a exposées au cours du temps. Pour cette opération, nous utilisons l’opérateur pipe (|>) qui permet d’enchaîner plusieurs fonctions de manière lisible.

library(dplyr)

nb_oeuvres_musee <- data2_WQSR |>
                      group_by(musees = museeLabel, coords = coord) |> 
                      summarise(nb_oeuvres = n())

Histogramme de répartition des musées en fonction du nombre d’œuvres de Vermeer exposées :

library(ggplot2)

ggplot(nb_oeuvres_musee, aes(x = nb_oeuvres)) +
    geom_histogram(binwidth=1, color="white")  + 
    scale_y_continuous(n.breaks = 8) +
    xlab("Nombre d'œuvres exposées") +
    ylab("Nombre de musées")
Graphique 1 : Distribution du nombre d’œuvres de Johannes Vermeer exposées par musée.

4.1.3 Géoréférencement

La variable ‘coords’ contient les coordonnées géographiques des musées dans le format WKT15. En utilisant le package sf, il est simple de construire des données géographiques vectorielles. Pour cela, nous utilisons les fonctions st_as_sfc et st_as_sf.

library(sf)

# Création d'objets géographiques ponctuels à partir des coordonnées stockées en WKT
geometry <- st_as_sfc(nb_oeuvres_musee$coords, crs = 4326)

# Création d'une couche géographique vectorielle (attributs des musées + géométries)
musee_geo  <- st_as_sf(nb_oeuvres_musee, geometry)

La table de données a été transformée en couche géographique manipulable avec R (objet sf), où chaque musée comporte une géométrie (point localisé dans l’espace, dans le système géographique de référence WGS84).

Nous pouvons désormais cartographier les points créés (musées) sur une carte interactive, en utilisant le package mapview. Cela permet, entre autres, de vérifier la qualité des données et du géoréférencement effectué.

library(mapview)

# Affichage interactif des musées, sur un fond de carte OpenStreetMap
mapview(musee_geo) 
Carte 1 : Les derniers lieux d’exposition des œuvres de Johannes Vermeer.


4.1.4 Cartographie thématique

À partir des données collectées et pré-traitées, il est possible de construire une carte interactive en symboles proportionnels représentant le nombre d’œuvres de Johannes Vermeer exposées par musée au cours du temps.

library(tmap)

# Activation du mode de cartographie interactive
tmap_mode(mode = "view")

# Carte en symboles proportionnels
tm_basemap() +
tm_shape(musee_geo) +
tm_symbols(size="nb_oeuvres",
           scale = 3,
           col="red3",
           border.col="white",
           alpha =0.5,
           border.lwd=0.1,
           border.alpha=0.5,
           id = "musees",
           popup.vars=c("Nombre d'œuvres :"="nb_oeuvres" )) 
Carte 2 : Nombre d’œuvres de Johannes Vermeer exposées au cours du temps, par musée.


4.1.5 Enrichissement des données

Au vue de la carte précédente, il semble intéressant d’explorer la répartition des œuvres de Johannes Vermeer à l’échelle des pays. Pour cela, il est nécessaire d’enrichir les données.

Nous commençons par télécharger un fond de carte pays mis à disposition par le package rnaturalearth :

library(rnaturalearth)

# Téléchargement et enregistrement d'un fond de carte "pays"
monde <- ne_download(scale = "medium",
                     type = "countries",
                     category = "cultural",
                     destdir = "data/world",
                     load = TRUE,
                     returnclass = "sf")

Le fond de carte récupéré est également mis à disposition dans les données téléchargeables. Vous pouvez le charger dans R à l’aide du package sf et de sa fonction st_read() de la façon suivante :

monde <- sf::st_read("data/world/ne_50m_admin_0_countries.shp", quiet = TRUE ) 

Nous pouvons utiliser la fonction plot() associée à la fonction st_geometry() de sf pour afficher les données dans le fenêtre graphique :

plot(st_geometry(monde))

Les attributs des entités (pays) de la couche géographique récupérée sont les suivants :

La couche géographique des musées (‘musee_geo’) et le fond de carte du monde (‘monde’) sont géoréférencés dans le même système de coordonnées16 (WGS84). Nous pouvons alors réaliser une jointure spatiale17 qui permet de récupérer pour chaque musée le code ISO3 du pays dans lequel il est situé. Pour cela, nous utilisons la fonction st_intersection du package sf.

musee_geo <- st_intersection(musee_geo, monde[, "ADM0_A3"])

Cette opération permet d’ajouter le code ISO3 du pays de localisation (“ADM0_A3”) à la couche géographique des musées :


4.1.6 Répartition par pays

Nous pouvons réaliser une représentation graphique de la distribution spatiale des musées. Pour cela, nous calculons le nombre total d’œuvres exposées par pays :

nb_oeuvres_pays <- musee_geo |> 
                      group_by(ADM0_A3) |> 
                      summarise(nb_oeuvres=sum(nb_oeuvres))

Nous pouvons ensuite construire le graphique :

# Graphique en barre - Nombre d'œuvres par pays
ggplot(data = nb_oeuvres_pays, 
       aes(x = reorder(ADM0_A3, -nb_oeuvres), y = nb_oeuvres, fill = ADM0_A3)) +
  geom_bar(stat = "identity") +
  scale_y_continuous(n.breaks=8) +
  ggtitle("Nombre d'œuvres de Johannes Vermeer exposées, par pays") +
  xlab("") +
  ylab("") +
  scale_fill_manual(values = c("#FC8D62", "#80B1D3"  ,"#E78AC3",
                               "#A6D854","#FFD92F","#E5C494",
                               "#FB8072","#BEBADA","#66C2A5",
                               "#FFFFB3","#8DA0CB")) +
  annotate(geom="text", 
           x = 6, 
           y = 9, 
           label = "*Une œuvre peut avoir été\n exposée dans plusieurs pays" ) +
  theme(legend.position = "none")
Graphique 2 : Représentation histographique du nombre de peintures de Johannes Vermeer exposées dans différents pays au cours du temps.


4.2 La “Dame assise au virginal”

Les données issues de la troisième requête SPARQL (“data3_WQSR”) contiennent l’ensemble des localisations renseignées pour l’œuvre de Johannes Vermeer “A Young Woman Seated at the Virginals” (ou “Dame assise au virginal” en français). Nous allons donc réaliser un processus de nettoyage et de géoréférencement très semblable à celui de la partie précédente.

4.2.1 Suppression des doublons

data <- data3_WQSR[!duplicated(data3_WQSR$dated), ]


4.2.2 Géoréférencement

Géoréférencement des musées à partir de la variable “coord” :

# Création d'objets géographiques ponctuels à partir des coordonnées stockées en WKT
geometry <- st_as_sfc(data$coord, crs = 4326)

# Création d'une couche géographique vectorielle (attributs des musées + géométries)
data_geo  <- st_as_sf(data, geometry)

Table de la couche géographique créée :

Des musées, comme le Ashmolean Museum, apparaissent plusieurs fois dans la table car l’œuvre y a fait plusieurs séjours. Nous effectuons un regroupement des expositions par musée.

# Regroupement par musée - Calcul du nombre total d'expositions
nb_expos_musee_geo <- data_geo |>
                        group_by(museeLabel) |>
                        summarise(nb_expos=n())

Il est facile d’afficher ces données géographiques sur un fond de carte dynamique, en améliorant cette fois-ci la mise en page des pop-ups contenant les attributs de chaque musée.

# Création du pop-up
content <- paste0( "<img  src='",
                   image_oeuvre[[1]],
                   "' width='180'><br /><b>",  
                   nb_expos_musee_geo$musee,
                   "</b><br />Nombre d'expositions de l'œuvre : <b>",
                   nb_expos_musee_geo$nb_expos,
                   "</b>")

# Affichage de la carte
mapview(nb_expos_musee_geo,
        zcol = "museeLabel",
        col.regions = "red",
        legend = FALSE,
        popup = content,
        map.types = "Esri.WorldImagery")
Carte 3 : Lieux d’exposition de l’œuvre “A Young Woman Seated at the Virginals” au cours du temps.


4.2.3 Enrichissement des données

De la même manière que dans la partie 4.1.5, nous enrichissons ces données en obtenant le pays de localisation de chaque musée. Pour cela, nous réalisons une jointure spatiale en utilisant la fonction st_intersection du packagesf.

# Jointure spatiale points/pays
data_geo <-st_intersection(data_geo, monde[,"ADM0_A3"])

On vérifie que le code ISO3 du pays a bien été collecté pour chaque musée :


5 Trajectoire spatio-temporelle

Nous allons maintenant prendre en compte la dimension temporelle des données collectées, c’est-à-dire la période d’exposition du tableau “A Young Woman Seated at the Virginals” dans chaque musée, comme renseigné dans Wikidata.

5.1 Période d’exposition du tableau

Pour manipuler facilement le temps, nous commençons par convertir les dates d’arrivée et de départ de l’œuvre dans chaque musée en format de type date.

data_geo$datef <- as.Date(data_geo$datef)
data_geo$dated <- as.Date(data_geo$dated)

Il est ensuite simple de calculer le nombre de jours de présence dans un musée :

data_geo$duree <- as.integer(data_geo$datef  - data_geo$dated)

Le tableau ayant été exposé à plusieurs reprises dans certains musées, nous calculons le nombre de jours total d’exposition par musée.

data_musee <- data_geo |>
                group_by(museeLabel, ADM0_A3) |> 
                summarise(duree = sum(duree), nb_expos = n())

Plusieurs informations collectées peuvent être cartographiées. Voici un exemple de carte interactive réalisée avec tmap, qui représente le nombre de jours d’exposition du tableau dans les différents musées.

# Activation du mode de cartographie interactive
tmap_mode(mode = "view")

# Construction d'une carte en symbole proportionnel
tm_basemap() +

tm_shape(data_musee) +
tm_symbols(size ="duree",
           col = "ADM0_A3",
           scale = 4,
           border.col="white",
           alpha = 0.7,
           lwd=0.1,
           border.alpha=0.5,
           title.col="Pays d'exposition",
           id = "museeLabel",
           popup.vars=c("Nombre total de jours :"="duree", 
                        "Nombre total de séjours :"="nb_expos")) 
Carte 4 : Nombre total de jours d’exposition de l’œuvre “A Young Woman Seated at the Virginals”.


5.2 Carte temporelle animée

La carte précédente ne permet pas de rendre compte de la trajectoire spatio-temporelle de l’œuvre. Une carte animée représentant la localisation de l’œuvre au cours du temps permettrait de formaliser son déplacement dans l’espace et dans le temps.

Pour cela, nous devons dans un premier temps choisir un pas de temps. La période de temps analysée est de presque 20 ans et le tableau peut avoir été exposé dans deux musées différents au cours d’un même mois. Nous choisissons donc de construire une carte animée réglée sur un pas de temps hebdomadaire, ce qui laissera le temps aux lecteur·rice·s de lire les informations affichées.

Un partir de ce pas de temps, nous créons un data.frame où chaque ligne représente une semaine calendaire située entre le 8 mars 2001 et le 13 janvier 2019 à l’aide de la fonction seq(). Nous créons également des colonnes vides qui permettront de conserver l’ensemble des informations de localisation de l’œuvre pour chaque semaine.

data_semaine <- data.frame(semaine = seq(min(data_geo$dated), max(data_geo$datef), "week"),
                           museeLabel = as.character(NA),
                           duree = as.integer(NA),
                           pays = as.character(NA),
                           geometry = NA)

Une boucle for permet de parcourir le tableau et d’obtenir les informations de localisation de l’œuvre si la date du premier jour d’une semaine ciblée data_semaine$week[i] est située entre une date d’arrivée et de départ dans le tableau data_geo. Si c’est le cas, on inscrit les informations du tableau data_geodans le tableau data_semaine.

for (i in 1:nrow(data_semaine)){

# Sélection des lignes où : date d'arrivée <= week[i] <= Date de départ
temp <-   data_geo[data_geo$dated <= data_semaine$semaine[i] & data_geo$datef >= data_semaine$semaine[i], c("museeLabel", "duree", "ADM0_A3", "geometry")]

# Si une ligne est sélectionnée, on l'ajoute dans l'objet 'data_semaine'
if (nrow(temp)==1){data_semaine[i,2:5] <- temp}

}

Nous modifions ensuite les valeurs restées manquantes, pour les semaines où la peinture n’a pas été exposée.

data_semaine <- data_semaine |>  
                    mutate(
                      # si musée non renseigné, remplace par "Emplacement inconnu"
                      museeLabel=case_when(is.na(museeLabel)~"Emplacement inconnu", TRUE~museeLabel),
                      # si pays non renseigné, remplace par "pays ?"
                      pays=case_when(is.na(pays)~"pays ?", TRUE~pays),
                      # si durée non renseignée, remplace par 0
                      duree=case_when(is.na(duree)~0, TRUE~duree)
                      ) 

Affichage du data.frame data_semaine :

Les coordonnées contenues dans la colonne geometry nous permettent de convertir ce data.frame en objet sf (couche géographique).

data_semaine <-st_as_sf(data_semaine)

Les données sont prêtes pour construire une carte animée qui représente la localisation de l’œuvre pour chaque semaine calendaire de 2001 à 2019. Pour cela, nous utilisons le package tmap, son mode plot (cartographique statique), sa fonction tm_facet (génère plusieurs cartes en fonction d’une variable) et sa fonction tmap_animation pour créer une carte animée en format vidéo.

# Cartographie en mode statique  
tmap_mode(mode = "plot")

# Création d'une carte stockée dans l'objet CARTE
CARTE  <- tm_shape(monde) +                      # Ajout fond de carte monde
          tm_polygons(col = "grey70", 
                  border.col = "grey60", 
                  border.lwd = 0.2) +
          
          tm_shape(data_semaine) +               # Ajout des musées, mais...
          tm_symbols(col = "red") +              
  
          tm_facets(along = "semaine",           # Une carte / semaine grâce à tm_facet
                    free.coords= FALSE, 
                    drop.units=FALSE)  +
      
          tm_layout(main.title ="",              # Gestion du titre
                    panel.label.fontface = 2,
                    panel.labels = paste0("Semaine du ", format(x = data_semaine$semaine, format = "%d %b %Y" )),
                    bg.color="lightblue") +
    
          tm_credits(bg.color = 'red',           # Affichage Nom des musées et Nombre de jours d'exposition
                     width = 0.5,
                     position = c('center', 'bottom'),
                     text = paste0(data_semaine$musees," (",data_semaine$pays,")\n",data_semaine$duree, " jours d'exposition"),
                     size = 1.2,
                     fontface = "bold",
                     col = 'white',
                     align = 'center')

Avec la fonction tm_facet, ce bout de code crée autant de cartes qu’il y a de lignes dans le tableau data_semaine.

Il est ensuite très facile de convertir cet objet list qui contient l’ensemble des cartes produites en fichier mp4 avec la fonction tmap_animation.

# Installation du package av
install.packages("av")

# Création du GIF
tmap_animation(tm = CARTE, 
               filename = "figures/peinture_en_voyage.mp4", 
               width=800, 
               height = 400, 
               fps = 15,                 
               outer.margins = 0)

Voilà le résultat !

Carte 5 : Carte animée de circulation de l’œuvre de Johannes Vermeer “A Young Woman Seated at the Virginals” au sein de divers lieux d’exposition entre 2001 et 2019.

6 Frise chronologique

Bien que la carte animée soit une représentation techniquement aboutie, elle ne transmet pas efficacement les informations sur la trajectoire spatio-temporelle du tableau de Johannes Vermeer au monde des musées. Une représentation statique et axée sur la dimension temporelle, comme une frise chronologique, nous semblerait plus appropriée.

Il existe des packages spécialisés dans la construction de frise chronologique, comme par exemple vistime. Cependant, afin de s’assurer d’une certaine liberté pour la mise en forme de la frise, nous utilisons le package ggplot2 pour concevoir et construire cette représentation graphique.

6.1 Préparation des données

Une mise en forme des données est nécessaire pour construire ce type de frise chronologique avec ggplot2. Par exemple, le tri des données est important pour gérer l’ordre d’apparition des individus et des modalités sur le graphique.

Tri du tableau en fonction de la date (“dated”) d’arrivée dans chaque musée.

data_geo <- data_geo[order(data_geo$dated, decreasing = FALSE), ] 

Tri d’ordre d’apparition des modalités (levels) pour les variables “nomLabel” (= “musee”) et “ADM0_A3” (= “pays”) que l’on transforme en factor.

# Tri des "levels" des musées
data_geo$museeLabel <- ordered(as.factor(data_geo$museeLabel), levels = unique(data_geo$museeLabel))

# Tri des "levels" des pays
data_geo$pays <- ordered(as.factor(data_geo$ADM0_A3), levels = unique(data_geo$ADM0_A3))

Nous créons une nouvelle colonne qui sera utilisée comme étiquette dans le graphique. Dans cette colonne, les noms des musées n’apparaissent qu’une fois, uniquement pour la première exposition.

# Sélection des premières dates d'arrivée (s'il en existe plusieurs) pour chaque musée
fisrt_expo <- data_geo[!duplicated(data_geo$museeLabel), c("museeLabel", "dated")]

# Suppression de la colonne de géométrie 
fisrt_expo <- st_drop_geometry(fisrt_expo)

# Jointure par la date d'arrivée - ajout de la colonne label (nomLabel.y)
data_geo <- merge(data_geo, fisrt_expo, by="dated", all.x=TRUE)

Extrait du tableau de données après traitement :


6.2 Construction graphique

6.2.1 Frise chronologique avec geom_segement()

Les variables utilisées pour les axes des abscisses (x) et des ordonnées (y) sont définies comme suit dans la fonction ggplot :

  • x = date d’arrivée dans le musée (“dated”);
  • y = nom du musée (“museeLabel.x”);
ggplot(data_geo, aes(x = dated, y = museeLabel.x))

La bibliothèque ggplot2 fonctionne avec une syntaxe particulière. Il est possible d’ajouter des éléments de mise en forme du graphique au fur et à mesure.

Nous commençons par préciser le type de géométrie (ici geom_segment) et les variables à représenter :

  • color = pays de localisation (“ADM0_A3”);
  • xend = date de fin (“datef”), limite du segment en x ;
  • yend = nom du musée (“nomLabel.x”), limite du segment en y.
frise <- ggplot(data_geo, aes(x = dated, y = museeLabel.x, color = pays)) +
                    geom_segment(aes(xend = datef, yend = museeLabel.x, color =  pays), size = 6)

# Affichage du graphique
frise

6.2.2 Couleurs, étiquettes et thème

Maintenant que la base du graphique a été réalisée, nous pouvons procéder à l’amélioration de sa mise en forme en plusieurs étapes :

  1. ajout des labels avec la fonction geom_text ;
  2. modification de la palette de couleurs avec la fonction scale_color_manual.
frise <-  frise +
          # Ajout d'une étiquette pour chaque segment représenté
          geom_text(aes(label = museeLabel.y, hjust =1.05), size = 3.5, show.legend = FALSE) +
          # Modification de la palette de couleurs (ADM0_A3)
          scale_color_manual(values = c("#7570b3", "#e7298a", "#66a61e", "#e6ab02", "#a6761d","#1b9e77", "#d95f02"))

# Affichage du graphique
frise

Puis, à l’aide des fonctions scale_x_date labs et theme :

  1. modification de l’axe des abscisses (intervalle des valeurs et étiquettes à afficher) ;
  2. ajout d’un titre et d’un sous-titre ;
  3. paramétrage de plusieurs éléments du “thème” (repère, légende, axes, couleur de fond…).
frise <- frise +
  
          # Modification de l'axe des abscisses
          scale_x_date(date_labels = "%Y", date_breaks = "2 year", minor_breaks = "1 year",
                           limits = c(as.Date("1994-01-01"),as.Date("2019-01-13")) ) +
  
          # Ajout d'un titre et d'un sous-titre
          labs(title = "Le voyage d'un tableau de Johannes Vermeer",
               subtitle = "Aux pays des musées, de 2001 à 2019") +
  
          # Paramétrage du "thème"
          theme(panel.grid.major.y = element_blank(),
                panel.grid.major.x = element_line(size = 0.2, colour = "#707073"),
                panel.grid.minor.x = element_line(size = 0.2, linetype = 3, colour = "#707073"),
                panel.border = element_blank(),
                panel.background = element_blank(),
                axis.text.y = element_blank(),
                axis.text.x = element_text(size=8.5, colour = "#FFFFFF"),
                axis.title = element_blank(),
                rect = element_rect(fill = "#2a2a2b"),
                legend.position =  c(.93, .25),
                legend.key = element_rect(fill  = "#2a2a2b"),
                legend.key.height = unit(0.4, 'cm'),
                legend.background = element_rect(fill  = "#2a2a2b"),
                legend.margin = margin(0.5,1,1,1),
                legend.title = element_blank(),
                legend.text = element_text(colour = "#FFFFFF",  size = 7),
                title = element_text(colour = "#FFFFFF", hjust = 1, vjust = 0),
                plot.margin=unit(c(1,1,0.5,1),"cm"))

# Affichage du graphique
frise


6.2.3 Finalisation de la mise en page

Pour terminer la mise en forme de cette frise chronologique, l’illustration du tableau et son intitulé sont superposés au graphique. Les bibliothèques jpeg et patchwork nous permettent d’importer, puis d’insérer une image sur la représentation graphique.

library(jpeg)

img <- readJPEG("data/images/Q4660880.jpg", native = TRUE)

Superposition de l’image sur la représentation graphique :

library(patchwork)

        # Titre de l'image
frise + annotate("text", 
                 x = as.Date("1997-03-01"), 
                 y = 7, 
                 colour = "#FFFFFF", 
                 size = 3.4,
                 label = "Young Woman Seated\nat a Virginal  (1670)") +
  
         # Insertion de l'image
         inset_element(p = img, 
                       clip = TRUE, 
                       left = 0.04, 
                       right = 0.27, 
                       top = 0.95, 
                       bottom = 0.46)

Graphique 3 : Trajectoire spatio-temporelle du tableau “A Young Woman Seated at the Virginals” au pays des musées, entre 2001 et 2019.

7 À vous d’explorer !

Nous vous proposons d’explorer vous-mêmes le contenu des données Wikidata. Le bout de code ci-dessous peut être adapté à n’importe quel·le artiste peintre renseigné·e dans Wikidata. Il suffit de modifier l’identifiant de l’artiste assigné·e dans l’objet ID et son nom dans l’objet NOM.

7.1 Code reproductible

Copiez-collez les lignes de code suivantes dans une session Rstudio. Indiquez l’identifiant Wikidata de l’artiste peintre de votre choix ainsi que son nom en début de programme, puis exécutez !

Voici quelques exemples d’artistes peintres que vous pouvez requêter :

#-------------------------------------------------------------------------------------------------#
#                                                                                                 #
#                                   Exploration spatio-temporelle                                 #
#                                 de l'exposition des œuvres de Pablo Picasso                               #
#                                         Selon Wikidata                                        #
#                                                                                                 #
#-------------------------------------------------------------------------------------------------#    

#--------------------------------------- PACKAGES NECESSAIRES ------------------------------------#

# install.packages("WikidataQueryServiceR")
# install.packages("sf")
# install.packages("rnaturalearth")
# install.packages("ggplot2")
# install.packages("tmap")


######################################### CHOIX DE L'ARTISTE ######################################


ID <- "Q5593"
NOM <- "Pablo Picasso"


#---------------------------------------------- REQUETE ------------------------------------------#

library(WikidataQueryServiceR)

# Construction de la requête SPARQL avec l'identifiant (ID) indiqué
entite_peintre <- paste0("wd:",ID)
 
 query <-  "SELECT ?oeuvreLabel ?museeLabel ?coord WHERE \
{\
  ?oeuvre wdt:P170",entite_peintre," . \
    OPTIONAL \
      {\ 
        ?oeuvre wdt:P276 ?musee . \
        ?musee wdt:P625 ?coord \
      }\
    SERVICE wikibase:label \
    {\
    bd:serviceParam wikibase:language \"[AUTO_LANGUAGE], fr,en \".\
    }\
}"

# Requête SPARQL
my_data <- query_wikidata(query)


#----------------------------------------- NETTOYAGE DES DONNEES -------------------------------------#

# Suppression des doublons
my_data <- my_data[!duplicated(my_data$oeuvreLabel), ]

# Suppression des entités (musées et institutions) sans coordonnées renseignées
my_data <- my_data[!is.na(my_data$coord), ]


#-------------------------------------- REGROUPEMENT PAR MUSEE -----------------------------------#

nb_oeuvre <- aggregate(oeuvreLabel ~ coord + museeLabel, data = my_data, FUN = length)
colnames(nb_oeuvre)[3] <- "nb_oeuvre"


#----------------------------------------- GEOREFERENCEMENT --------------------------------------#

library(sf)

# Création d'objets géographiques ponctuels à partir des coordonnées stockées en WKT
geometry <- st_as_sfc(nb_oeuvre$coord, crs = 4326)

# Création d'une couche géographique vectorielle (attributs des musées + géométries)
nb_oeuvre_by_museum <- st_as_sf(nb_oeuvre, geometry)



#------------------------------- ENRICHISSEMENT - JOINTURE SPATIALE -----------------------------#

library(rnaturalearth)
 
# Import de la couche géographique des pays
monde <- ne_download(scale = "medium",
                     type = "countries",
                     category = "cultural",
                     destdir = "data/world",
                     load = TRUE,
                     returnclass = "sf")



# Jointure spatiale
nb_oeuvre_by_museum <-st_intersection(nb_oeuvre_by_museum , monde[,"ADM0_A3"])


#---------------------------------- GRAPHIQUE NOMBRE ŒUVRES PAR PAYS ----------------------------#

# Regroupement par pays 
by_country <- aggregate(nb_oeuvre ~ ADM0_A3 , data = nb_oeuvre_by_museum, FUN = sum)


# Graphique 
library(ggplot2)

 ggplot(data = by_country, aes(x = ADM0_A3, y = nb_oeuvre) )  +
  geom_bar(stat="identity") +
  ggtitle(paste0("Nombre d'œuvres de ", NOM ,", par pays")) +
  xlab("") +
  ylab("") +
  theme(legend.position = "none",
        axis.text.x = element_text(size=8),
        axis.text.y = element_text(size=11))


#----------------------------- CARTOGRAPHIE - NOMBRE ŒUVRES PAR MUSEE ---------------------------#

 library(tmap)

 tmap_mode(mode = "view")
 tm_shape(nb_oeuvre_by_museum) +
 tm_symbols(size="nb_oeuvre",
           scale = 2,
           col="red3",
           border.col="white",
           alpha =0.5,
           border.lwd=0.1,
           border.alpha=0.5,
           title.size = "Nb d'œuvres",
           id = "museeLabel",
           popup.vars=c("Nombre d'œuvres"="nb_oeuvre"))

7.2 Données et graphiques produits

Voici un exemple des données et graphiques produits avec l’artiste peintre et graveur norvégien Edvard Munch, ayant pour identifiant Wikidata : Q41406.

ID <- "Q41406"
NOM <- "Edvard Munch"

Dans un premier temps, le code permet de collecter l’ensemble des œuvres créées par l’artiste, ainsi que leurs localisations associées via une requête SPARQL :


Les données collectées font ensuite l’objet de deux représentations graphiques :

*Graphique 4 : Nombre d’œuvres d’Edvard Munch exposé par pays, selon la base de données Wikidata (2024).


Enfin, le code construit une carte interactive représentant le nombre d’œuvres exposées par musée :

Carte 6 : Nombre d’œuvres d’Edvard Munch exposé par musée au cours du temps.

8 Conclusion - Enjeux interdisciplinaires

L’exemple de visualisations (distant reading) d’une trajectoire spatio-temporelle en histoire à partir de données collectées sur Wikidata propose ainsi de questionner les données utilisées (non supervisées).

Notamment la circulation de l’œuvre choisie fait apparaître des espaces spatio-temporels où celle-ci n’est pas localisée dans un lieu d’exposition. Ce constat engage à ré-interroger les données et le modèle associé.

Par exemple, l’étude de la relation de la donnée Q4660880 avec la “Leiden Collection” conduit à identifier 2 relations différentes, précisées par la requête ci-dessous : P276 et P195, cette dernière correspondant à “collection”. L’instance “Leiden Collection” se trouve donc au sein de deux classes de Wikidata, le lieu et la collection.

query <- "SELECT DISTINCT ?p WHERE { \
          wd:Q4660880 ?p ?o . \
          ?o rdfs:label ?olabel . \
          FILTER regex(str(?olabel), \"Leiden\") .
}"


WikidataQueryServiceR::query_wikidata(query)      
# A tibble: 2 × 1
  p                                       
  <chr>                                   
1 http://www.wikidata.org/prop/direct/P276
2 http://www.wikidata.org/prop/direct/P195

En interrogeant la provenance (?url) de l’information sur la “Leiden Collection”, c’est-à-dire la source fournie (ou non) par le ou la contributrice, on trouve le lien hypertexte de l’institut néerlandais d’histoire de l’art.

query <- "SELECT DISTINCT ?url WHERE \
          { \
          wd:Q4660880 p:P195 ?declaration . \
          ?declaration prov:wasDerivedFrom ?ref .  \
          ?ref pr:P854 ?url \
           } "


WikidataQueryServiceR::query_wikidata(query)
# A tibble: 1 × 1
  url                                
  <chr>                              
1 https://rkd.nl/explore/images/62857

Il est possible de préciser aussi la source de l’information des localisations successives de l’œuvre choisie.

query <- "SELECT DISTINCT ?url WHERE \
          { \
          wd:Q4660880 p:P276 ?declaration . \
          ?declaration prov:wasDerivedFrom ?ref .  \
          ?ref pr:P854 ?url \
           } "


WikidataQueryServiceR::query_wikidata(query)
# A tibble: 1 × 1
  url                                                                          
  <chr>                                                                        
1 https://www.theleidencollection.com/artwork/young-woman-seated-at-a-virginal/

On remarquera qu’à la date de publication de cet article, la dernière date d’exposition mentionnée dans la source n’est pas encore reportée dans les données de Wikidata.

Ainsi, le notebook sert de support de dialogue entre plusieurs disciplines, ici, l’histoire, la géographie et l’ingénierie des connaissances.

Le notebook est aussi le lieu d’un processus collaboratif productif de connaissances (synchrone ou asynchrone). Il devient un outil pédagogique - par la formation par la recherche grâce à sa transformation en article de méthode rzine et est susceptible de servir de méthodologie (ou “fil directeur”) reproductible d’un processus similaire pour d’autres problématiques.

Bibliographie

HUI, Yuk, 2015. Induction, Deduction and Transduction: On the Aesthetics and Logic of Digital Objects. In : Networking Knowledge: Journal of the MeCCSA Postgraduate Network [en ligne]. 2015. Vol. 8, n° 3. [Consulté le 21 décembre 2022]. Disponible à l'adresse : https://www.academia.edu/12788303/Induction_Deduction_and_Transduction_On_the_Aesthetics_and_Logic_of_Digital_Objects.
SWARTZ, A., 2002. MusicBrainz: a semantic Web service. In : IEEE Intelligent Systems. 2002. Vol. 17, n° 1, pp. 76‑77. DOI 10.1109/5254.988466.
WIKIPÉDIA, 2021. Wikidata — Wikipédia, l’encyclopédie libre [en ligne]. 2021. S.l. : s.n. Disponible à l'adresse : http://fr.wikipedia.org/w/index.php?title=Wikidata&oldid=186068284.
WIKIPÉDIA, 2022. SPARQL — Wikipédia, l’encyclopédie libre [en ligne]. 2022. S.l. : s.n. Disponible à l'adresse : http://fr.wikipedia.org/w/index.php?title=SPARQL&oldid=194953405.
WILKINSON, Leland, 2005. The Grammar of Graphics [en ligne]. S.l. : Hardcover; Springer. Statistics et Computing. ISBN 0387245448. Disponible à l'adresse : http://www.amazon.fr/exec/obidos/ASIN/0387245448/citeulike04-21.

Annexes

Info session

setting value
version R version 4.4.2 (2024-10-31)
os Fedora Linux 41 (Workstation Edition)
system x86_64, linux-gnu
ui X11
language (EN)
collate fr_FR.UTF-8
ctype fr_FR.UTF-8
tz Europe/Paris
date 2025-03-11
pandoc 3.1.11.1 @ /usr/libexec/rstudio/bin/pandoc/ (via rmarkdown)
quarto 1.7.6 @ /usr/bin/quarto
package ondiskversion source
dplyr 1.1.4 CRAN (R 4.4.2)
ggplot2 3.5.1 CRAN (R 4.4.2)
jpeg 0.1.10 CRAN (R 4.4.2)
mapview 2.11.2 CRAN (R 4.4.2)
patchwork 1.3.0 CRAN (R 4.4.2)
sf 1.0.19 CRAN (R 4.4.2)
tmap 4.0 CRAN (R 4.4.2)
WikidataQueryServiceR 1.0.0 CRAN (R 4.4.2)
WikidataR 2.3.3 CRAN (R 4.4.2)

Citation

Krummeich R, Pecout H, Rey-Coyrehourcq S (2022). “Spatio-temporal, Wikidata*. Exploration de données ouvertes et liées du Web 3.0.”, doi:10.48645/xxxxxx https://doi.org/10.48645/xxxxxx,, https://rzine.fr/publication_rzine/xxxxxxx/.

BibTex :

@Misc{,
  title = {Spatio-temporal Wikidata*. Exploration de données ouvertes et liées du Web 3.0},
  subtitle = {Histoire de cadre : élaboration d’une trajectoire spatio-temporelle},
  author = {Raphaëlle Krummeich and Hugues Pecout and Sébastien Rey-Coyrehourcq},
  doi = {10.48645/xxxxxx},
  url = {https://rzine.fr/publication_rzine/xxxxxxx/},
  keywords = {FOS: Other social sciences},
  language = {fr},
  publisher = {FR2007 CIST},
  year = {2022},
  copyright = {Creative Commons Attribution Share Alike 4.0 International},
}


Glossaire


  1. DBpedia est une ontologie permettant de traduire Wikipedia en dépôts de données définis dans le cadre de description des ressources du standard Ressources Description Framework (RDF) du World Wide Web Consortium1 (W3C).↩︎

  2. Le terme de curation est un anglicisme désignant une activité de type archivistique ou de conservation muséale ou patrimoniale qui a pour objectif de décrire et de classer des objets pour les conserver et les rendre accessibles, le cas échéant. Le terme est issu du domaine médical au sens de “prendre soin en opérant une stratégie curative”. La curation de données peut être décrite comme une activité de description d’une donnée ou plus précisément d’une ressource du Web au moyen de métadonnées, c’est-à-dire de produire des données sur des données. Cette activité s’appuie en général sur des normes ou des règles de l’art des divers métiers. Dans le champ du catalogage informatique, une des plus anciennes normes est le Dublin Core.↩︎

  3. Le Web de données (linked data, en anglais) est une initiative du World Wide Web Consortium3 visant à favoriser la publication de données structurées sur le Web, non pas sous la forme de silos de données isolés les uns des autres, mais en les reliant entre elles pour constituer un réseau global d’informations.↩︎

  4. La notion de ressource Web peut être définie par la spécification de la norme RFC 3986 : Uniform Resource Identifier (URI): Generic Syntax (https://datatracker.ietf.org/doc/html/rfc3986#section-1.1) comme suit : “La présente spécification ne limite pas la portée de ce qui pourrait être une ressource ; le terme”ressource” est plutôt utilisé dans un sens général pour tout ce qui pourrait être identifié par un URI. Des exemples familiers familiers : un document électronique, une image, une source d’information ayant un objectif cohérent (par exemple, “le bulletin météorologique du jour pour Los Angeles”), un service (par exemple, une passerelle HTTP-SMS) et une collection d’autres ressources. Une ressource n’est pas nécessairement accessible via l’internet ; par exemple, les êtres humains, les entreprises et les livres reliés d’une bibliothèque peuvent également être des ressources. De même, des concepts abstraits peuvent être des ressources, tels que les opérateurs et opérandes d’une équation mathématique, les types d’une relation (par exemple, “parent” ou “employé”), ou des valeurs numériques (par exemple, zéro, un et l’infini).”↩︎

  5. Le World Wide Web Consortium (W3C) est un organisme de standardisation à but non lucratif fondé en 1994 et chargé de promouvoir la compatibilité des technologies du Web↩︎

  6. Un triplet est un groupe formé par trois éléments dont chacun appartient à un ensemble distinct.↩︎

  7. Un URI (Uniform Resource Identifier, en français “Identifiant unique de ressource”) est une chaîne de caractères qui fait référence à une ressource. Les plus courantes sont les URL, qui identifient une ressource en donnant son emplacement sur le Web. Au contraire, les Uniform Resource Name (URN) font référence à une ressource grâce à son nom, dans un environnement donné, par exemple le code ISBN d’un livre.↩︎

  8. SPARQL est acronyme récursif qui signifie SPARQL Protocol And RDF Query Language (Wikipédia (2022)). Plusieurs langages de requête destinés à interroger les graphes RDF ont été développés, mais le langage SPARQL est développé par le W3C de sorte à devenir un standard.↩︎

  9. Les formats d’écriture sont des normes ou standards adoptés dans le domaine avec une syntaxe spécifique à chacun.↩︎

  10. Un préfixe est une modalité de simplification d’écriture faisant référence à un espace de noms (qui est une page HTML ou un fichier en turtle par exemple), voir notamment https://www.w3.org/wiki/TheUsualPrefixes↩︎

  11. Le terme NoSQL est utilisé pour désigner des bases de données qui ne sortent du paradigme des bases de données relationnelles.↩︎

  12. WikidataR est développé par Thomas Shafee, Os Keyes, Serena Signorelli, Alex Lum, Christian Graul et Mikhail Popov (développeur de WikidataQueryServiceR), membre de la Fondation Wikimédia. Il est maintenu par Thomas Shafee de l’université australienne La Trobe de l’état Victoria.↩︎

  13. Le service de collecte des données de Wikidata en langage SPARQL offre une solution très complète en première approche (exemples, assistant de requêtes, diversité des représentations, etc.). Toutefois, dans une dynamique d’exploration du graphe Wikidata, l’utilisation de R facilite la compréhension, l’archivage et la reproductibilité des différentes requêtes réalisées. Pour cette raison, nous utilisons le package WikidataR ou alternativement WikidataQueryServiceR dont les fonctionnalités sont plus développées.↩︎

  14. Le géoréférencement est l’un des principes fondamentaux des systèmes d’information géographiques (SIG) et de la cartographie assistée par ordinateur (CAO). Un objet géographiques est référencé lorsqu’on lui attribue une localisation (coordonnées géographiques) et une forme (géométrie : point, ligne ou surface).↩︎

  15. Le format Well-known text, abrégé en WKT, peut se traduire par “texte bien lisible”. C’est un format standard en mode texte utilisé pour représenter des objets géométriques vectoriels issus des systèmes d’information géographique (SIG), mais aussi des informations s’y rattachant, tels les références de systèmes de coordonnées.↩︎

  16. Un système de coordonnées est un référentiel dans lequel on peut représenter des éléments dans l’espace. Ce système permet de se situer sur le globe terrestre grâce à un couple de coordonnées géographiques.↩︎

  17. Une jointure spatiale associe des champs (variables) et des valeurs attributaires d’une couche SIG à une table d’une autre donnée géographique. L’association entre la table attributaire de la couche source et la table jointe se réalise en fonction de la relation spatiale entre les différentes géométries des deux vecteurs concernés. La clé de jointure n’est pas un caractère mais une relation géographique entre les éléments localisés.↩︎


licensebuttons cc