sparql - 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)
解决方案
正如@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
修复您的查询。
推荐阅读
- java - 春季启动war文件无法在tomcat上启动
- bash - 在命令调用后使用别名
- python-3.x - 错误:list.remove(x):x 不在列表中,我不明白为什么
- python - 在python中读取avro文件时出现异常
- spring-boot - 如何在春季云流kafka中存储发送到主题的失败数据
- node.js - 从 NodeJS 到 PostgreSQL DB 的查询不能正确显示 UTF8 字符
- php - 如何从faker获得独特的价值?
- tensorflow - 使用 Keras Tuner 进行时间序列拆分
- javascript - Javascript - 使用正则表达式在字符串中查找多次出现的模式
- r - 如何使用 e_charts() 在同一图表中组合条形图和折线图?