首页 > 解决方案 > SPARQL wikidata 返回较少的国家而不是全部

问题描述

我正在尝试列出所有国家/地区。我在下面的查询中尝试了这个。它返回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)

标签: sparqlwikidata

解决方案


正如@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 .
  • 第一行表示“作为陈述主题的实体”

  • 第 2 行的意思是“说明某事物是一个国家”

前缀p:ps:是命名空间。Wikidata 的约定是将实体到语句的连接器保留在p命名空间中,将语句到值的连接器保留在ps命名空间中。它们必须链接在一起才能查询国家列表。

这可能看起来很复杂。你只想找到国家;你不关心关于国家的陈述。因此,wdt:为像您这样的用例创建了前缀。这个命名空间应该总结p:/ps:这些简单的是或否查询的链接。

但是有问题!引用Wikidata SPARQL 文档

使用属性表示的此类三元组wdt:不是为所有语句创建的,而是仅针对该项目的属性具有最高等级且未被弃用的语句创建。虽然不能保证是真实的,但它们旨在总结 Wikidata 目前对真相的最佳理解。

简而言之,wdt:命名空间不完整,您发现了一些漏洞。无论出于何种原因,苏里南和俄罗斯等少数国家都被排除在该名称空间的声明之外。

编辑:这似乎被指定为“国家”或“主权国家”有关。使用Q3624078主权国家标识符,而不是Q6256修复您的查询。


推荐阅读