SPARQL中的Group_concat

时间:2017-02-02 18:51:49

标签: sparql group-concat virtuoso

我是SPARQL的初学者,我正在尝试处理Spanish National Library的端点。

我有一个有效的代码,这里是:

prefix bne: <http://datos.bne.es/def/> # base URI for ontology documented at http://datos.bne.es/def/
prefix resource: <http://datos.bne.es/resource/> 
select distinct 
?book
?author
?title
?subtitle
?ISBN
?publisher
?date
?pags
?size
?series
?edition
?subjectLabel
where { 
?book a bne:C1003 .
?book bne:P3001 "Errata Naturae" .
?book bne:P1011 ?author .
?book bne:P3002 ?title .
OPTIONAL {  ?book bne:P3013 ?ISBN }
OPTIONAL {  ?book bne:P3001 ?publisher }
OPTIONAL {  ?book bne:P3006 ?date }
OPTIONAL {  ?book bne:P3004 ?pags }
OPTIONAL {  ?book bne:P3007 ?size }
OPTIONAL {  ?book bne:P3016 ?series }
OPTIONAL {  ?book bne:P1004 ?date }
OPTIONAL {  ?book bne:P3017 ?edition }
OPTIONAL {  ?book bne:P3014 ?subtitle }
OPTIONAL {  ?book bne:OP3008 ?subject }
?subject rdfs:label ?subjectLabel
}
limit 50

但是由于某些书籍有两个或更多主题,SPARQL会在结果中重复这些主题。我使用group_concat,但由于某种原因它不起作用:

prefix bne: <http://datos.bne.es/def/> # base URI for ontology documented at http://datos.bne.es/def/
prefix resource: <http://datos.bne.es/resource/> 
select distinct 
?book
?author
?title
?subtitle
?ISBN
?publisher
?date
?pags
?size
?series
?edition
(GROUP_CONCAT(DISTINCT(?subjectLabel); separator="//") as ?subjects)
where { 
?book a bne:C1003 .
?book bne:P3001 "Errata Naturae" .
?book bne:P1011 ?author .
?book bne:P3002 ?title .
OPTIONAL {  ?book bne:P3013 ?ISBN }
OPTIONAL {  ?book bne:P3001 ?publisher }
OPTIONAL {  ?book bne:P3006 ?date }
OPTIONAL {  ?book bne:P3004 ?pags }
OPTIONAL {  ?book bne:P3007 ?size }
OPTIONAL {  ?book bne:P3016 ?series }
OPTIONAL {  ?book bne:P1004 ?date }
OPTIONAL {  ?book bne:P3017 ?edition }
OPTIONAL {  ?book bne:P3014 ?subtitle }
OPTIONAL {  ?book bne:OP3008 ?subject }
?subject rdfs:label ?subjectLabel
}
limit 50
group by ?book
order by ?date

有人知道我在哪里弄错了吗?

谢谢!

编辑:

我做错了一件事:正如@AKSW所说,我必须在代码末尾对所有变量进行分组,或者在select上添加变量。我有一个简化版本的代码用于测试:

PREFIX  bne:  <http://datos.bne.es/def/>
PREFIX  resource: <http://datos.bne.es/resource/>

SELECT  ?book ?author ?title (GROUP_CONCAT(DISTINCT ?subject ; separator='//') AS ?subjects)
WHERE
  { ?book  a                     bne:C1003 ;
           bne:P3001             "Errata Naturae" ;
           bne:P1011             ?author ;
           bne:P3002             ?title ;
           bne:OP3008            ?subject
  }
#group everything here
GROUP BY ?book ?author ?title
@JeenBroekstra,当我在SPARQL Validator中运行它时,它说没关系,但是当我尝试在库的SPARQL endpoint中运行它时,它会给我一个错误:

Virtuoso 37000 Error SP030: SPARQL compiler, line 6: syntax error at 'GROUP_CONCAT' before '('

1 个答案:

答案 0 :(得分:0)

正如评论中所述,问题是target endpoint正在Virtuoso, Open Source Edition, v06.01.3127 as of 2011-11-16上运行,因为SPARQL尚未最终确定,所以它不支持SPARQL中的GROUP_CONCAT

强烈建议您升级到current version

此版本的Virtuoso中有一个内置功能,可以sql:group_concat, as documented的形式提供,现在可以为您提供服务。