我使用此 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 行是一个 OR 子句,组合了第 4 行和第 5 行。
我正在运行查询,其中第 4-6 行之一处于活动状态,另外两行被注释掉。
无论哪个谓词处于活动状态,奥地利都不属于结果的一部分(其他国家也缺失)。然而,看着https://www.wikidata.org/wiki/Q40 https://www.wikidata.org/wiki/Q40,我们可以看到
- 奥地利是 Q6256 的一个实例。
- 奥地利的大陆(P30)是欧洲。
- 奥地利是中欧 (Q27509) 的一部分,中欧是欧洲的一部分。
我究竟做错了什么?
这是相关查询 https://query.wikidata.org/#SELECT%20%3Fitem%20%24itemLabel%0A%20%20%20%20WHERE%20%7B%0A%20%20%20%20%20%20%20%20%3Fitem%20wdt%3AP31%20wd%3AQ6256.%0A%20%20%20%20%20%20%20%20%3Fitem%20wdt%3AP30%7Cwdt%3AP361%2A%20wd%3AQ46.%0A%20%20%20%20%20%20%20%20%23%3Fitem%20wdt%3AP30%20wd%3AQ46%0A%20%20%20%20%20%20%20%20%23%3Fitem%20wdt%3AP361%2A%20wd%3AQ46.%0A%20%20%20%20%20%20%20%20SERVICE%20wikibase%3Alabel%20%7B%20bd%3AserviceParam%20wikibase%3Alanguage%20%22en%22.%20%7D%0A%20%20%20%20%7D%0A%20%20%20%20ORDER%20BY%20ASC%28%24itemLabel%29%0A.
奥地利实际上并未被声明为国家实例(Q6256)。它被声明为主权国家(Q3624078)的实例,它是国家的子类(P279)。奥地利页面上可以看到的与国家的实例关系是推断出来的,查询时不可用。
为了解决这个问题,我们可以查询作为国家或其子类实例的项目:
?item wdt:P31/wdt:P279* wd:Q6256.
不幸的是,这也会拉入历史国家,因此查询将需要一些额外的工作来过滤掉这些国家(例如,使用FILTER NOT EXISTS { ... }
)。还需要SELECT DISTINCT
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)