抱歉,如果我的英语不好,但我真的没有任何地方可以用我的母语问这个问题。我一直在尝试为 Wikidata 创建 SPARQL 查询,该查询应该创建 1925-1950 年间创作的所有恐怖小说、作者姓名以及图片(如果有)的列表:
SELECT DISTINCT ?item ?itemLabel ?author ?name ?creation ?picture
WHERE
{
    ?item wdt:P136 wd:Q193606 . # book
    ?item wdt:P50 ?author .   # author
    ?item wdt:P577 ?creation .
    ?item wdt:P577 ?end .
  ?author rdfs:label ?name .    
  OPTIONAL{ ?item wdt:P18 ?picture }
  FILTER (?creation >= "1925-01-01T00:00:00Z"^^xsd:dateTime) .
  FILTER (?end <= "1950-12-31T23:59:59Z"^^xsd:dateTime) .
SERVICE wikibase:label
{ 
bd:serviceParam wikibase:language "en" .
} 
}
但是,由于某种原因,该查询在列表中放置了重复项。DISTINCT 没有多大作用。一段时间后,我发现原因是“?item rdfs:label ?name .”。如果删除此行,则不会列出重复项。但我需要这一行来在列表中显示作者姓名!有想法该怎么解决这个吗?
您不需要使用,?item rdfs:label ?name .因为您已经获得了项目标签,?itemLabel感谢SERVICE wikibase:label。
SELECT然后,您将获得具有ed 属性且可能有多个值的每个项目的重复结果:在这里,您正在SELECTing 作者 (P50),这将为具有多个作者的每个项目创建重复项。