SPARQL查询未产生预期结果 [英] SPARQL query does not yield expected results
本文介绍了SPARQL查询未产生预期结果的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我使用此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行中的一行处于活动状态,另外两行已被注释掉。
无论哪个谓词是活动的,奥地利都不是结果的一部分(其他国家也没有)。然而,查看https://www.wikidata.org/wiki/Q40,我们可以看到
- 奥地利是Q6256的一个实例。
- 奥地利的大陆(P30)是欧洲。
- 奥地利是中欧(Q27509)的一部分,中欧是欧洲的一部分。
我做错了什么?
推荐答案
奥地利实际上没有声明为Country的实例(Q6256)。它被声明为主权国家(Q3624078)的实例,主权国家是Country(P279)的子类。奥地利页面上可以看到的实例与国家的关系是推断的,查询时不可用。
要解决此问题,我们可以查询作为Country或其子类的实例的项目:
?item wdt:P31/wdt:P279* wd:Q6256.
不幸的是,这也拉入了历史国家/地区,因此查询需要一些额外的工作来过滤掉这些国家/地区(例如,使用FILTER NOT EXISTS { ... }
)。还需要SELECT DISTINCT
。
这篇关于SPARQL查询未产生预期结果的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文