Как получить победителей Hugo из Викиданных?

Я новичок в SPARQL и Wikidata, и я пытаюсь получить следующее для победителей премии Hugo:

  • Название работы
  • Автор
  • Год Победы

Я нахожу это на удивление трудным.

Я начал с запроса всех кортежей, ссылающихся на награду за лучший роман, с типом ссылки «выиграл».

SELECT DISTINCT ?winner WHERE {
  # P166: Award Recieved By
  # Q103360: Hugo Award for Best Novel
  ?winner ps:P1346 wd:Q255032.

  SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}

Это работает, но когда я добавляю ссылку на заголовок от победителя, данных нет:

SELECT DISTINCT ?winner WHERE {
  ?winner ps:P1346 wd:Q255032.

  OPTIONAL {
    # P1476: Title
    ?winner wdt:P1476 ?title.
  }
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}

Что я делаю неправильно? Я пробовал разные пространства имен с небольшим пониманием и безрезультатно.

На странице победителей Hugo есть раздел победителей: https://www.wikidata.org/wiki/Q255032#P1346

Как это происходит? Я попытался запросить это свойство и получил обратные ссылки на людей (я думаю):

SELECT DISTINCT ?winner ?winnerLabel ?for WHERE {
  # P166: winner
  # Q103360: Hugo Award for Best Novel
  wd:Q255032 wdt:P1346 ?winner.

  SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }
}

person dysbulic    schedule 11.02.2017    source источник
comment
Ваш первый запрос ничего не возвращает! По крайней мере, для меня сейчас, когда я пробовал это на query.wikidata.org. Так почему же вы не используете wdt:P166 в качестве предиката?   -  person UninformedUser    schedule 11.02.2017
comment
И второй запрос также работает при использовании предиката wdt:P166. Но, чтобы вернуть поля, нужно, конечно, добавить их в часть SELECT, т.е. SELECT DISTINCT ?winner ?winnerLabel ?titleLabel   -  person UninformedUser    schedule 11.02.2017


Ответы (1)


Для предиката вы должны использовать wdt: вместо ps:

Пожалуйста, посмотрите этот пример:

SELECT DISTINCT ?item ?itemLabel ?AuthorLabel ?year WHERE {  
  ?item wdt:P166 wd:Q255032.
  ?item wdt:P50 ?Author .  
  ?item wdt:P577 ?year .
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }    
} 

PS. Я использовал дату публикации, а не дату победы.

ОБНОВЛЕНИЕ: см. этот ответ:

Свойство полученного вознаграждения на момент времени - это то, что Викиданные называют квалификатором.

И это запрос :

SELECT ?item ?itemLabel ?authorLabel ?publicationDate ?dateOfAwardReceived WHERE {
  ?item wdt:P50 ?author .  
  ?item wdt:P577 ?publicationDate .
  ?item p:P166 ?awardReceivedStatement .
  ?awardReceivedStatement ps:P166 wd:Q255032 .
  ?awardReceivedStatement pq:P585 ?dateOfAwardReceived .
  SERVICE wikibase:label { bd:serviceParam wikibase:language "en" }    
}
person Alexan    schedule 11.02.2017
comment
Мне действительно нужен год, когда была вручена награда. Это легко возможно? - person dysbulic; 11.02.2017
comment
@Will, посложнее, попробую - person Alexan; 11.02.2017
comment
Программа, над которой я работаю (github.com/dhappy/awards/blob/ master / test.rb) создает дерево символических ссылок вида / Award / Hugo / # {год} → / book / by / # {author} / # {title}. Я получаю 13 столкновений на протяжении многих лет. - person dysbulic; 11.02.2017
comment
@Will, легко получить прямые свойства, такие как Автор или год публикации, но год награды не является прямым, это награда получена - ›момент времени, я уверен, что это возможно получить, но пока не знаю, как это сделать. - person Alexan; 12.02.2017
comment
@Will, я задал этот вопрос: opendata.stackexchange .com / questions / 10638 /. - person Alexan; 12.02.2017
comment
Это действительно помогло. В итоге я получил: github.com/dbloppy/awards / У меня все еще четыре столкновения, но я почти уверен, что данные отсутствуют. - person dysbulic; 12.02.2017