(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)
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
@AKSW 250, nirgends in der Nähe eines vernünftigen Standardlimits. –