2015-10-15 5 views
1

Я некоторое время играл с API Wikidata. Я знаю, как получить предмет (сущности) по имени и по их номеру Q. но я не могу понять, как правильно их использовать. То, что я ищу является P214 (VIAF идентификаторы для авторов)Получить идентификатор VIAF из файла Wikidata.

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

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

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

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

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

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

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

+0

Это делает его немного проще, но если вы знаете, какое свойство вы хотите, используйте wbgetclaims вместо wbgetentities. Например. https://www.wikidata.org/w/api.php?action=wbgetclaims&format=json&entity=Q42&property=P214 – Ainali

+0

Я уже пробовал это, вам нужно будет убедиться, что ваш Q содержит P214, чтобы ваш запрос работал. Поскольку мне нужно получить 'Q', а затем' viafId' по поиску по имени, мне нужно сначала проверить Q (или список Q, если результат такой добрый), даже перед тем как продолжить P214. – svarog

+0

Вы не можете получить идентификатор VIAF из элемента, у которого нет P214. Таким образом, запрос будет работать для всех элементов, которые вы заинтересованы в получении результатов, он не нуждается в проверке перед запросом на значение. Пример: Q1 не имеет P214, поэтому нет идентификатора VIAF для получения. Запрос https://www.wikidata.org/w/api.php?action=wbgetclaims&format=json&entity=Q1&property=P214 скажет вам об этом. – Ainali

ответ

0

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

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

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

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

EDIT:

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 (Адамса), заменив wd:Q42 с простым символом объекта ?o, получите мне все объекты, обладающие свойством VIAF ID и это значение.

1

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

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

+0

К счастью, Wikidata предоставляет средства для [дампов базы данных] (https://www.wikidata.org/wiki/Wikidata:Database_download), так что это неплохое альтернативное решение. – svarog