为啥这个 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 查询缺少这么多结果?的主要内容,如果未能解决你的问题,请参考以下文章
为啥当缺少连接字段之一时,HIVE 中的完全外部连接会给出奇怪的结果?