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…

INC_2009_Justin_Trudeau2
À la place des huskies, vous avez donc droit à un premier ministre avec une tête de prince Disney. C’est bien aussi, non ?

Première question

Sans plus attendre, la requête répondant à la première question :

https://tinyurl.com/py3jzsb

Capture du 2015-10-23 20:29:59

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 :

Capture du 2015-10-23 19:47:05

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.

https://tinyurl.com/pcmht2u

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).

https://tinyurl.com/nepotsmap

Capture du 2015-10-23 21:09:56

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* 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 :

  1. l’élément existe (ben oui…)
  2. les relations généalogiques soient correctement renseignées
  3. 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 »)
  4. 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.

* À ce sujet, la seule femme ministre qui a eu un enfant ministre également (d’après ces résultats du moins) est Indira Gandhi.

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.

Enregistrer

Wikidata, SPARQL et chiens de traîneaux

Bon, puisque le dernier billet semble avoir plu, je vais continuer de poster ici mes bidouillages avec SPARQL. L’hiver arrive à grands pas et la saison des courses de chiens de traîneaux aussi par la même occasion, donc c’est parti pour des requêtes un peu plus touchy avec des photos de chiots, parce qu’il n’y a pas de raison de ne pas en profiter.

UNION

Pour commencer, j’aimerais bien avoir toutes les courses de chiens de traîneaux pour lesquelles des participants sont enregistrés. Problème : il y a des courses pour lesquelles la nature de l’élément (P31) est course de chiens de traîneaux (Q1968664), d’autres pour lesquelles la nature est un élément concernant une course qui est elle-même une sous-classe (P279) de course de chiens de traîneaux, et enfin d’autres pour lesquelles la nature est un élément concernant une course qui n’est pas marquée comme sous-classe de course de chiens de traîneaux… Mais pour lequel « course de chiens de traîneaux » est indiqué comme sport (P641). Bref, c’est le bordel. On va donc faire les deux requêtes en même temps et en joindre les résultats avec la commande UNION, comme ci-dessous.

https://tinyurl.com/q74e9ve

Comme dit ci-dessus, quand la même chose peut être décrite sous deux formes, on peut faire une union pour joindre les résultats des deux requêtes :

La ligne suivante :

sert à restreindre aux courses ayant un ou des valeurs pour la propriété  « participant » (P710)

Pour finir, je trie par ordre alphabétique des noms en français des courses :

Capture du 2015-10-19 22:54:09

Husky puppy, CC-BY Tony Pham

Qualificatifs

J’aimerais maintenant chercher, dans les participants à des courses de chiens de traîneau, ceux qui n’ont pas de rang à l’arrivée d’indiqué, ni d’événement-clef expliquant pourquoi ils ne sont pas arrivés (par exemple, abandon ou disqualification). Ces informations sont mises en qualificatifs de la déclaration :

Capture du 2015-10-19 23:37:46

Ici, dans les participants de l’Iditarod 2015, on voit que Brent Sass a été disqualifié (il y a même un article de Wikinews expliquant pourquoi), et que Jason Mackey est arrivé 42e.

On ne peut pas chercher ça avec wdt:, qui renvoie une valeur. Il nous faut utiliser une autre des ontologies proposées par défaut, p:, qui renvoie une déclaration en entier, avec tous ses qualificatifs. La requête est donc la suivante :

La première ligne du WHERE n’a pas changé par rapport à la requête précédente.

Dans la deuxième, en revanche, on voit que wdt: a été remplacé par p:.

J’ai aussi renommé ?musher par ?musherS pour me rappeler que c’est une déclaration (statement) et non une valeur directement. Pour pouvoir afficher le nom des mushers, je vais devoir chercher ladite valeur en utilisant le préfixe v: et la même propriété, avec la déclaration comme sujet :

Enfin, deux filtres sur les qualificatifs (on utilise donc q: et non p: cette fois) me permettent de remonter les lignes qui n’ont pas (FILTER NOT EXISTS) de rang (P1352) ni d’événement-clef (P793).

Capture du 2015-10-19 23:26:42

Samoyède, CC-BY-SA Sp..andreea

Je crois que je vais continuer à m’amuser un peu avec les courses de chiens la prochaine fois, et voir dans quoi on peut réinjecter les résultats des requêtes, pour générer des graphiques ou des cartes…

Photo d’en-tête : Brent Sass et Allen Moore campent l’un à côté de l’autre à un checkpoint durant la Yukon Quest 2015. Photo CC-BY Public Affairs Office Fort Wainwright

Enregistrer

Enregistrer

Mais combien y a-t-il de femmes scientifiques sur Wikipédia ? (this time with SPARQL)

Dans mon dernier billet, j’explorais les possibilités d’exploiter les données de Wikidata avec Autolist. Il est maintenant possible d’interroger Wikidata en utilisant le langage standard du web sémantique, SPARQL. Je ne vais pas faire un cours de SPARQL sur ce blog, mais je vais détailler une requête étape par étapes.

Comme c’est à nouveau le jour de l’éditathon Femmes de sciences, je vais reprendre la même requête que la dernière fois : combien y-a-t-il de femmes scientifiques sur les projets Wikimedia, et quel taux par rapport aux hommes ?

Pour commencer, ça se passe par là : https://query.wikidata.org/

Et comme première requête, on va demander de lister 10 êtres humains, sans préoccupation de genre ou de profession. Cela se formule comme ça :

https://tinyurl.com/qhhzdsz

Les deux préfixes au début permettent d’éviter d’avoir à taper en entier les URL des ontologies qu’on utilise. On en ajoutera au fur et à mesure qu’on en aura besoin. Vous pouvez cliquer sur le bouton « Add prefixes » pour en ajouter un paquet d’un coup mais pour les besoins de ce tutorial, je ne vais inclure dans chaque requête que ceux qu’on utilise vraiment.

passons à la requête elle-même :

Ceux pour qui le langage SQL est familier ne seront pas trop dépaysés : « select » est la commande pour demander au serveur de retourner un liste de résultats, « distinct » demande au serveur d’éliminer les doublons éventuels dans les résultats. « ?personne » est une variable qu’on va préciser plus bas, mais remarquez juste pour l’instant que les variables commencent par des points d’interrogation en SPARQL.

On continue avec la clause « where » où on va détailler au serveur ce qu’est cette fameuse variable ?personne qu’on lui demande.

Pour rappel, on cherche en fait des éléments Wikidata. Sur Wikidata, un élément est composé de déclarations dont la structure est la suivante :
2014-06_Introduction_à_Wikidata.pdf

Ici, la structure

peut se lire, dans le jargon du web sémantique :

ou dans celui de Wikidata :

Comme ce sont des éléments qu’on cherche,  on remplace cette partie par notre variable. La propriété qu’on cherche est P31 (nature de l’élément) et la valeur Q5 (être humain), et pour éviter de mettre les URL en entier on va utiliser les préfixes définis plus haut. On a donc wd: pour un élément wikidata et wdt: pour une propriété.

Enfin, le « LIMIT 10 » permet d’éviter de sortir une liste interminable de résultats qui prendrait un temps fou et dont l’affichage mettrait probablement à mal le navigateur.

Lançons maintenant la requête.

Résultats requete SPARQL 1

On a bien 10 résultats, mais ce qui serait bien, c’est d’afficher le label à côté, parce que de tête, je ne sais pas qui sont wd:Q260 ou wd:Q272.

https://tinyurl.com/pfnomxs

On ajoute donc un petit bout de code faisant appel au service « label » de Wikibase. C’est quelque chose de spécifique à Wikidata, qui ne correspond pas au standard (qui serait d’appeler la propriété rdfs:label) et est dû au fait que Wikidata a une gestion très poussée des langues. Elle permet cependant de faire un truc sympa : on peut lui préciser un langage de repli s’il n’y a pas de label dans la première langue demandée. Ainsi ici, si un élément remonté n’a pas de label en français, on va se replier sur celui en anglais. Pour ceux n’ayant pas de label dans ces deux langues, c’est l’identifiant Wikidata qui sera affiché.

J’ai ajouté également les préfixes pour les deux nouvelles ontologies utilisées. Enfin, on rajoute la deuxième colonne demandée au select. La syntaxe « ?<variable>Label » est particulière à ce service.

Continuons maintenant à préciser la requête : on se rappelle qu’on veut spécifiquement les femmes scientifiques.

Commençons par le genre.

On veut les personnes qui ont la valeur « femme (Q6581072) » à la propriété « sexe ou genre (P21) », et on a juste à ajouter la ligne

dans notre clause where. Pour la profession, c’est un peu plus compliqué : la plupart des scientifiques ne sont en effet pas recensés en tant que scientifiques directement mais avec des professions plus précises, comme Marie Curie qui est physicienne et chimiste. On veut donc non seulement les gens dont la profession (P106)  est scientifique (Q901) , mais aussi ceux dont la profession est une sous-classe (P279) de scientifique.

Cela se formule comme cela :

L’étoile sert à indiquer qu’on veut prendre plusieurs niveaux de sous-classe s’il y en a.

La requête finale est donc :

https://tinyurl.com/p9rtblf

Capture du 2015-10-18 22:04:45

Note : on peut abréger cette requête en remplaçant les trois lignes du where par une seule :

 

C’est bien, mais ce qu’on voulait à la base, c’est le *nombre* de femmes scientifiques, pas dix d’entre elles au hasard. Il suffit de changer la ligne 5 de la façon suivante :

on demande donc à SPARQL de compter le nombre de résultats de notre requête et de le renvoyer en tant que nouvelle variable ?nombre, ce qui donne ce résultat https://tinyurl.com/pgn6xel

Au moment où j’écris ces lignes, il y a donc 16764 femmes scientifiques sur Wikidata. Et si on veut comparer aux hommes ? Il est possible de sortir le chiffre par genre en mettant cette valeur comme une variable et en l’utilisant pour grouper les résultats. Cela se fait de la façon suivante :

https://tinyurl.com/oebwvh8

Capture du 2015-10-17 16:48:47

Quelques remarques :

  • j’ai dû renoncer à afficher les labels pour les genres, cela faisait partir la requête en timeout. Les valeurs sont les suivantes : masculin (Q6581097), féminin (Q6581072), femme transgenre (Q1052281), homme transgenre (Q2449503)
  • Les personnes trans* sont généralement indiquées à la fois comme de sexe masculin et féminin (avec des dates de début ou de fin correspondant à la transition) et de genre femme (ou homme) transgenre. Comme il y a une seule propriété pour sexe et genre, elles apparaissent donc 3 fois dans ces statistiques.
  • le t216432070 est en fait un blank node, c’est à dire un nœud vide.  Il correspond à Āpastamba, un mathématicien indien du IV ou Ve siècle avant notre ère, qui a « valeur inconnue » pour la propriété sexe ou genre (ce qui me semble une erreur, quelques recherches sur Internet pointent toutes vers un homme.)

 

Par rapport à la question d’origine, il ne reste donc plus qu’à filtrer les résultats pour ne garder que les éléments qui ont un interwiki vers la Wikipédia en français. On cherche donc la propriété schema:about en filtrant sur les URL concernant fr.wikipedia.org :

https://tinyurl.com/p3hokoo

Capture du 2015-10-18 22:03:23

Bilan : 7,6% de scientifiques sont des femmes sur la Wikipédia en français, contre 10% sur Wikidata. Cela a un peu progressé par rapport au précédent billet il y a sept mois.

PS : Merci à Karima Rafes pour sa présentation du langage SPARQL hier lors du SemanticCamp Paris #7.

Image à la une : Ada Lovelace par Margaret Carpenter (domaine public). L’editathon Femmes de sciences a lieu dans le cadre de l’Ada Week qui est nommée en son honneur.

Enregistrer

Enregistrer