首页 > 解决方案 > 为什么此 wikidata 查询不选择荷兰省份

问题描述

我正在尝试在 wikidata 中查询所有次国家行政单位的人口数量。如果我手动查找荷兰省或俄罗斯州或法国地区,则该信息似乎可用于大多数此类次国家地区。

我创建了以下查询:

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(adm 区域实体)而且要过滤 Q56061 的所有子类,查询应该是什么样子?为了限制输出,我最好只过滤比 Q6256(国家)低一个地理级别的 Q56061 的子类。可以这样做吗?

标签: sparqlwikidata

解决方案


?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 秒的执行时间,因此它不会成功。

要将输出限制为国家以下的一个地理级别,您可以使用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

推荐阅读