Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sparql Wikidata查询重复项_Sparql_Wikidata - Fatal编程技术网

Sparql Wikidata查询重复项

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 . #

对不起,如果我的英语不好,但我真的没有地方可以用我的母语问这个问题。 我一直在尝试为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" .
} 
}
选择不同的?项目?项目标签?作者?姓名?创建?图片
哪里
{
?项目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看到我下面的答案了吗