Wikidata, SPARQL et dynasties électives
La dernière fois, j’avais dit que je continuerais avec les chiens de traîneau mais entre-temps, Fralambert a posé la question suivante sur le bistro de Wikidata :
Bonjour, avec l’élection de Justin Trudeau (Q3099714) comme premier ministre du Canada, et suite à une petite discussion sur IRC. Je me demandais comment on pourrait avoir:
- Tous les fils ou filles de ministres devenu ministre
- Et tant qu’à y être, quel est le pays le plus népotique (qui regroupe le plus de ces cas)
On ma suggérer que l’on pourrait le faire à partir de SPARQL, mais je n’ai aucune idée de la façon de programmer ça. Le plus près que je me suis rendu sur Query est Query: CLAIM[39:(Tree[83307][][279])] and claim[40]. Bon mon petit défi est lancé, bonne chance. 😉 —Fralambert (discussion) 01:31, 22 October 2015 (UTC)
La seconde question me permet aussi de faire ce que j’avais prévu pour cet article, la réutilisation des données extraites pour faire une carte, donc, au revoir les chiens…
Première question
Sans plus attendre, la requête répondant à la première question :
PREFIX wd: <http://www.wikidata.org/entity/> PREFIX wdt: <http://www.wikidata.org/prop/direct/> PREFIX wikibase: <http://wikiba.se/ontology#> PREFIX p: <http://www.wikidata.org/prop/> PREFIX v: <http://www.wikidata.org/prop/statement/> PREFIX q: <http://www.wikidata.org/prop/qualifier/> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT DISTINCT ?enfant ?enfantLabel ?parent ?parentLabel ?paysLabel WHERE { ?enfant wdt:P31 wd:Q5 . # On cherche des humains (pas des personnages de fiction) ?enfant wdt:P39/wdt:P279* wd:Q83307 . #qui exercent ou ont exercé une fonction de ministre (ou dont la fonction est une sous-classe de ministre) { ?enfant wdt:P22 ?parent . ?parent wdt:P39/wdt:P279* wd:Q83307 . #et dont c'est aussi le cas pour le père. } UNION { ?enfant wdt:P25 ?parent . ?parent wdt:P39/wdt:P279* wd:Q83307 . #et dont c'est aussi le cas pour la mère. } ?enfant wdt:P27 ?pays . SERVICE wikibase:label { bd:serviceParam wikibase:language "fr,en" . } } ORDER BY ?paysLabel
J’ai commenté la requête directement pour éviter d’avoir à tout recopier. On voit que je fais deux requêtes sur les parents ayant occupé une fonction étant une sous-classe de ministre : une pour les pères, une pour les mères. Il me semble qu’on devrait pouvoir utiliser schema:parent pour s’éviter la jointure, mais soit ce n’est pas encore implémenté, soit je m’y prends mal, parce que ça ne renvoie aucun résultat.
Je remarque aussi au passage que l’auto-complétion a été activée : il suffit de taper le début du label (ou d’un alias) en anglais d’un élément ou d’une propriété et faire <Ctrl>+<Espace> pour le remplacer par son identifiant Wikidata :
Voilà qui devrait faciliter l’utilisation au quotidien.
Et par pays ?
La deuxième requête nécessite juste de regrouper par pays et de compter le nombre de résultats plutôt qu’en afficher la liste.
prefix schema: <http://schema.org/> PREFIX wd: <http://www.wikidata.org/entity/> PREFIX wdt: <http://www.wikidata.org/prop/direct/> PREFIX wikibase: <http://wikiba.se/ontology#> PREFIX p: <http://www.wikidata.org/prop/> PREFIX v: <http://www.wikidata.org/prop/statement/> PREFIX q: <http://www.wikidata.org/prop/qualifier/> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT ?paysLabel (COUNT(DISTINCT ?enfant) AS ?nombre) WHERE { ?enfant wdt:P31 wd:Q5 . # On cherche des humains (pas des personnages de fiction) ?enfant wdt:P39/wdt:P279* wd:Q83307 . #qui exercent ou ont exercé une fonction de ministre (ou dont la fonction est une sous-classe de ministre) { ?enfant wdt:P22 ?parent . ?parent wdt:P39/wdt:P279* wd:Q83307 . #et dont c'est aussi le cas pour le père. } UNION { ?enfant wdt:P25 ?parent . ?parent wdt:P39/wdt:P279* wd:Q83307 . #et dont c'est aussi le cas pour la mère. } ?enfant wdt:P27 ?pays . SERVICE wikibase:label { bd:serviceParam wikibase:language "fr,en,el" . } } GROUP BY ?paysLabel ORDER BY DESC(?nombre)
Mais on peut faire mieux : cette requête se prête parfaitement à un affichage sous forme de carte. Direction un autre outil de requêtes SPARQL, http://demo.seco.tkk.fi/visu/#/.
Comme il n’est pas spécifique à Wikidata, il faut cette fois indiquer, en plus de la requête, l’URL complète du endpoint SPARQL de Wikidata : https://query.wikidata.org/bigdata/namespace/wdq/sparql/
C’est également une bonne idée d’adapter un peu la requête pour utiliser les codes standards des pays plutôt que leur nom, en l’occurrence le code FIPS 10-4 (pays et régions) (P901).
PREFIX wd: <http://www.wikidata.org/entity/> PREFIX wdt: <http://www.wikidata.org/prop/direct/> PREFIX wikibase: <http://wikiba.se/ontology#> PREFIX p: <http://www.wikidata.org/prop/> PREFIX v: <http://www.wikidata.org/prop/statement/> PREFIX q: <http://www.wikidata.org/prop/qualifier/> PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> SELECT ?cc (COUNT(DISTINCT ?enfant) AS ?nombre) WHERE { ?enfant wdt:P31 wd:Q5 . # On cherche des humains (pas des personnages de fiction) ?enfant wdt:P39/wdt:P279* wd:Q83307 . #qui exercent ou ont exercé une fonction de ministre (ou dont la fonction est une sous-classe de ministre) { ?enfant wdt:P22 ?parent . ?parent wdt:P39/wdt:P279* wd:Q83307 . #et dont c'est aussi le cas pour le père. } UNION { ?enfant wdt:P25 ?parent . ?parent wdt:P39/wdt:P279* wd:Q83307 . #et dont c'est aussi le cas pour la mère. } ?enfant wdt:P27 ?pays . ?pays wdt:P901 ?cc . SERVICE wikibase:label { bd:serviceParam wikibase:language "en" . } } GROUP BY ?cc ORDER BY DESC(?nombre)
Limites
Cependant, cette requête montre clairement les limites de Wikidata dans son état actuel : on manque encore cruellement de données et surtout de liens entre elles. En effet, à en croire le résultat, il n’y aurait de toute éternité dans le monde entier que cent ministres dont le père ou la mère[1] a été ministre également, et près de la moitié en Grèce. Outre le biais évident de la demande d’origine de ne considérer que le népotisme que pour les ministres et non l’ensemble des personnalités politiques (présidents, parlementaires, et même pourquoi pas diplomates, officiers, évêques…), le problème est que pour qu’une entrée ressorte, il faut que pour le parent comme pour l’enfant :
- l’élément existe (ben oui…)
- les relations généalogiques soient correctement renseignées
- la fonction soit renseignée (et correctement, il est encore fréquent de trouver la fonction remplie avec « ministère de XXX » au lieu de « Ministre »)
- et enfin qu’il y ait une chaîne ininterrompue de sous-classes entre l’élément indiqué comme fonction et l’élément « Ministre » (Q83307)
Visiblement, ce travail a été fait correctement pour la Grèce (environ 900 ministres depuis l’indépendance du pays ne me semble pas déconnant), mais reste à faire pour les autres pays.
Image d’en-tête:
L’Adoration des mages, par Botticelli, montre Cosme de Médicis, fondateur de la dynastie politique du même nom, accompagné de plusieurs de ses enfants et petits enfants.
Sylvain Machefert 25 octobre 2015 09:21 ¶
Je confirme les données parcellaires sur les filiations, on s'etait posé le même genre de questions avec des copains sur la généalogie du cinéma français et les fils de, et force est de constater qu'il manque beaucoup de données pour que ce soit viable. Je suis en train de faire tourner un bot pour rajouter à partir des infobox biography mais il reste beaucoup de boulot !