我正在尝试列出所有国家。我在下面的查询中尝试了这个。它返回 166 个结果。但是,我认为世界上共有190多个国家,200个国家。但是,为什么它只返回166个国家/地区名称?
我在这里做错什么了吗?对于某些人来说,这是一个愚蠢的问题,但是我是SPARQL和wikidata的新手
# list all countries
SELECT ?country ?countryLabel
WHERE
{
?country wdt:P31 wd:Q6256 .
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
ORDER BY ASC(?countryLabel)
答案 0 :(得分:2)
正如@AKSW所指出的,正确返回所有国家的查询是:
SELECT ?country ?countryLabel
WHERE
{
?country p:P31/ps:P31 wd:Q6256 .
SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
}
ORDER BY ASC(?countryLabel)
与查询唯一的不同是行?country p:P31/ps:P31 wd:Q6256 .
该行中的斜杠(/
)是速记符号。该行可以扩展为:
?country p:P31 ?statement .
?statement ps:P31 wd:Q6256 .
第一行的意思是“作为语句主题的实体”
第二行的意思是“哪个表示某个国家/地区”
前缀p:
和ps:
是名称空间。 Wikidata的约定是将实体到语句的连接器保留在p
名称空间中,将语句到值的连接器保留在ps
名称空间中。必须将它们链接在一起以查询国家/地区列表。
这似乎很复杂。您只想找到国家;您不在乎关于个国家/地区的声明。因此,wdt:
前缀是针对像您这样的用例创建的。该命名空间应该为这些简单的是或否查询总结p:/ps:
链接。
但是有问题!引用the Wikidata SPARQL docs:
并非使用所有属性的
wdt:
表示形式来创建此类三元组,而是仅针对在该项目中具有该属性的最高等级并且不推荐使用的语句。尽管不能保证是真的,但它们旨在总结Wikidata当前对事实的最佳理解。
简而言之,wdt:
名称空间不完整,您发现了一些漏洞。无论出于何种原因,苏里南和俄罗斯等少数国家都被排除在该命名空间之外。
编辑:have something to do with似乎被分配为“国家”或“主权国家”。使用Q3624078
(而不是Q6256
)来控制您的查询。