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

时间:2016-05-31 13:35:00

标签: python geolocation sparql wikidata

(首先,我道歉,因为这是一个明显的交叉帖子。我认为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)

乍一看,结果似乎很好,但它缺少了许多重要城市。例如,当我特别要求所有人口超过500,000的城市时,旧金山(人口800,000+)和西雅图(人口650,000+)不在列表中。

我的查询有问题吗?如果没有,维基数据使用的数据肯定有问题。无论哪种方式,我如何获得一个有效的数据集,我可以从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)

1 个答案:

答案 0 :(得分:3)

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

如果您执行:

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

结果为零。实例wd:Q5083(西雅图)存在,它没有谓词{{​​1}}(人口)。