SPARQL-запрос не дает ожидаемых результатов - PullRequest
2 голосов
/ 04 мая 2019

Я использую этот запрос SPARQL для получения списка европейских стран:

SELECT ?item $itemLabel
    WHERE {
        ?item wdt:P31 wd:Q6256.
        #?item wdt:P30 wd:Q46
        #?item wdt:P361* wd:Q46.
        ?item wdt:P30|wdt:P361* wd:Q46.
        SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }
    }
    ORDER BY ASC($itemLabel)
  • Строка 3 ограничивает результаты экземплярами Q6256, т.е. странами.
  • Строка4 (в настоящее время закомментировано) ограничивает результаты элементами, которые находятся на континенте. Q46 (Европа).
  • Строка 5 (в настоящее время закомментирована) ограничивает результаты элементами, которые являются частью Европы или которые являются частьючто-то, что является частью Европы и т. д.
  • Строка 6 - это предложение OR, которое объединяет строки 4 и 5.

Я выполняю запрос с одной из строк 4-6 активен, а два других закомментированы.

Независимо от того, какой предикат активен, Австрия не является частью результатов (другие страны также отсутствуют).Однако, глядя на https://www.wikidata.org/wiki/Q40,, мы видим, что

  • Австрия является примером Q6256.
  • Континент Австрии (P30) - это Европа.
  • Австрия является частью Центральной Европы (Q27509), которая является частью Европы.

Что я делаю не так?

Вот соответствующий запрос .

1 Ответ

2 голосов
/ 05 мая 2019

Австрия фактически не объявлена ​​как экземпляр страны (Q6256).Он объявлен как пример суверенного государства (Q3624078), который является подклассом (P279) страны.Отношение экземпляра к стране, которое можно увидеть на странице Австрии, выведено и недоступно при запросе.

Чтобы исправить это, мы можем запросить элементы, которые являются экземплярами страны или ее подклассов:

?item wdt:P31/wdt:P279* wd:Q6256.

К сожалению, это также тянет в исторических странах, поэтому запросу потребуется дополнительная работа для их фильтрации (например, с FILTER NOT EXISTS { ... }).Также нужно SELECT DISTINCT.

...