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