2017-02-11 8 views
1

Я новичок в SPARQL и викиданные, и я пытаюсь получить следующее за Hugo Award Winners:Как получить победителей Хьюго из Викидаты?

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

Я в поиске это удивительно сложно.

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

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" } 
} 

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

На странице для победителей Гюго, есть раздел победителей: 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" } 
} 
+0

Ваш первый запрос делает ** не ** ничего возвращать! По крайней мере, не для меня, когда я попробовал это на https://query.wikidata.org. Так почему вы не используете 'wdt: P166' в качестве предиката? – AKSW

+0

И второй запрос также работает, когда вы используете предикат 'wdt: P166'. Но, чтобы вернуть поля обратно, нужно добавить их в часть SELECT, т. Е. Победитель SELECT DISTINCT? WinnerLabel? TitleLabel' – AKSW

ответ

2

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

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

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. Я использовал публикацию, а не дату победы.

UPDATE: Пожалуйста, смотрите this answer:

Момент времени собственности награды получили то, что викиданные называет классификатор.

И this is query:

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" }  
} 
+0

Мне действительно нужен год награды. Это легко возможно? – Will

+1

@ Будем немного сложнее, я попробую – Alexan

+0

Программа, над которой я работаю (https://github.com/dhappy/awards/blob/master/test.rb), создает дерево символических ссылок форму/награду/Hugo/# {year} →/book/by/# {author}/# {title}. В настоящее время я получаю 13 столкновений в течение многих лет. – Will