Topic on Wikidata:Bistro/Archives des discussions structurées

Jump to navigation Jump to search

SPARQL et qualificatif de propriété multiple

5
Zebulon84 (talkcontribs)

Je cherche à sélectionner les communes actuelles du Haut-Rhin (c'est un exemple, le but étant ensuite de pouvoir le faire sur différentes entités administrative)

J'ai actuellement la requête suivante :

#Communes du Haut-Rhin
SELECT ?insee ?itemLabel ?remplacée ?dateFin1 ?dateFin2 ?dateDébut2 WHERE {
  ?item wdt:P31 / wdt:P279? wd:Q484170;  # nature ou sous-classe de Commune de France
        wdt:P131 wd:Q12722.              # localisation administrative  Haut-Rhin
  OPTIONAL { ?item wdt:P1366 ?remplacée. }  #remplacé par
  OPTIONAL { ?item p:P31 [ 
                    ps:P31 wd:Q484170;   # nature commune de France
                    pq:P582 ?dateFin1 ]. 
           }
  OPTIONAL { ?item p:P131 [ 
                    ps:P131 wd:Q12722;   # localisation Haut-Rhin
                    pq:P582 ?dateFin2;   
                    pq:P580 ?dateDébut2  
                  ].
           }
 # FILTER ( !( BOUND(?remplacée) ||BOUND(?dateFin1) || BOUND(?dateFin2) ) )
  OPTIONAL { ?item wdt:P374 ?insee. }
  OPTIONAL { ?article schema:about ?item ; schema:isPartOf <https://fr.wikipedia.org/> ;  schema:name ?page. }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],fr". }
}
ORDER BY (?insee)

Mon problème est que certaines communes comme Andolsheim (Q325717) ont deux fois le Haut-Rhin (Q12722) dans la propriété located in the administrative territorial entity (P131), et je récupère celle qui a une date de fin ; donc mon filtre la supprime alors qu'elle est de nouveau dans le Haut-Rhin. J'ai désactivé le filtre pour mieux voir ce qui se passe.

VIGNERON (talkcontribs)

(Caveat, j'ai regardé un peu rapidement, analyse garantie imparfaite )

Hum...

Bizarre. Pas sûr de bien comprendre ce qui se passe. Andolsheim (Q325717) ayant deux fois le Haut-Rhin (Q12722), sans le filtre, il devrait apparaitre deux fois dans la liste (ce qui n'est pas le cas, étrange...).

Sinon, la structure même de la requête est un peu étrange, si tu ne veux que les communes actuelles, pourquoi chercher à afficher la date de fin ou le remplacé par ? Par définition, les communes actuelles n'ont pas ces valeurs.

Beaucoup plus simplement, j'aurais fait :

  1. Communes du Haut-Rhin

SELECT ?item ?itemLabel WHERE {

 ?item wdt:P31/wdt:P279* wd:Q484170 ;  # nature ou sous-classe de Commune de France
       wdt:P131 wd:Q12722.
 minus { ?item wdt:P576 [] }
 SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],fr". }

}

(un peu brutal mais cela semble donner de bon résultat)

  1. Communes du Haut-Rhin

SELECT ?item ?itemLabel WHERE {

 ?item wdt:P31/wdt:P279* wd:Q484170 ;  # nature ou sous-classe de Commune de France
       wdt:P131 wd:Q12722.
 MINUS { ?item wdt:P1366 [] }
 MINUS { ?item p:P31 [ 
                   ps:P31 wd:Q484170;
                   pq:P582 [] ]. 
          }
 SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],fr". }

}

(un peu plus élégant et proche de ton code originel)

Ceci dit, au-delà de la requête elle-même, j'ai l'impression que les données stockées dans Wiki ne sont pas parfaitement à jour. À regarder de plus près.

Zebulon84 (talkcontribs)

Je n'avais pas trouvé comment sélectionner un élément qui n'a pas une propriété, tes exemples montrent qu'il faut simplement mettre [], merci (j'avais pourtant essayé null, !, cherché sur internet...)

Le problème c'est que ces requêtes sélectionnent aussi les communes qui ne font plus partie du Haut-Rhin (comme Hangenbieten Hangenbieten (Q21262)) car les limites du département ont varié dans le temps, à cause de l'occupation allemande entre 1871 et 1918. Certaines sont aujourd'hui dans le Bas-Rhin ou le Territoire de Belfort.

Les changements sont rares pour les départements, mais plus fréquents pour d'autres entités, les arrondissements ont notamment été redessinés plusieurs fois, pour équilibrer leur population en fonction des évolutions démographiques.

Si j'arrive à faire ce que je désire, cela facilitera justement la comparaison entre les données de l'Insee et celle de Wikidata.

VIGNERON (talkcontribs)

Plus exactement la syntaxe [] signifie « une valeur, peu importe laquelle et que la requête ne stocke pas comme variable ». Pour avoir « un élément sans la propriété X », la partie importante de la syntaxe est « MINUS { ?élément ?propriété ?valeur } » (mais vu que par définition, il n'y a pas de valeur autant ne pas utiliser une variable pour cela).

J'ai tenté cette requête :

SELECT ?item ?itemLabel WHERE {
  ?item wdt:P31/wdt:P279* wd:Q484170 ; wdt:P131 wd:Q12722.
  MINUS { ?item p:P131 [ ps:P131 wd:Q12722 ; pq:P582 [] ] . }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],fr". }
}

Mais elle ne correspond pas exactement car cela donne les 42 communes (et cela devrait même sans doute être 0 en toute logique, les données sont à vérifier et sans doute à corriger). En effet, cela retire *toute* les communes ayant une date de fin pour le Haut-Rhin (donc y compris celle qui ont réintégré le Haut-Rhin ensuite).

Du coup, il faudrait partir dans l'autre sens : date de début située après 1920 mais là aussi les données sont incomplètes.

Clairement, il faut vérifier et sans doute compléter les données si on veut avoir les bons résultats.

Sinon, je me demande si la meilleure façon de s'en sortir dans ce cas serait d'ajouter le rang privilégié sur les valeurs actuelles.

Zebulon84 (talkcontribs)

J'ai réussi avec la requête suivante :

SELECT ?item ?itemLabel WHERE {
  ?item wdt:P31/wdt:P279* wd:Q484170; # commune du Haut-Rhin
        p:P131 ?node.
  ?node ps:P131 wd:Q12722.
  Minus { ?node pq:P582 []. }
  Minus { ?item (wdt:P1366|wdt:P576) []. }
  Minus { ?item p:P31 [ pq:P582 [] ]. }
  Service wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],fr". }
}

Il y a quelques doublons, mais les deux que j'ai vérifiés correspondent à des dates de fin manquantes sur Wikidata, donc c'est normal qu'ils soit là, cela va permettre de les corriger.

Merci VIGNERON pour ton aide.

Si on met un rang privilégié sur le département car ça a changé, il faut sans doute aussi le mettre pour le canton et l'arrondissement, même s'il n'y a qu'un valeur, pour être cohérent. C'est bien plus que ce que je suis prêt à faire sur le sujet.