2016-05-31 13 views
3

(最初は、私がこのようなクロスポストであることを謝罪しました。私は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) 
+1

いくつの結果が得られますか?エンドポイントにデフォルトの制限がある可能性があります。たとえば、DBpediaの場合、多くの場合、10000個以上のエントリがあります.OFFを使用する必要があります。改ページ。 – AKSW

+0

@AKSW 250、妥当なデフォルト限度近くにはどこもありません。 –

答えて

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(seattle)が存在すると、述語wdt:P1082(population)はありません。

+0

興味深い。しかし、[San Francisco](https://m.wikidata.org/wiki/Q62)には人口データがあり、リンクはタグP1082で識別されているようです。 (実際には、そのリンクに従うと、サンフランシスコが例として使用されます!)なぜそれが表示されないのでしょうか?もちろん、 –

+0

...。なぜ私はそれを考えなかったのですか? \ * eyeroll \ * –

+0

さて、あなたは元のクエリ 'wdt:P279 *'にアスタリスクがあることに気付きました。サンフランシスコが市区町村であるという事実は問題ではないかもしれないと私は思う。このアスタリスクは、都市にサブクラスされるパスを持つものすべてを見つける必要があるためです。市の郡が持っている... – vds

関連する問題