Topic on User talk:TomT0m

Jump to navigation Jump to search
Summary by TomT0m

une série de requête comparant les proportions de biographie par genre dans des livres pour WP:RAW

Simon Villeneuve (talkcontribs)

Salut,
J'ai lancé une nouvelle section sur les fr:WP:RAW qui s'intitule "SPARQL du mois" (exemple). Je lance l'invitation ici et là à des contributeurs qui maîtrisent relativement bien le SPARQL. Si jamais tu penses avoir une bonne idée de thématique et/ou de bonne requêtes à partager, n'hésite pas !
La section de février est déjà prête. Pour celle de mars, je pensais faire un tableau avec le nombre d'articles consacré aux hommes et aux femmes par différentes publications externes. J'ai commencé quelque chose, mais je bloque.
En gros, j'aimerais faire un tableau montrant le nombre d'éléments de certaines publications selon les genres. Pour ce faire, j'ai filtré certains identifiants avec cette requête :

SELECT DISTINCT ?property ?propertyLabel ?propertyDescription
WHERE
{
    ?property rdf:type wikibase:Property ;
              wdt:P31/wdt:P279* wd:Q36218176 ;
              wdt:P31/wdt:P279* wd:Q55452870 .
    SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en" }	
}

Try it!

J'aimerais savoir si tu sais comment, pour chacune de ces 23 propriétés, recenser tous les éléments humains et les diviser en genre ? J'ai trouvé la requête suivante dans les exemples, mais elle n'est construite que pour un cas spécifique.

En bref, je suis capable de faire "à la main" ce travail : faire une requête individuelle pour chacune de ces 23 propriétés, diviser les éléments en genres et entrer ces valeurs dans un tableau. Je me demandais si tu connaissais un moyen de faire la chose d'un seul coup en SPARQL.

TomT0m (talkcontribs)

Oui c'est possible, première tentative : https://query.wikidata.org/#SELECT%20DISTINCT%20%3Fproperty%20%3FpropertyLabel%20%3FpropertyDescription%20%3Fsexe%20%3FsexeLabel%20%28count%28%3Fperson%29%20as%20%3Feffectif%29%0AWHERE%0A%7B%0A%20%20%20%20%3Fproperty%20rdf%3Atype%20wikibase%3AProperty%20%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20wdt%3AP31%2Fwdt%3AP279%2a%20wd%3AQ36218176%2C%20wd%3AQ55452870%20%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20wikibase%3AdirectClaim%20%3FpropertyMainValue%20.%0A%20%20%20%20%3Fperson%20%3FpropertyMainValue%20%5B%5D%20%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20wdt%3AP21%20%3Fsexe%20.%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%0A%20%20%20%20SERVICE%20wikibase%3Alabel%20%7B%20bd%3AserviceParam%20wikibase%3Alanguage%20%22%5BAUTO_LANGUAGE%5D%2Cen%22%20%7D%09%0A%0A%7D%20group%20by%20%3Fproperty%20%3FpropertyLabel%20%3FpropertyDescription%20%3Fsexe%20%3FsexeLabel%20%0A%20%20order%20by%20%3Fproperty%20%3Fsexe mais il y a un peu de nettoyage à faire pour les "valeurs inconnues" je crois.

TomT0m (talkcontribs)

Entre une étape intermédiaire pour me rendre compte que les cas ou le sexe est inconnus sont probablement des cas ou il s'agit de compagnie ferroviaires ou de groupes donc que beaucoup de "non spécifié" ou "inconnus" ne sont pas très pertinent, je pense être arrivé à un truc pas mal en se restreignant aux humains :

select ?property ?propertyLabel ?propertyDescription ?sexe ?sexeLabel (count(?person) as ?effectif)
{
    ?property rdf:type wikibase:Property ;
              wdt:P31/wdt:P279* wd:Q36218176, wd:Q55452870 ;
              wikibase:directClaim ?propertyMainValue .
  
    ?person ?propertyMainValue [] ;
            wdt:P31 wd:Q5 .
    optional {
       ?person wdt:P21 ?sexe2
       bind(if(isBlank(?sexe2), "inconnu", ?sexe2) as ?sexe3) 
    }
    bind(if(!bound(?sexe3), "non specifié", ?sexe3) as ?sexe) 
  
    SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en" }	
  
} group by ?property ?propertyLabel ?propertyDescription ?sexe ?sexeLabel
  order by ?property ?sexe

Try it!

Simon Villeneuve (talkcontribs)

(cela concerne ton premier message. J'explore ton second à l'instant)

Vraiment trop cool !
Ça fait une demi-heure que je tente de transformer en % les effectifs en insérant ici et là des BIND et des count, mais je n'y arrive pas. Tu peux encore m'aider ?
Sinon, pour mieux apprendre le SPARQL, à part le livre sur Wikibook en anglais et les pages de W3C, tu as des suggestions ?

TomT0m (talkcontribs)

Une dernière version (pour l'instant, on verra les pourcentages plus tard) avec moins de ligne :

select ?property ?propertyLabel ?propertyDescription (group_concat(concat(str(?sexe_label_final), ": ", str(?effectif));separator=" - ") as ?sexes) (sum(?effectif) as ?total)

with {

select ?property ?sexe (count(?person) as ?effectif)
{
    ?property rdf:type wikibase:Property ;
              wdt:P31/wdt:P279* wd:Q36218176, wd:Q55452870 ;
              wikibase:directClaim ?propertyMainValue .
  
    ?person ?propertyMainValue [] ;
            wdt:P31 wd:Q5 .
    optional {
       ?person wdt:P21 ?sexe2 .
       bind(if(isBlank(?sexe2), "inconnu", ?sexe2) as ?sexe3) 
    }
    bind(if(!bound(?sexe3), "non specifié", ?sexe3) as ?sexe)
    
 
} group by ?property ?sexe
  order by ?property ?sexe
} as %dataset

where {
  {
    select ?property ?propertyLabel ?propertyDescription ?sexe ?sexe_label_final ?effectif{
      include %dataset .
      optional { ?sexe rdfs:label ?label_sexe filter langmatches(lang(?label_sexe), "fr") }
      SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
      bind (if(bound(?label_sexe), ?label_sexe, ?sexe) as ?sexe_label_final)
    }
  }
} group by ?property ?propertyLabel ?propertyDescription

Try it!

TomT0m (talkcontribs)

Et finalement voilà les pourcentages :

select ?property ?propertyLabel ?propertyDescription 
       (group_concat(concat(str(?sexe_label_final), 
                           ": ", 
                           str(?effectif), " ",
                           "(", str(round(?effectif / sum(?effectif) * 100)), "%",")") ; separator=" - ") as ?sexes) 
       (sum(?effectif) as ?total)

with {

select ?property ?sexe (count(?person) as ?effectif)
{
    ?property rdf:type wikibase:Property ;
              wdt:P31/wdt:P279* wd:Q36218176, wd:Q55452870 ;
              wikibase:directClaim ?propertyMainValue .
  
    ?person ?propertyMainValue [] ;
            wdt:P31 wd:Q5 .
    optional {
       ?person wdt:P21 ?sexe2 .
       bind(if(isBlank(?sexe2), "inconnu", ?sexe2) as ?sexe3) 
    }
    bind(if(!bound(?sexe3), "non specifié", ?sexe3) as ?sexe)
    
 
} group by ?property ?sexe
  order by ?property ?sexe
} as %dataset

where {
  {
    select ?property ?propertyLabel ?propertyDescription ?sexe ?sexe_label_final ?effectif{
      include %dataset .
      optional { ?sexe rdfs:label ?label_sexe filter langmatches(lang(?label_sexe), "fr") }
      SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
      bind (if(bound(?label_sexe), ?label_sexe, ?sexe) as ?sexe_label_final)
    }
  }
  bind( (?effectif / ?total )  as ?pourcent)
} group by ?property ?propertyLabel ?propertyDescription

Try it!

Simon Villeneuve (talkcontribs)