(最初は、私がこのようなクロスポストであることを謝罪しました。私はopendata.SEがこれのための場所だと思っていましたが、そこにはほとんど何の意見もなく、一般的に非常にアクティブなサイトではないようです私はプログラミングに関連してここで試してみるべきだと思っています。)なぜこのSPARQLクエリには多くの結果がありませんか?
私は世界の主要都市のリストを取得しようとしています:名前、人口、場所。
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)
結果は、一見、良いように見えるが、それは重要な都市のトンを欠けている:私は少し彼らの組み込みのクエリ例の1つを微調整、Wikidataに良いクエリのように見えたものを見つけました。たとえば、サンフランシスコ(人口800,000人以上)とシアトル人口(人口65万人以上)はリストに含まれていません。人口が50万人を超えるすべての都市を具体的に質問しました。
質問には何か問題がありますか?そうでない場合は、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個以上のエントリがあります.OFFを使用する必要があります。改ページ。 – AKSW
@AKSW 250、妥当なデフォルト限度近くにはどこもありません。 –