Communes orphelines ?

(Ouh la vache, rien depuis 4 ans et demi ?! Je sais que j’ai eu autre chose à faire, mais quand même ! )

Une de mes bêtes noires sur Wikidata : les items représentant des communes françaises avec des déclarations mauvaises ou incomplètes.

Exemple du jour, ll n’est pas pertinent de considérer qu’une commune est située dans un canton : certes, les communes françaises sont – sauf les exceptions que constituent Paris (qui est « regroupée toute seule »), Lyon (dans une métropole), et les communes des régions d’outre-mer – regroupées en départements, et lesdits départements découpés en arrondissements eux-mêmes découpés en cantons ; mais les communes ne sont pas regroupées en cantons. Certains cantons recouvrent bien plusieurs communes, mais ce n’est pas la norme.

On trouve par exemple :

  • des cantons comportant plusieurs communes (cas le plus courant)
    Ploemeur
    canton de Plœmeur, communes de Larmor-Plage, Plœmeur, et Quéven dans leur intégralité
  • des communes comportant à elles seules plusieurs cantons, et aucun fragment d’autre canton
    Aix
    cantons d’Aix-en-Provence-1 et Aix-en-Province 2 dans leur intégralité, commune d’Aix-en-Provence
  • des cantons à cheval sur plusieurs communes, dont aucune en entier
    Cannes
    canton de Cannes-1, communes de Cannes et du Cannet
  • des cantons comportant plusieurs communes et un fragment d’une commune qui comporte à elle seule au moins un autre canton entier
    Lille
    cantons de Lille-3 et Lille-5, communes de Lille et Mons-en-Barœul
  • des cantons à cheval sur plusieurs fragments disjoints d’une même commune
    Reims
    canton de Reims-8, commune de Reims

Si avec ça vous considérez toujours qu’utiliser un canton comme localisation administrative d’une commune est une excellente idée, je ne peux rien pour vous. Il est impératif d’utiliser les départements (dans le cas général) : une même commune est nécessairement dans un département (au plus) ; elle ne peut être divisée entre deux départements. Et pour les cas particuliers, il est toujours possible de les insérer dans la plus petite entité administrative dans laquelle elles se trouvent : leur métropole, collectivité d’outre-mer, terre australe ou antarctique…

Reste donc le souci des communes qui ne sont pas localisées administrativement dans un département directement, mais qui le sont récursivement. Oui, c’est un souci : ça implique de faire plus de requêtes, beaucoup plus longues, pour obtenir une information pourtant utile. Vous en verrez un exemple, pourtant incomplet, plus bas.

Voici déjà une requête pour récupérer les communes françaises. On construira dessus. J’ajoute déjà les labels des entités correspondantes.

  1. SELECT ?commune ?communeLabel WHERE {
  2.   ?commune wdt:P31 wd:Q484170 .
  3.   SERVICE wikibase:label {
  4.     bd:serviceParam wikibase:language "fr" .
  5.   }
  6. }

38376 résultats

Jusque là, ça va.
Voyons pour les communes qui n’ont pas de département comme localisation administrative.

  1. SELECT ?commune ?communeLabel WHERE {
  2.   ?commune wdt:P31 wd:Q484170 . # les trucs qui sont des communes
  3.   MINUS { # mais pas
  4.     ?commune wdt:P131 ?departementDejaPresent . # les trucs qui ont un département d'indiqué comme localisation administrative
  5.     ?departementDejaPresent wdt:P31 wd:Q6465 .
  6.   }
  7.   SERVICE wikibase:label {
  8.     bd:serviceParam wikibase:language "fr" .
  9.   }
  10. }

21389 résultats

Là encore, pas de quoi se fouler.
Et enfin, les communes qui ne sont pas directement localisées administrativement dans un département, mais le sont récursivement.

  1. SELECT ?commune ?communeLabel ?departement ?departementLabel WHERE {
  2.   ?commune wdt:P31 wd:Q484170 . # les trucs qui sont des communes
  3.   MINUS { #mais qui ne sont pas dans un département
  4.     ?commune wdt:P131 ?departementDejaPresent.
  5.     ?departementDejaPresent wdt:P31 wd:Q6465 .
  6.   }
  7.   ?commune wdt:P131* ?departement . # mais qui sont un peu dans un département quand même
  8.   ?departement wdt:P31 wd:Q6465 .
  9.   SERVICE wikibase:label {
  10.     bd:serviceParam wikibase:language "fr" .
  11.   }
  12. }

21311 résultats

Un peu plus complexe, mais pas beaucoup.
Bon, c’est déjà pas mal. On a réduit de moitié la quantité de communes à explorer.

Reste que certaines de ces communes ont changé de canton, d’arrondissement, ou de département ! Et qu’il serait donc utile de vérifier qu’il n’y a pas de qualificateurs pour les relations intermédiaires ni pour les classes des entités intermédiaires. Here comes Big Momma :

  1. SELECT  ?commune ?canton ?arrondissement ?departement 
  2. WHERE {
  3.   ?commune p:P31 ?communeStatement . # les trucs qui sont potentiellement
  4.   ?communeStatement ps:P31 wd:Q484170 . # des trucs qui sont des communes
  5.   FILTER NOT EXISTS {
  6.     ?communeStatement ?communeStatementQualifier ?communeStatementValue . # mais alors vraiment des communes pur cru, sans qualificateur de leur statut de commune
  7.     ?communeStatementProperty wikibase:qualifier ?communeStatementQualifier .
  8.   }
  9.   MINUS {
  10.     ?commune wdt:P131 ?departementDejaPresent . # mais pas les trucs qui sont directement dans un département
  11.     ?departementDejaPresent wdt:P31 wd:Q6465 .
  12.   }
  13.  
  14.   {
  15.     ?commune p:P131 ?communeCantonStatement . 
  16.     ?communeCantonStatement ps:P131 ?canton . # qui sont dans un canton
  17.     ?canton wdt:P31 wd:Q184188 .
  18.     FILTER NOT EXISTS {
  19.       ?communeCantonStatement ?communeCantonStatementQualifier ?communeCantonStatementValue . # mais qui y sont pour de vrai
  20.       ?communeCantonStatementProperty wikibase:qualifier ?communeCantonStatementQualifier .
  21.     }
  22.  
  23.     ?canton p:P31 ?cantonExistsStatement . # un canton pur cru
  24.     ?cantonExistsStatement ps:P31 wd:Q184188 .
  25.     FILTER NOT EXISTS { # sans qualificateurs
  26.       ?cantonExistsStatement ?cantonExistsStatementQualifier ?cantonExistsStatementValue .
  27.       ?cantonExistsStatementProperty wikibase:qualifier ?cantonExistsStatementQualifier .
  28.     }
  29.  
  30.     ?canton p:P131 ?cantonDepartementStatement . # canton qui est dans un département
  31.     ?cantonDepartementStatement ps:P31 ?departement .
  32.     ?departement wdt:P31 wd:Q6465 .
  33.     FILTER NOT EXISTS { # mais qui y est pour de vrai
  34.       ?cantonDepartementStatement ?cantonDepartementStatementQualifier ?cantonDepartementStatementValue .
  35.       ?cantonDepartementStatementProperty wikibase:qualifier ?cantonDepartementStatementQualifier .
  36.     }
  37.   }
  38.   UNION # OU ALORS
  39.   {
  40.     ?commune p:P131 ?communeArrondissementStatement . # qui sont dans un arrondissement
  41.     ?communeArrondissementStatement ps:P131 ?arrondissement .
  42.     ?arrondissement wdt:P31 wd:Q194203 .
  43.     FILTER NOT EXISTS { # qui y sont pour de vrai
  44.       ?communeArrondissementStatement ?communeArrondissementStatementQualifier ?communeArrondissementStatementValue .
  45.       ?communeArrondissementStatementProperty wikibase:qualifier ?communeArrondissementStatementQualifier .
  46.     }
  47.  
  48.     ?arrondissement p:P31 ?arrondissementExistsStatement . # un arrondissement pur cru
  49.     ?arrondissementExistsStatement ps:P31 wd:Q194203 .
  50.     FILTER NOT EXISTS {
  51.       ?arrondissementExistsStatement ?arrondissementExistsStatementQualifier ?arrondissementExistsStatementValue .
  52.       ?arrondissementExistsStatementProperty wikibase:qualifier ?arrondissementExistsStatementQualifier .
  53.     }
  54.  
  55.     ?arrondissement p:P131 ?arrondissementDepartementStatement . # qui est dans un département
  56.     ?arrondissementDepartementStatement ps:P31 ?departement .
  57.     ?departement wdt:P31 wd:Q6465 .
  58.     FILTER NOT EXISTS { # mais qui y est pour de vrai
  59.       ?arrondissementDepartementStatement ?arrondissementDepartementQualifier ?arrondissementDepartementStatementValue .
  60.       ?arrondissementDepartementStatementProperty wikibase:qualifier ?arrondissementDepartementStatementQualifier .
  61.     }
  62.   }
  63.   UNION # OU ALORS
  64.   {
  65.     ?commune p:P131 ?communeCantonStatement . # qui sont dans un canton
  66.     ?communeCantonStatement ps:P131 ?canton .
  67.     ?canton wdt:P31 wd:Q184188 .
  68.     FILTER NOT EXISTS { # mais qui y sont pour de vrai
  69.       ?communeCantonStatement ?communeCantonStatementQualifier ?communeCantonStatementValue .
  70.       ?communeCantonStatementProperty wikibase:qualifier ?communeCantonStatementQualifier .
  71.     }
  72.  
  73.     ?canton p:P31 ?cantonExistsStatement . # un canton pur cru
  74.     ?cantonExistsStatement ps:P31 wd:Q184188 .
  75.     FILTER NOT EXISTS {
  76.       ?cantonExistsStatement ?cantonExistsStatementQualifier ?cantonExistsStatementValue .
  77.       ?cantonExistsStatementProperty wikibase:qualifier ?cantonExistsStatementQualifier .
  78.     }
  79.  
  80.     ?canton p:P131 ?cantonArrondissementStatement . # qui est dans un arrondissement
  81.     ?cantonArrondissementStatement ps:P131 ?arrondissement .
  82.     ?arrondissement wdt:P31 wd:Q194203 .
  83.     FILTER NOT EXISTS { # mais qui y est pour de vrai
  84.       ?cantonArrondissementStatement ?cantonArrondissementStatementQualifier ?cantonArrondissementStatementValue .
  85.       ?cantonArrondissementProperty wikibase:qualifier ?cantonArrondissementStatementQualifier .
  86.     }
  87.  
  88.     ?arrondissement p31 ?arrondissementExistsStatement . # un arrondissement pur cru
  89.     ?arrondissementExistsStatement ps:P31 wd:Q194203 .
  90.     FILTER NOT EXISTS {
  91.       ?arrondissementExistsStatement ?arrondissementExistsStatementQualifier ?arrondissementExistsStatementValue .
  92.       ?arrondissementExistsStatementProperty wikibase:qualifier ?arrondissementExistsStatementQualifier .
  93.     }
  94.  
  95.     ?arrondissement p:P131 ?arrondissementDepartementStatement . # qui est dans un département
  96.     ?arrondissementDepartementStatement ps:P131 ?departement .
  97.     ?departement wdt:P31 wd:Q6465 .
  98.     FILTER NOT EXISTS { #qui y est pour de vrai
  99.       ?arrondissementDepartementStatement ?arrondissementDepartementStatementQualifier ?arrondissementDepartementStatementValue .
  100.       ?arrondissementDepartementProperty wikibase:qualifier ?arrondissementDepartementStatementQualifier .
  101.     }
  102.   }
  103.   ?departement p:P31 ?departementExistsStatement . # dans tous les cas, un département pur cru !
  104.   ?departementExistsStatement ps:P31 wd:Q6465 .
  105.   FILTER NOT EXISTS {
  106.     ?departementExistsStatement ?departementExistsStatementQualifier ?departementExistsStatementValue .
  107.     ?departementExistsStatementProperty wikibase:qualifier ?departementExistsStatementQualifier .
  108.   }
  109. } ORDER BY ?departement ?commune

Ça pique les yeux, non ? Je ne sais pas si ça doit vous rassurer, mais si on veut être complet et précis, c’est amplement pire.
Mais déjà, si elle tournait, cette requête serait particulièrement utile !

Mais j’ai sans doute eu les yeux plus gros que le ventre. Essayons donc département par département et pour le seul cas commune > canton > arrondissement > département (sans doute le cas le plus fréquent), et sans nous préoccuper des qualificateurs pour les relations intermédiaires. Voici pour le Pas-de-Calais (Q12689).

  1. SELECT ?commune ?canton ?arrondissement
  2. WHERE {
  3.   ?commune p:P31 ?communeStatement .
  4.   ?communeStatement ps:P31 wd:Q484170 .
  5.   FILTER NOT EXISTS {
  6.     ?communeStatement ?communeStatementQualifier ?communeStatementValue .
  7.     ?communeStatementProperty wikibase:qualifier ?communeStatementQualifier .
  8.   }
  9.   MINUS {
  10.     ?commune wdt:P131 ?departementDejaPresent .
  11.     ?departementDejaPresent wdt:P31 wd:Q6465 .
  12.   }
  13.  
  14.   ?commune wdt:P131 ?canton .
  15.   ?canton wdt:P31 wd:Q184188 .
  16.  
  17.   ?canton p:P31 ?cantonExistsStatement .
  18.   ?cantonExistsStatement ps:P31 wd:Q184188 .
  19.   FILTER NOT EXISTS {
  20.     ?cantonExistsStatement ?cantonExistsStatementQualifier ?cantonExistsStatementValue .
  21.     ?cantonExistsStatementProperty wikibase:qualifier ?cantonExistsStatementQualifier .
  22.   }
  23.  
  24.   ?canton wdt:P131 ?arrondissement .
  25.   ?arrondissement wdt:P31 wd:Q194203 .
  26.  
  27.   ?arrondissement p:P31 ?arrondissementExistsStatement .
  28.   ?arrondissementExistsStatement ps:P31 wd:Q194203 .
  29.   FILTER NOT EXISTS {
  30.     ?arrondissementExistsStatement ?arrondissementExistsStatementQualifier ?arrondissementExistsStatementValue .
  31.     ?arrondissementExistsStatementProperty wikibase:qualifier ?arrondissementExistsStatementQualifier .
  32.   }
  33.  
  34.   ?arrondissement wdt:P131 wd:Q12689 .
  35. } ORDER BY ?commune

11 résultats

Pas mal, malgré les doublons causés par les multiples relations à divers niveaux. Enlevons-les donc, et profitons-en pour avoir les noms de ces communes :

  1. SELECT DISTINCT ?commune ?communeLabel
  2. WHERE {
  3.   ?commune p:P31 ?communeStatement .
  4.   ?communeStatement ps:P31 wd:Q484170 .
  5.   FILTER NOT EXISTS {
  6.     ?communeStatement ?communeStatementQualifier ?communeStatementValue .
  7.     ?communeStatementProperty wikibase:qualifier ?communeStatementQualifier .
  8.   }
  9.   MINUS {
  10.     ?commune wdt:P131 ?departementDejaPresent .
  11.     ?departementDejaPresent wdt:P31 wd:Q6465 .
  12.   }
  13.  
  14.   ?commune wdt:P131 ?canton .
  15.   ?canton wdt:P31 wd:Q184188 .
  16.  
  17.   ?canton p:P31 ?cantonExistsStatement .
  18.   ?cantonExistsStatement ps:P31 wd:Q184188 .
  19.   FILTER NOT EXISTS {
  20.     ?cantonExistsStatement ?cantonExistsStatementQualifier ?cantonExistsStatementValue .
  21.     ?cantonExistsStatementProperty wikibase:qualifier ?cantonExistsStatementQualifier .
  22.   }
  23.  
  24.   ?canton wdt:P131 ?arrondissement .
  25.   ?arrondissement wdt:P31 wd:Q194203 .
  26.  
  27.   ?arrondissement p:P31 ?arrondissementExistsStatement .
  28.   ?arrondissementExistsStatement ps:P31 wd:Q194203 .
  29.   FILTER NOT EXISTS {
  30.     ?arrondissementExistsStatement ?arrondissementExistsStatementQualifier ?arrondissementExistsStatementValue .
  31.     ?arrondissementExistsStatementProperty wikibase:qualifier ?arrondissementExistsStatementQualifier .
  32.   }
  33.  
  34.   ?arrondissement wdt:P131 wd:Q12689 .
  35.   SERVICE wikibase:label { bd:serviceParam wikibase:language "fr" . }
  36. } ORDER BY ?commune

9 résultats

Plus qu’à s’atteler à tous les autres départements, un par un. Soit :

  1. SELECT DISTINCT ?departement ?departementLabel
  2. WHERE {
  3.   ?departement p:P31 ?departementStatement .
  4.   ?departementStatement ps:P31 wd:Q6465 .
  5.   FILTER NOT EXISTS {
  6.     ?departementStatement ?departementStatementQualifier ?departementStatementValue .
  7.     ?departementStatementProperty wikibase:qualifier ?departementStatementQualifier .
  8.   }
  9.   SERVICE wikibase:label { bd:serviceParam wikibase:language "fr" . }
  10. } ORDER BY ?departementLabel

97 résultats, n’incluant pas les DOM

  • Ain : 3 communes
  • Aisne : 10 communes
  • Allier : 8 communes
  • Alpes-Maritimes : 2 communes
  • Alpes-de-Haute-Provence : 8 communes
  • Ardennes : 452 communes
  • Ardèche : 338 communes
  • Ariège : 330 communes
  • Aube : 427 communes
  • Aude : 433 communes
  • Aveyron : 277 communes
  • Bas-Rhin : 6 communes
  • Bouches-du-Rhône : 115 communes
  • Calvados : 141 communes
  • Cantal : 251 communes
  • Charente : 382 communes
  • Charente-Maritime : 450 communes
  • Cher : 289 communes
  • Corrèze : 281 communes
  • Corse-du-Sud : 123 communes
  • Creuse : 1 commune
  • Côte-d’Or : 691 communes
  • Côtes-d’Armor : 355 communes
  • Deux-Sèvres : 295 communes
  • Dordogne : 61 communes
  • Doubs : 99 communes
  • Drôme : 365 communes
  • Essonne : 8 communes
  • Eure : 165 communes
  • Eure-et-Loir : 387 communes
  • Finistère : 271 communes
  • Gard : 347 communes
  • Gers : 443 communes
  • Gironde : 534 communes
  • Haut-Rhin : 2 communes
  • Haute-Corse : 9 communes
  • Haute-Garonne : 54 communes
  • Haute-Loire : 247 communes
  • Haute-Marne : 6 communes
  • Haute-Savoie : 276 communes
  • Haute-Saône : 530 communes
  • Haute-Vienne : 197 communes
  • Hautes-Alpes : 5 communes
  • Hautes-Pyrénées : 4 communes
  • Hauts-de-Seine : 17 communes
  • Hérault : 8 communes
  • Ille-et-Vilaine : 8 communes
  • Indre : 241 communes
  • Indre-et-Loire : 276 communes
  • Isère : 512 communes
  • Jura : 484 communes
  • Landes : 282 communes
  • Loir-et-Cher : 279 communes
  • Loire : 1 commune
  • Loire-Atlantique : 4 communes
  • Loiret : 323 communes
  • Lot : 321 communes
  • Lot-et-Garonne : 318 communes
  • Lozère : 1 commune
  • Maine-et-Loire : 219 communes
  • Manche : 64 communes
  • Marne : 615 communes
  • Mayenne : 250 communes
  • Meurthe-et-Moselle : 2 communes
  • Meuse : 499 communes
  • Morbihan : 250 communes
  • Moselle : 2 communes
  • Nièvre : 310 communes
  • Nord : 612 communes
  • Oise : 688 communes
  • Orne : 8 communes
  • Pas-de-Calais : 9 communes
  • Puy-de-Dôme : 457 communes
  • Pyrénées-Atlantiques : 55 communes
  • Pyrénées-Orientales : 206 communes
  • Rhône : 6 communes
  • Sarthe : 360 communes
  • Savoie : 286 communes
  • Saône-et-Loire : 24 communes
  • Seine-Maritime : 707 communes
  • Seine-Saint-Denis : 3 communes
  • Seine-et-Marne : 31 communes
  • Somme : 780 communes
  • Tarn : 316 communes
  • Tarn-et-Garonne : 3 communes
  • Territoire de Belfort : 1 commune
  • Val-d’Oise : 10 communes
  • Val-de-Marne : 7 communes
  • Var : 152 communes
  • Vaucluse : 132 communes
  • Vendée : 261 communes
  • Vienne : 279 communes
  • Vosges : 10 communes
  • Yonne : 3 communes
  • Yvelines : 8 communes

Total : 20 379 communes traitées. C’est déjà pas mal, je trouve. Voyons voir combien cette méthode m’en a fait louper, du moins parmi les communes qui existent encore.

  1. SELECT ?item ?itemLabel ?localisationAdministrative ?localisationAdministrativeLabel WHERE {
  2.   ?item p:P31 ?communeStatement .
  3.   ?communeStatement ps:P31 wd:Q484170 .
  4.   FILTER NOT EXISTS {
  5.     ?communeStatement pq:P582 ?communeStatementQualifier .
  6.   }
  7.   MINUS {
  8.     ?item wdt:P131 ?sub0 .
  9.     ?sub0 wdt:P31 wd:Q6465 .
  10.   }
  11.   SERVICE wikibase:label {
  12.     bd:serviceParam wikibase:language "fr" .
  13.   }
  14. } ORDER BY ?itemLabel

471 résultats

En y regardant de plus près, il semble qu’elles utilisent les « nouveaux cantons » comme localisation administrative. Qu’à cela ne tienne.

  1. SELECT DISTINCT ?commune ?communeLabel ?departement ?departementLabel
  2. WHERE {
  3.   ?commune p:P31 ?communeStatement .
  4.   ?communeStatement ps:P31 wd:Q484170 .
  5.   MINUS {
  6.     ?commune wdt:P131 ?departementDejaPresent .
  7.     ?departementDejaPresent wdt:P31 wd:Q6465 .
  8.   }
  9.   ?commune wdt:P131 ?canton .
  10.   ?canton wdt:P31 wd:Q18524218 .
  11.  
  12.   {
  13.     ?canton wdt:P131 ?departement .
  14.   }
  15.   UNION 
  16.   {
  17.     ?canton wdt:P131 ?arrondissement .
  18.     ?arrondissement wdt:P31 wd:Q194203 .
  19.  
  20.     ?arrondissement wdt:P31 wd:Q194203 .
  21.     ?arrondissement wdt:P131 ?departement .
  22.   }
  23.  
  24.   ?departement wdt:P31 wd:Q6465 .
  25.   SERVICE wikibase:label { bd:serviceParam wikibase:language "fr" . }
  26. } ORDER BY ?departementLabel ?communeLabel

256 résultats

Le genre de trucs qu’on peut presque faire à la main. D’un autre côté, pourquoi s’embêter ? Quick Statements est là pour ça, non ? Plus qu’à récupérer le JSON et à le transformer en TSV.

<?php
 
$communes = \json_decode( \file_get_contents( __DIR__ . '/query.json' ), true );
 
foreach ( $communes as $commune ) {
    echo \str_replace( 'http://www.wikidata.org/entity/', '',  $commune['commune'] ) . "\tP131\t" .
            \str_replace( 'http://www.wikidata.org/entity/', '', $commune['departement'] ) . "\n";
}
 
echo "DONE !\n";

256 lignes de résultats, ça va, je tombe pas de ma chaise

Mais alors il reste quand même quelques communes à traiter, non ? Lesquelles ? Ne comptons pas les communes disparues, et profitons de la faible taille du jeu de données pour complexifier la requête en incluant les DOM dans les départements à exclure si indiqués.

  1. SELECT ?commune ?communeLabel ?communeStatementEnd WHERE {
  2.   ?commune p:P31 ?communeStatement .
  3.   ?communeStatement ps:P31 wd:Q484170 .
  4.   FILTER NOT EXISTS {
  5.     ?communeStatement pq:P582 ?communeStatementEnd .
  6.   }
  7.   MINUS {
  8.     ?commune wdt:P131 ?departementDejaPresent .
  9.     ?departementDejaPresent wdt:P31/wdt:P279* wd:Q6465 .
  10.   }
  11.   SERVICE wikibase:label {
  12.     bd:serviceParam wikibase:language "fr" .
  13.   }
  14. } ORDER BY ?communeLabel

299 résultats

Subsistent les communes placées dans des collectivités d’outre-mer – exemple de Alo à Wallis-et-Futuna -, celles placées directement dans leur arrondissement – Rouen -, et celles placées de manière privilégiée dans un canton, par opposition au(x) canton(s) dans le(s)quel(s) elles étaient avant le redécoupage cantonal de 2014 qui sont considérés dépréciés – Falaise. C’est un mésusage des rangs sur Wikidata : la seule dépréciation de l’ancien canton suffisait, ou à défaut un qualificateur pour cette relation.
Voyons pour les arrondissements :

  1. SELECT DISTINCT ?commune ?communeLabel ?departement ?departementLabel
  2. WHERE {
  3.   ?commune p:P31 ?communeStatement .
  4.   ?communeStatement ps:P31 wd:Q484170 .
  5.   FILTER NOT EXISTS {
  6.     ?communeStatement pq:P582 ?communeStatementEnd .
  7.   }
  8.   MINUS {
  9.     ?commune wdt:P131 ?departementDejaPresent .
  10.     ?departementDejaPresent wdt:P31 wd:Q6465 .
  11.   }
  12.   ?commune wdt:P131 ?arrondissement .
  13.   ?arrondissement wdt:P31 wd:Q194203 .
  14.  
  15.   ?arrondissement wdt:P131 ?departement .
  16.  
  17.   ?departement wdt:P31 wd:Q6465 .
  18.   SERVICE wikibase:label { bd:serviceParam wikibase:language "fr" . }
  19. } ORDER BY ?departementLabel ?communeLabel

18 résultats

Reste maintenant à rendre un rang acceptable aux cantons actuellement privilégiés des communes, et à donner aux communes disparues (par dissolution, fusion, dégradation au rang de « commune associée », etc) le département dans lequel elles se situaient.

Pour les cantons privilégiés, la requête est plus simple qu’il n’y paraît, wikibase:rank étant peu répandu et pourtant fonctionnel.

  1. SELECT ?commune ?communeLabel ?canton ?cantonLabel ?cantonStatement
  2. WHERE {
  3.   ?commune wdt:P31 wd:Q484170 .
  4.   ?commune p:P131 ?cantonStatement .
  5.   ?cantonStatement ps:P131 ?canton .
  6.   ?canton wdt:P31 ?cantonEntities .
  7.   VALUES ?cantonEntities { wd:Q18524218 wd:Q184188 } # anciens et nouveaux cantons, parce qu'une seule classe c'était trop simple et pratique
  8.   ?cantonStatement wikibase:rank wikibase:PreferredRank . # qui ont une déclaration pour P131 (localisation administrative) de rang privilégié 
  9.   SERVICE wikibase:label {
  10.     bd:serviceParam wikibase:language "en" .
  11.   }
  12. }

23 résultats

Ça va, y’en avait pas bien lourd.
Je crois bien qu’on a exploré tous les cas sauf un : les communes disparues. Vérifions.

  1. SELECT ?commune ?communeLabel ?communeStatementEnd WHERE {
  2.   ?commune p:P31 ?communeStatement .
  3.   ?communeStatement ps:P31 wd:Q484170 .
  4.  
  5.   MINUS {
  6.     ?commune wdt:P131 ?departementDejaPresent .
  7.     {
  8.       ?departementDejaPresent wdt:P31/wdt:P279* wd:Q6465 .
  9.     }
  10.     UNION
  11.     {
  12. 	  VALUES ?departementDejaPresent { wd:Q719487 wd:Q129003 } # "collectivités d'outre-mer", "terres australes et antarctiques françaises", respectivement
  13.     }
  14.  
  15.   }
  16.   OPTIONAL {
  17.     ?communeStatement pq:P582 ?communeStatementEnd .
  18.   }
  19.   SERVICE wikibase:label {
  20.     bd:serviceParam wikibase:language "fr" .
  21.   }
  22. } ORDER BY ?communeLabel

17 résultats

À cinq résultats près, des hameaux ou quartiers mal classifiés (Lesponne, Polangis, Rochebonne), une commune dont l’ancien canton est déprécié (je vous avais bien dit que ce n’était pas idéal) et le nouveau pas encore indiqué (Montlay-en-Auxois), et un nom d’usage d’une commune employé comme entité distincte de la commune elle-même (Montpezat-d’Agenais), c’est le cas !

Onze anciennes communes, dont une a cessé deux fois d’être une commune (La Neuvillette, deuxième information sûrement anecdotique à propos de Reims).

Voyons voir ce qu’on a oublié, comptant ce coup-ci les ROM/DOM/COM/TAAF comme départements.

  1. SELECT ?commune ?communeLabel ?departement ?departementLabel WHERE {
  2.   ?commune p:P31 ?communeStatement .
  3.   ?communeStatement ps:P31 wd:Q484170 .
  4.  
  5.   MINUS {
  6.     {
  7.       ?commune wdt:P131 ?departementDejaPresent .
  8.       ?departementDejaPresent wdt:P31 ?departementDejaPresentValues .
  9.       VALUES ?departementDejaPresentValues { wd:Q6465 wd:Q719487 wd:Q202216 } # departement COM DOM
  10.     }
  11.     UNION
  12.     {
  13.       ?commune wdt:P131 wd:Q129003 . # TAAF
  14.     }
  15.  
  16.   }
  17.  
  18.   ?commune wdt:P131* ?departement .
  19.   ?departement wdt:P31/wdt:P279* wd:Q6465 .
  20.  
  21.   FILTER NOT EXISTS {
  22.     ?communeStatement pq:P582 ?communeStatementEnd .
  23.   }
  24.   SERVICE wikibase:label {
  25.     bd:serviceParam wikibase:language "fr" .
  26.   }
  27. } ORDER BY ?departementLabel ?communeLabel

155 résultats

Je balaye discrètement sous le tapis les communes placées par mes soins à Sant-Pol de Mar (Q12534) au lieu de Haute-Garonne (Q12538) (les typos, c’est mal), faites comme si vous n’avez rien vu. Poursuivons.
On trouve désormais les communes qui n’étaient pas encore passées à la moulinette pour une raison que je ne peux discerner. Des bugs de Wikidata Query Service qui ne les avait pas listées précédemment ? Possible.
Parmi ce qui reste, on compte d’anciennes communes « localisées » dans une commune actuelle, des hameaux indiqués comme communes alors qu’ils ne l’ont jamais été, un nom d’usage d’une commune considéré comme une commune à part entière, et quelques bugs venant de WDQS, indiquant des communes déjà correctement localisées : je ne suis pas peu fier, je crois bien que j’ai fini – du moins, pour les communes existant encore. Je vous laisse traiter les communes disparues, si vous voulez vous amuser.

Vous pouvez aussi venir discuter du possible démêlage des cantons anciens et nouveaux, répartis dans deux classes au lieu d’être regroupés en une seule avec des qualificateurs sur le Bistro de Wikidata.

Sinon, vers le milieu, j’ai inséré les conditions d’utilisation d’iOS, mais mon post est un tel pavé que vous les avez sûrement loupées…

Remerciements :

  • shonagon pour l’étoile (et j’en ai profité pour apprendre que ça marche aussi avec le plus)
  • Ash_Crow pour le slash (et ça marche aussi avec l’étoile et le plus)
  • WikidataFacts pour les déclaration rejetées à l’arrache compte tenu de leurs qualificateurs, même si c’est plus propre avec wikibase:qualifier
  • Dereckson pour m’avoir lu grogner jusqu’à des heures avancées de la nuit
  • Magnus Manske pour wikidata useful, Quick Statements, etc…
  • Et si je vous ai oublié, ben faites signe

Leave a Reply

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre lang="" line="" escaped="" cssfile="">