Самый простой способ узнать, существует ли имя в Викиданных? - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь создать самый простой запрос, чтобы проверить, существует ли имя в Викиданных. Например, я просто хочу увидеть, есть ли в Викиданных общее имя «Джек Смит».

Следуя примеру запроса в этом ответе StackOverflow , я создал следующий запрос SPARQL ( запустить его ):

SELECT distinct ?item ?itemLabel ?itemDescription WHERE{  
  ?item ?label "Jack Smith" .  
  ?article schema:about ?item .
  ?article schema:inLanguage "en" .
  ?article schema:isPartOf <https://en.wikipedia.org/>. 
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en". }    
} LIMIT 10

Однако он возвращает ноль результатов.

С другой стороны, если я ищу «Джек Смит» через Викиданные поиск по веб-странице , я возвращаюсь 1200 + результаты с множеством людей по имени «Джек Смит».

Непоследовательное поведение интерфейса SPARQL. Когда я выполняю поиск в SPARQL по запросу «Авраам Линкольн» ( запускаю ), я правильно получаю запись об американском президенте с таким именем.

Мои конкретные c вопросы:

  1. Почему мой запрос SPARQL возвращает нулевые результаты для «Джека Смита»?
  2. Какой самый простой вызов API для проверки наличия имени (например, Джек Смит) в Викиданных? Это может быть SPARQL или какой-нибудь другой REST API.

Спасибо.

1 Ответ

3 голосов
/ 28 мая 2020

Запрос возвращает нулевые результаты, потому что нет Джека Смита, о котором есть статья на английском языке sh и который является частью Wikipedia.org.

Каждая строка в теле запроса SPARQL является способ ограничить поиск в отличие от простого способа добавления новых переменных.

Посмотрите на этот запрос:

SELECT ?person ?dateOfDeath
WHERE {
?person a :Person .
?person :date_of_death ?dateOfDeath .
}

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

SELECT ?person ?dateOfDeath
WHERE {
    ?person a :Person .
   OPTIONAL {?person :date_of_death ?dateOfDeath }
    }

Что касается вашего второго вопроса, я бы попробовал что-то вроде этого:

SELECT ?boolean
WHERE{
BIND(EXISTS{?item ?label "Jack Smith"} AS ?boolean)
  }

Это, конечно, также может быть выполнено, например, как запрос cURL:

curl https://query.wikidata.org/bigdata/namespace/wdq/sparql -X POST --data 'query=SELECT%20%3Fboolean%0AWHERE%7B%0ABIND%28EXISTS%7B%3Fitem%20%3Flabel%20%22Jack%20Smith%22%7D%20AS%20%3Fboolean%29%0A%20%20%7D'
...