为啥这个 SPARQL 查询缺少这么多结果?

Posted

技术标签:

【中文标题】为啥这个 SPARQL 查询缺少这么多结果?【英文标题】:Why is this SPARQL query missing so many results?为什么这个 SPARQL 查询缺少这么多结果? 【发布时间】:2016-05-31 13:35:00 【问题描述】:

(首先,我很抱歉,因为这是一个公然的交叉帖子。我认为 opendata.SE 会是这个地方,但那里几乎没有任何意见,而且它似乎不是一个非常活跃的网站,所以我想我应该在这里尝试一下,因为它与编程相关。)

我正在尝试获取世界主要城市的列表:它们的名称、人口和位置。我在Wikidata 上发现了一个看起来不错的查询,稍微调整了他们的一个内置查询示例:

SELECT DISTINCT ?cityLabel ?population ?gps WHERE 
  ?city (wdt:P31/wdt:P279*) wd:Q515.
  ?city wdt:P1082 ?population.
  ?city wdt:P625 ?gps.
  FILTER (?population >= 500000) .
  SERVICE wikibase:label  bd:serviceParam wikibase:language "en". 

ORDER BY DESC(?population)

乍一看,结果似乎不错,但它缺少大量重要城市。例如,旧金山(人口 800,000+)和西雅图(人口 650,000+)不在列表中,当时我专门询问了所有人口超过 500,000 的城市。

我的查询有问题吗?如果不是,那么 Wikidata 使用的数据一定有问题。无论哪种方式,如何使用可以从 Python 脚本查询的 API 获得有效的数据集? (我的脚本都在为此工作;我只是没有取回有效数据。)

from SPARQLWrapper import SPARQLWrapper, JSON
from geopy.distance import great_circle

def parseCoords(gps):
    base = gps[6:-1]
    coords=base.split()
    return (float(coords[1]), float(coords[0]))

sparql = SPARQLWrapper("https://query.wikidata.org/sparql")
sparql.setReturnFormat(JSON)
sparql.setQuery("""SELECT DISTINCT ?cityLabel ?population ?gps WHERE 
  ?city (wdt:P31/wdt:P279*) wd:Q515.
  ?city wdt:P1082 ?population.
  ?city wdt:P625 ?gps.
  FILTER (?population >= 500000) .
  SERVICE wikibase:label  bd:serviceParam wikibase:language "en". 

ORDER BY DESC(?population)""")
queryResults = sparql.query().convert()
cities = [(city["cityLabel"]["value"], int(city["population"]["value"]), parseCoords(city["gps"]["value"])) for city in queryResults["results"]["bindings"]]
print (cities)

【问题讨论】:

你得到了多少结果?可能是端点有一个默认限制 - 例如在 DBpedia 上,您最多可以获得 10000 个条目,更多您必须使用 OFFSET + LIMIT aka。分页。 @AKSW 250,远不及任何合理的默认限制。 【参考方案1】:

西雅图的人口根本不在这个数据库中。

如果你执行:

#Largest cities of the world
#defaultView:BubbleChart
SELECT * WHERE 
 wd:Q5083 wdt:P1082 ?population.
  SERVICE wikibase:label  bd:serviceParam wikibase:language "en". 

你得到零结果。尽管实例 wd:Q5083(seattle) 存在,但它没有谓词 wdt:P1082(population)。

【讨论】:

有趣。不过,San Francisco 似乎确实有人口数据,并且链接用标签 P1082 标识。 (事实上​​,如果您点击该链接,就会以旧金山为例!)知道为什么它没有出现吗? ...当然。为什么我没有想到呢? *眼珠* 好吧,我注意到您的原始查询 wdt:P279* 中有一个星号。这让我觉得旧金山是一个市县这一事实可能不是问题所在。因为这个星号应该找到所有通过 subclassof 到 city 的路径。哪个市县有...

以上是关于为啥这个 SPARQL 查询缺少这么多结果?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 SPARQL 查询超时以及如何优化这个查询?

std::any - 为啥它缺少这么多运算符?

为啥“缺少右括号”错误?

为啥当缺少连接字段之一时,HIVE 中的完全外部连接会给出奇怪的结果?

为啥在 iPad 中由于缺少内存而在下载和解包结果后将 AssetBundle 加载到内存中?

为啥通过 jQuery Ajax 将 Plaid 链接结果发布到 ASP.NET MVC 控制器时缺少属性数据?