SPARQL查询不会产生预期的结果

SPARQL查询不会产生预期的结果,sparql,wikidata,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 wikibas

我使用此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行的OR子句
我正在运行查询,其中一行4-6处于活动状态,另外两行已注释掉

无论哪个谓词是主动的,奥地利都不是结果的一部分(其他国家也没有)。但是从这个角度看,我们可以看到,

  • 奥地利就是Q6256的一个例子
  • 奥地利的大陆(第30页)是欧洲
  • 奥地利是中欧的一部分(Q27509),中欧是欧洲的一部分
我做错了什么


以下是。

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

要解决此问题,我们可以查询作为country或其子类实例的项目:

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

不幸的是,这也会引入历史国家,因此查询将需要一些额外的工作来过滤掉这些国家(例如,
过滤器不存在{…}
)。它还需要
选择DISTINCT

谢谢。你确定奥地利不是一个典型的国家(Q6256)?页面上有六个班级,奥地利是其中的一个例子。第一个是主权国家(Q3624078),最后一个是国家(Q6256)。我可以看到奥地利的主权国家成员资格具有“优先等级”,这可能是我在查询中找不到的原因吗?(“国家”只有“正常等级”)。如果查询第40季度的wdt:P31,则结果中不包含国家。您可能是对的,这是因为wdt:只返回具有首选秩的值。关于P30,您查询的“在欧洲”部分适用于奥地利;失败的是“是一个国家”部分,两个部分都必须成功才能将一个项目包括在结果中。最后,使用beyond truthy语句+一些筛选器,如
筛选器不存在{国家/地区p:P31/ps:P31 wd:Q3024240}
,或者检查是否有结束时间。除了荷兰之外,还有一个“问题”,荷兰王国也出现了,这似乎是因为两者都包括不同的地区,比如Carribeansame问题中的地区(基本上得到了相同的解释和解决方案):