Почему в этом запросе SPARQL отсутствует так много результатов?

(Во-первых, приношу свои извинения, так как это откровенный кросс-пост. Я думал, что 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)

person Mason Wheeler    schedule 31.05.2016    source источник
comment
Сколько результатов вы получаете? Может случиться так, что конечная точка имеет ограничение по умолчанию - например, в DBpedia вы получаете не более 10000 записей, для большего количества вы должны использовать OFFSET + LIMIT aka. нумерация страниц.   -  person UninformedUser    schedule 31.05.2016
comment
@AKSW 250, далеко не разумный предел по умолчанию.   -  person Mason Wheeler    schedule 31.05.2016


Ответы (1)


Населения Сиэтла просто нет в этой базе данных.

Если вы выполните:

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

Вы получаете нулевой результат. Хотя экземпляр wd:Q5083(сиэтл) существует, у него нет предиката wdt:P1082(население).

person vds    schedule 31.05.2016
comment
Интересный. Похоже, что в Сан-Франциско есть данные о населении, и ссылка обозначена тегом Р1082. (На самом деле, если вы перейдете по этой ссылке, в качестве примера будет использован Сан-Франциско!) Тогда есть идеи, почему он не отображается? - person Mason Wheeler; 31.05.2016
comment
...конечно. Почему я не подумал об этом? * закатывает глаза * - person Mason Wheeler; 31.05.2016
comment
Ну, я заметил, что в вашем исходном запросе есть звездочка wdt:P279*. Это наводит меня на мысль, что, возможно, проблема не в том, что Сан-Франциско является городом-округом. Потому что этот астериск должен найти все, что имеет путь по сабклассу к городу. Какой город-уезд имеет... - person vds; 31.05.2016