SPARQL 查询未产生预期结果
SPARQL query does not yield expected results
我正在使用此 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,我们可以看到
- 奥地利是 Q6256 的一个实例。
- 奥地利的大陆 (P30) 是欧洲。
- 奥地利是中欧 (Q27509) 的一部分,而中欧是欧洲的一部分。
我做错了什么?
奥地利实际上并未声明为国家 (Q6256) 的实例。它被声明为主权国家(Q3624078)的一个实例,它是国家的一个子类(P279)。可以在奥地利页面上看到的与国家的实例关系是推断的,并且在查询时不可用。
要解决此问题,我们可以查询属于国家或其子类实例的项目:
?item wdt:P31/wdt:P279* wd:Q6256.
不幸的是,这也会拉入历史国家,因此查询将需要一些额外的工作来过滤掉那些国家(例如,使用 FILTER NOT EXISTS { ... }
)。它还需要 SELECT DISTINCT
.
我正在使用此 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,我们可以看到
- 奥地利是 Q6256 的一个实例。
- 奥地利的大陆 (P30) 是欧洲。
- 奥地利是中欧 (Q27509) 的一部分,而中欧是欧洲的一部分。
我做错了什么?
奥地利实际上并未声明为国家 (Q6256) 的实例。它被声明为主权国家(Q3624078)的一个实例,它是国家的一个子类(P279)。可以在奥地利页面上看到的与国家的实例关系是推断的,并且在查询时不可用。
要解决此问题,我们可以查询属于国家或其子类实例的项目:
?item wdt:P31/wdt:P279* wd:Q6256.
不幸的是,这也会拉入历史国家,因此查询将需要一些额外的工作来过滤掉那些国家(例如,使用 FILTER NOT EXISTS { ... }
)。它还需要 SELECT DISTINCT
.