如何从维基数据中检索雨果获奖者?

How to retrieve the Hugo winners from Wikidata?

我是 SPARQL 和维基数据的新手,正在尝试为雨果奖获得者检索以下内容:

我发现这出奇地困难。

我开始查询所有元组 link 以 link 类型 "won by" 获得最佳小说奖。

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

这有效,但是当我添加获胜者的标题 link 时,没有数据:

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

那是怎么生成的?我试图查询 属性 并返回 links 给人们(我认为):

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

对于谓词,您应该使用 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。我使用的是发布日期,而不是获奖日期。

更新:请参阅this answer

The point in time property of the award received is what Wikidata calls a qualifier.

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