Besoin d'aide pour des requêtes dans WikiData

a marqué ce sujet comme résolu.

Bonsoir,

Suite au tutoriel de @shevek, j’ai commencé à m’amuser un peu à lancer des requêtes dans wikidata.

J’ai notamment cherché à obtenir une liste des cimetières de France, triés par lieu. J’y suis parvenu sans trop de difficultés :

SELECT ?cimetière ?cimetièreLabel ?lieuLabel ?dptLabel
WHERE 
{
  ?cimetière wdt:P31 wd:Q39614.
  ?cimetière wdt:P17 wd:Q142.
  ?cimetière wdt:P131 ?lieu.
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],fr,en". }
}
ORDER BY ASC (?lieuLabel)

Je souhaiterais maintenant les trier par département, mais je n’y arrive pas. En effet, la propriété P131 renvoie un lieu qui est le plus souvent une commune. Or l’élément Commune de France (Q484170) ne possède pas de propriété qui renvoie directement à son département. Dois-je alors nécessairement passer par Arrondissement français (Q194203) pour obtenir le département ou y a-t-il une solution plus directe ?

Par ailleurs, pour Marseille ou Paris, la propriété P131 renvoie à l’arrondissement. Comment alors les différencier des autres puisqu’il faudra encore un "étage" supplémentaire ?

Merci de votre aide

+0 -0

Bonjour,

Pour récupérer les département il faut utiliser la propriété P131 des lieux et ne récupérer que les entités de type département (Q6465), mais ça pose des problèmes avec les données de certains arrondissement et de certaines commune qui ne sont pas liée à un département donc on ne récupère pas toutes les données des departement, je vois pas trop de moyen de corriger ça à part de modifier les directement les données.

Mettre la récupération du département dans une balise OPTIONAL permet de ne pas perdre de données et de récupérer les données non liées à un département (environ 150 sur 5000)

SELECT ?cimetière ?cimetièreLabel ?lieuLabel ?lieu ?dptLabel
WHERE 
{
  ?cimetière wdt:P31 wd:Q39614.
  ?cimetière wdt:P17 wd:Q142.
  ?cimetière wdt:P131 ?lieu.
  optional {
  ?lieu wdt:P131 ?dpt.
  ?dpt wdt:P31 wd:Q6465 }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],fr,en". }
}
ORDER BY ASC (?dpt)

Merci.

Ça marche impeccable.

Il me reste quelques questions :

  • est-il possible de mettre une condition du type "si l’élément est un arrondissement alors prendre le département correspondant à sa commune" ?

  • pour certains éléments, on obtient le département de la Seine. Pour Colombe, par exemple, c’était le département du 4 mars 1790 au 1er janvier 1968. C’est aujourd’hui les Hauts de Seine. Comment faire pour qu’il prenne le "bon" département, c’est-à-dire l’actuel. Il me semblait que par défaut c’est celui-ci qui aurait du être pris. Y a-t-il une manip à faire ?

Olivier

Pour ne récupérer que les départements existants actuellement, une des méthoded est de faire un FILTER NOT EXISTS sur la date de dissolution département.

SELECT ?cimetière ?cimetièreLabel ?lieuLabel ?lieu ?dptLabel
WHERE 
{
  ?cimetière wdt:P31 wd:Q39614.
  ?cimetière wdt:P17 wd:Q142.
  ?cimetière wdt:P131 ?lieu.
  optional {
  ?lieu wdt:P131 ?dpt .
  ?dpt wdt:P31 wd:Q6465.
  FILTER NOT EXISTS { ?dpt wdt:P576 ?dissolution } }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],fr,en". }
}
ORDER BY ASC (?dptLabel)

Pour faire un filtre "si l’élément est un arrondissement alors prendre le département correspondant à sa commune", une technique possible (la seul que je vois mais il en à peut-être d’autre) est d’utiliser des UNION permettant d’unifier les résultat de 2 requêtes avec un recherche à un niveau supplémentaire de P131 pour les arrondissement, il suffit ensuite de grouper les résultats avec un GROUP BY pour ne pas avoir 2 fois chaque résultat.

SELECT ?cimetière ?cimetièreLabel ?lieuLabel ?lieu ?dptLabel
WHERE 
{
  {
    ?cimetière wdt:P31 wd:Q39614.
    ?cimetière wdt:P17 wd:Q142.
    ?cimetière wdt:P131 ?lieu.
    ?lieu wdt:P131 ?dpt .
    ?dpt wdt:P31 wd:Q6465.
    FILTER NOT EXISTS { ?dpt wdt:P576 ?dissolution }
  } 
  UNION
  {
    ?cimetière wdt:P31 wd:Q39614.
    ?cimetière wdt:P17 wd:Q142.
    ?cimetière wdt:P131 ?lieu.
    ?lieu wdt:P131 ?lieu2 .
    ?lieu2 wdt:P131 ?dpt .
    ?dpt wdt:P31 wd:Q6465.
    FILTER NOT EXISTS { ?dpt wdt:P576 ?dissolution } 
  }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],fr,en". }
}
GROUP BY ?cimetière ?cimetièreLabel ?lieuLabel ?lieu ?dptLabel
ORDER BY ASC (?cimetière)

A noter qu’avec cette méthode on perd 6 cimetière dont ont arrive pas à récupérer le département.

Si ce n’est pas suffisamment clair, n’hésite pas à demander des infos plus détaillées.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte