Получить идентификатор VIAF из элемента Викиданных

Некоторое время я экспериментировал с API Викиданных. Я знаю, как получить элемент (сущности) по имени и по их Q-номеру. но я не могу понять, как правильно определить их свойства. Я ищу P214 (идентификаторы viaf для авторов)

Например, я уже использую этот запрос, чтобы получить автора по его полному имени.

https://www.wikidata.org/w/api.php?action=wbsearchentities&search=Douglas%20Adams&language=en

возвращает массив имен страниц, связанных со страницами, на которых есть имя «Дуглас Адамс». но без свойств.

то я могу использовать список Q id для запроса свойств, например

https://www.wikidata.org/w/api.php?action=wbgetentities&ids=Q42&language=en 

свойство viaf и его значение для Q42 присутствуют. но это такой громоздкий подход, потому что я получаю список результатов из первого запроса, затем мне приходится перебирать их и запрашивать у каждого свойства для того, который я ищу.

tl; dr: есть ли более простой способ получить список свойств элемента по имени элемента?


person svarog    schedule 15.10.2015    source источник
comment
Это лишь немного упрощает задачу, но если вы знаете, какое свойство вам нужно, используйте wbgetclaims вместо wbgetentities. Например. wikidata.org/w/   -  person Ainali    schedule 15.10.2015
comment
Я уже пробовал это, вам нужно убедиться, что ваш Q содержит P214, чтобы ваш запрос работал. Поскольку мне нужно получить Q, а затем viafId по поиску по имени, мне нужно сначала проверить Q (или список Q, если результат такой добрый) даже есть P214, прежде чем продолжить.   -  person svarog    schedule 15.10.2015
comment
Вы не можете получить идентификатор VIAF из элемента, у которого нет P214. Таким образом, запрос будет работать для всех элементов, от которых вы хотите получить результаты, его не нужно проверять перед запросом значения. Пример: Q1 не имеет P214, поэтому нет идентификатора VIAF для получения. Запрос wikidata.org/w/ скажу вам это.   -  person Ainali    schedule 17.10.2015
comment
Я знаю, я возвращаю пустой массив / объект, если это не так.   -  person svarog    schedule 17.10.2015


Ответы (2)


Один из косвенных подходов, который может сработать, - это развернуть исчерпывающий список всех Q-элементов, содержащих P213 - там около миллиона, так что это будет несколько МБ - в начале сеанса, а затем для каждого поиска проверяйте, есть ли какие-либо результаты поиска в этом локальном списке. Если это так, сделайте следующий вызов API, чтобы просмотреть детали - а если нет, вам это не будет интересно, поэтому вы можете пропустить их.

Это не приведет к добавлению каких-либо элементов VIAF во время сеанса, но повседневные изменения относительно незначительны, поэтому это не должно быть серьезной проблемой.

person Andrew    schedule 19.10.2015
comment
К счастью, Викиданные предоставляют средства для дампов баз данных, так что это неплохое альтернативное решение. - person svarog; 21.10.2015

В конце концов я понял, как получить список свойств объекта по имени, используя wbgetentities действие. Я совершенно упустил из виду, что могу выполнять поиск по параметрам titles и sites, чтобы получить объект, а не просто искать его по его QID, используя то же действие.

то, что указывало мне на это решение, было следующим примером (скрытым внизу страницы):

api.php?action=wbgetentities&sites=enwiki&titles=Berlin&languages=en

небольшой недостаток в том, что я также должен указать параметр sites, но я могу смириться с этим

РЕДАКТИРОВАТЬ:

SPARQL API был именно тем, что мне было нужно все время !!!

PREFIX wikibase: <http://wikiba.se/ontology#>
PREFIX wd: <http://www.wikidata.org/entity/> 
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?viaf WHERE {
  wd:Q42 wdt:P214 ?viaf   
  SERVICE wikibase:label {
    bd:serviceParam wikibase:language "en" .
  }
}

теперь я получаю все P214 (viaf) для Q42 (adams), заменяя wd:Q42 символом простого объекта ?o, я получу все сущности со свойством VIAF ID и его значением.

person svarog    schedule 21.10.2015