很抱歉,如果我的英语不好,但我真的没有任何地方可以用我的母语提出这个问题。 我一直在尝试为维基数据创建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;。如果删除此行,则不会列出重复项。但我需要这一行在列表中显示作者姓名! 关于如何解决这个问题的任何想法?
答案 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