维基数据查询重复

时间:2016-12-29 10:04:00

标签: sparql 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做得不多。过了一段时间,我发现原因是&#34;?item rdfs:label?name。&#34;。如果删除此行,则不会列出重复项。但我需要这一行在列表中显示作者姓名! 关于如何解决这个问题的任何想法?

3 个答案:

答案 0 :(得分:1)

您不需要使用?item rdfs:label ?name .,因为?itemLabel已将项目标签设为SERVICE wikibase:label,感谢SELECT

然后,您将获得具有SELECT ed属性并且可能具有多个值的每个项目的重复结果:此处,您是model.pop()作者(P50),这将为每个项目创建重复项与几位作者合作。

答案 1 :(得分:1)

查询实际上是为您提供不同的项目。问题是某些项目有多个rdfs:labels。您可以将项目视为示例:

SELECT *
WHERE
{
   wd:Q2882840 rdfs:label ?label

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

由于某些项目有多个rdfs:label谓词,因此它们会显示在不同的行中。

答案 2 :(得分:1)

You can aggregate your results according to the book title (the item's label) using the

group by

keyword. Thus, every result will be a group which will show up once, and other fields which have different values, will be aggregated using the separator (in this case, a comma).

The fixed query:

SELECT DISTINCT ?item ?itemLabel 
(group_concat(distinct ?author;separator=",") as ?author)
(group_concat(distinct ?name;separator=",") as ?name)
 (group_concat(distinct ?creation;separator=",") as ?creation)
 (group_concat(distinct ?picture;separator=",") as ?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" .
} 
}
group by ?item ?itemLabel