SPARQL查询未产生预期结果

时间:2019-05-04 20:41:14

标签: sparql wikidata

我正在使用此SPARQL查询来获取欧洲国家/地区列表:

SELECT ?item $itemLabel
    WHERE {
        ?item wdt:P31 wd:Q6256.
        #?item wdt:P30 wd:Q46
        #?item wdt:P361* wd:Q46.
        ?item wdt:P30|wdt:P361* wd:Q46.
        SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
    }
    ORDER BY ASC($itemLabel)
  • 第3行将结果限制为Q6256的实例,即国家/地区。
  • 第4行(当前已注释掉)将结果限制为Q46大陆(欧洲)上的项目。
  • 第5行(当前已注释掉)将结果限制为属于欧洲的商品或属于欧洲的商品的一部分,等等。
  • 第6行是将第4行和第5行结合起来的或子句。

我正在运行查询,第4-6行之一处于活动状态,另外两行已被注释掉。

无论哪个谓词活跃,奥地利都不是结果的一部分(其他国家也缺失)。但是,看看https://www.wikidata.org/wiki/Q40,我们可以看到

  • 奥地利是Q6256的一个实例。
  • 奥地利的大陆(P30)是欧洲。
  • 奥地利是欧洲的中欧(Q27509)的一部分。

我在做什么错了?

这里是relevant query

1 个答案:

答案 0 :(得分:2)

实际上未将奥地利声明为国家/地区的实例(Q6256)。它被声明为主权国家(Q3624078)的实例,主权国家是国家的子类(P279)。可以推断出在奥地利页面上可以看到的与国家的实例关系,查询时不可用。

要解决此问题,我们可以查询属于国家或其子类实例的项目:

?item wdt:P31/wdt:P279* wd:Q6256.

不幸的是,这也会拉入历史国家,因此查询将需要一些额外的工作来将其过滤掉(例如,使用FILTER NOT EXISTS { ... })。它还需要SELECT DISTINCT

相关问题