2016-05-31 12 views
3

(Zunächst mal, ich entschuldige mich, da dies ein eklatanter Cross-Post ist. Ich dachte, opendata.SE wäre der richtige Ort dafür, aber es hat dort kaum Ansichten bekommen und es scheint im Allgemeinen keine sehr aktive Seite zu sein Ich denke, ich sollte es hier versuchen, da es Programm-bezogen ist.)Warum fehlen bei dieser SPARQL-Abfrage so viele Ergebnisse?

Ich versuche, eine Liste der wichtigsten Städte der Welt zu bekommen: ihren Namen, Bevölkerung und Standort. Ich fand, was wie eine gute Abfrage auf Wikidata sah, leicht eine ihrer integrierte Abfrage Beispiele Tweaking:

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) 

Die Ergebnisse, die auf den ersten Blick scheinen gut zu sein, aber es ist eine Tonne von wichtigen Städten fehlt. Zum Beispiel, San Francisco (Bevölkerung 800.000+) und Seattle (Bevölkerung 650.000+) sind nicht in der Liste, als ich speziell für alle Städte mit einer Bevölkerung von mehr als 500.000 fragte.

Ist etwas mit meiner Frage falsch? Wenn nicht, muss etwas mit den Daten, die Wikidata verwendet, nicht stimmen. Wie auch immer, wie bekomme ich einen gültigen Datensatz mit einer API, die ich von einem Python-Skript abfragen kann? (Ich habe das Skript alle arbeiten dafür; Ich bin nur nicht wieder gültige Daten.)

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

Wie viele Ergebnisse erhalten Sie? Es kann sein, dass der Endpunkt eine Standardgrenze hat - zum Beispiel bei DBpedia erhalten Sie höchstens 10000 Einträge, für mehr müssen Sie OFFSET + LIMIT aka verwenden. Seitennummerierung. – AKSW

+0

@AKSW 250, nirgends in der Nähe eines vernünftigen Standardlimits. –

Antwort

3

Die Bevölkerung von Seattle ist einfach nicht in dieser Datenbank.

Wenn Sie ausführen:

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

Sie erhalten Null Ergebnisse. Die Instanz wd:Q5083 (Seattle) existiert ebenfalls, sie hat kein Prädikat wdt:P1082 (Grundgesamtheit).

+0

Interessant. Es scheint, dass [San Francisco] (https://m.wikidata.org/wiki/Q62) jedoch Bevölkerungsdaten hat, und die Verbindung wird mit dem Tag P1082 identifiziert. (In der Tat, wenn Sie diesem Link folgen, wird San Francisco als Beispiel verwendet!) Irgendeine Idee, warum es nicht auftaucht, dann? –

+0

... natürlich. Warum habe ich nicht daran gedacht? \ * eyeroll \ * –

+0

Nun, ich habe festgestellt, dass in der ursprünglichen Abfrage 'wdt: P279 *' ein Sternchen steht. Was mich denken lässt, dass die Tatsache, dass San Francisco eine Stadt ist, nicht das Problem ist. Denn dieses Sternchen sollte alles finden, was einen Pfad nach Unterklasse zu Stadt hat. Welche Stadt hat ... – vds