Sparql Wikidata查询重复项
对不起,如果我的英语不好,但我真的没有地方可以用我的母语问这个问题。 我一直在尝试为Wikidata创建SPARQL查询,该查询应创建1925-1950年创作的所有恐怖小说、作者姓名以及图片(如果可用)的列表:Sparql Wikidata查询重复项,sparql,wikidata,Sparql,Wikidata,对不起,如果我的英语不好,但我真的没有地方可以用我的母语问这个问题。 我一直在尝试为Wikidata创建SPARQL查询,该查询应创建1925-1950年创作的所有恐怖小说、作者姓名以及图片(如果可用)的列表: SELECT DISTINCT ?item ?itemLabel ?author ?name ?creation ?picture WHERE { ?item wdt:P136 wd:Q193606 . # book ?item wdt:P50 ?author . #
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" .
}
}
选择不同的?项目?项目标签?作者?姓名?创建?图片
哪里
{
?项目wdt:P136 wd:Q193606.#书籍
?项目wdt:P50?作者#作者
?项目wdt:P577?创建。
?项目wdt:P577?结束。
?作者rdfs:标签?名称。
可选{项目wdt:P18?图片}
过滤器(?创建>=“1925-01-01T00:00:00Z”^^xsd:dateTime)。
过滤器(?end您不需要使用?项目rdfs:标签?名称。
因为您已经将项目标签设置为?项目标签
感谢服务wikibase:标签
然后,对于每个具有SELECT
ed属性且可能有多个值的项目,您将获得重复的结果:这里,您是SELECT
ing作者(P50),这将为具有多个作者的每个项目创建重复项。该查询实际上为您提供了不同的项目。问题是某些项目具有多个rdfs:标签。您可以看到以下项目作为示例:
SELECT *
WHERE
{
wd:Q2882840 rdfs:label ?label
SERVICE wikibase:label
{
bd:serviceParam wikibase:language "en" .
}
}
由于某些项目有多个rdfs:label谓词,它们显示在单独的行中。您可以使用
分组
关键词。
因此,每个结果都是一个组,只显示一次,其他具有不同值的字段将使用分隔符(在本例中为逗号)进行聚合
固定查询:
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
选择不同的?项目?项目标签
(组_concat(不同的作者;分隔符=“,”)作为作者)
(组名称(不同的名称;分隔符=“,”)作为名称)
(组_concat(不同的创建;分隔符=“,”)作为创建)
(组_concat(不同的图片;分隔符=“,”)作为图片)
哪里
{
?项目wdt:P136 wd:Q193606.#书籍
?项目wdt:P50?作者#作者
?项目wdt:P577?创建。
?项目wdt:P577?结束。
?作者rdfs:标签?名称。
可选{项目wdt:P18?图片}
过滤器(?创建>=“1925-01-01T00:00:00Z”^^xsd:dateTime)。
滤器(?end呃哦,我的错误。这一行应该是?author rdfs:label?name.
没有它,我就没有作者的名字,我只得到一个链接。我该怎么做才能使它正常工作?然后你只需要选择?authorLabel,我猜它也行了!很简单,但我不认为我自己能解决这个问题。比非常感谢!关于标签服务的更多信息:因此,我想,没有办法使此查询正常工作?如果有多个标签,您将返回多行-SPARQL的语义就是这样定义的。您可以I)限制标签的数量,或者ii)使用GROUP\u CONCAT
将所有标签组合成一个值。我尝试了{select*where{?author rdfs:label?name.}LIMIT 1}
而不是行?author rdfs:label?name
,但它似乎不起作用(返回没有结果);不确定原因。通过google找到了一些使用GROUP_CONCAT
的示例,但它对我的查询不起作用,说“聚合错误”.限制的想法实际上听起来不错。如果它能起作用,叹气。@Dash看到我下面的答案了吗