(Во-первых, приношу свои извинения, так как это откровенный кросс-пост. Я думал, что opendata.SE будет местом для этого, но там почти нет просмотров, и в целом сайт не очень активен, так что я полагаю Я должен попробовать это здесь, так как это связано с программированием.)
Я пытаюсь получить список крупных городов мира: их названия, население и расположение. Я нашел то, что выглядело как хороший запрос на Викиданные, немного изменив один из встроенных примеров запросов:
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 человек.
Что-то не так с моим запросом? Если нет, значит, что-то не так с данными, которые использует Викиданные. В любом случае, как я могу получить действительный набор данных с помощью API, который я могу запросить из скрипта Python? (У меня есть сценарий, все работает для этого, я просто не возвращаю достоверные данные.)
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)