Почему этот запрос в Викиданных не выбирает голландские провинции? - PullRequest
2 голосов
/ 23 февраля 2020

Я пытаюсь запросить вики-данные о численности населения всех административных единиц страны. Если я вручную найду провинцию Нидерландов, российскую область или район Франции, эта информация, по-видимому, будет доступна для большинства таких регионов страны.

Я создал следующий запрос:

SELECT ?land ?landLabel ?is_een ?is_eenLabel ?inwonertal WHERE {
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
  ?land wdt:P31 wd:Q56061.
  OPTIONAL { ?land wdt:P17 ?land. }
  OPTIONAL { ?land wdt:P31 ?is_een. }
  OPTIONAL { ?land wdt:P1082 ?inwonertal. }
}
limit 10000

, где Q56061 - это «административно-территориальное образование», P17 (земля = страна), P31 (is_een = is_a), P1082 (inwonertal = население)

Этот запрос возвращает только 4271 результат. Почему в запросе отсутствует, например, https://www.wikidata.org/wiki/Q694 (провинция Южная Голландия)? Может быть, потому что Q694 является экземпляром Q134390 (провинция Нидерландов), который является подклассом Q56061 (административно-территориальная единица)?

Как должен выглядеть запрос, чтобы фильтровать не только для Q56061 (административная единица территории) но также для всех подклассов Q56061? Чтобы ограничить выходной поток, я бы предпочел фильтровать только те подклассы Q56061, которые на один географический уровень c ниже Q6256 (страна). Можно ли это сделать?

1 Ответ

2 голосов
/ 24 февраля 2020

С помощью ?land wdt:P31 wd:Q56061 вы запрашиваете только экземпляры Q56061 ("административно-территориальная единица").

Большинство объектов, таких как https://www.wikidata.org/wiki/Q134390, являются экземплярами подкласса Q56061. Чтобы включить такие случаи, необходимо адаптировать запрос следующим образом: ?land wdt:P31/wdt:P279 wd:Q56061. (P279 - это свойство Wikidata для подклассов.)

Часто вы хотите включить подклассы подклассов (и любое количество уровней ниже). Этого можно достичь, написав ?land wdt:P31/wdt:P279* wd:Q56061. Тем не менее, для вашего примера это требует более 60 секунд времени выполнения и, таким образом, не может быть успешным.

Чтобы ограничить вывод энтуитами на один географический уровень c ниже страны, вы можете использовать https://www.wikidata.org/wiki/Q10864048 («административно-территориальное деление первого уровня»):

SELECT ?land ?landLabel ?is_een ?is_eenLabel ?inwonertal WHERE {
  SERVICE wikibase:label { bd:serviceParam wikibase:language "[AUTO_LANGUAGE],en". }
  ?land wdt:P31/wdt:P279* wd:Q10864048.
  OPTIONAL { ?land wdt:P17 ?land. }
  OPTIONAL { ?land wdt:P31 ?is_een. }
  OPTIONAL { ?land wdt:P1082 ?inwonertal. }
} limit 10000
...