在ISQL中使用时,某些SPARQL命令不起作用

use*_*018 0 sparql virtuoso

我已经安装了本地的virtuoso服务器并导入了dbpedia数据.我发现了一系列在isql中不起作用的SPARQL命令.例如,我在我的isql shell中运行了这个查询.

SPARQL SELECT ?s  GROUP_CONCAT (?obj, ' ') as ?artist_list WHERE { ?s a dbpedia-owl:Single ;(dbpedia-owl:artist|dbpedia-owl:producer)  ?obj    } limit 10
Run Code Online (Sandbox Code Playgroud)

它首先抱怨| 在(dbpedia-owl:artist | dbpedia-owl:producer)中,然后是GROUP_CONCAT.我对Virtuoso文档进行了一些研究,并做了以下工作

EDIT1 我试图检查不同的情况,

1- group_concat

SPARQL select ?s (group_concat(?obj; separator='|') as ?artist_list) FROM <http://ja.dbpedia.org>  where {   ?s a dbpedia-owl:Single ;      (dbpedia-owl:artist) ?obj } group by ?s limit 10;

SQL>  syntax error at 'group_concat' before '('
Run Code Online (Sandbox Code Playgroud)

2-使用值

SPARQL select ?s  FROM <http://ja.dbpedia.org>  where {  values ?sType {dbpedia-owl:Song dbpedia-owl:Single }. ?s a ?sType} limit 10;


*** Error 37000: [Virtuoso Driver][Virtuoso Server]SQ074: Line 1: SP030: SPARQL compiler, line 1: syntax error at 'values' before '?sType'
Run Code Online (Sandbox Code Playgroud)

3-使用|

   SPARQL select *  FROM <http://ja.dbpedia.org>  where { ?s (dbpedia-owl:artist|dbpedia-owl:producer) ?o } limit 10
    *** Error 37000: [Virtuoso Driver][Virtuoso Server]SQ074: Line 1: SP030: SPARQL compiler, line 0: Invalid character in SPARQL expression at '|'
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?以上所有SPARQL查询都在标准SPARQL端点中工作

Jos*_*lor 6

我不认为Virtuoso支持所有SPARQL 1.1,但您的查询也不合法SPARQL.(Virtuoso 确实接受了一些不太SPARQL的东西,但是你的查询属于SPARQL领域.)我建议你看一下sparql.org的查询验证器.您至少会发现以下问题:

  • 您没有定义dbpedia-owl:前缀.(你可能在端点中有这个,所以它可能不是问题.)
  • 它需要(group_concat(…) as …)括号.(不过这个案子没关系,所以GROUP_CONCAT很好.我认为Virtuoso会在没有parens的情况下接受它,但这并不能使它成为合法的SPARQL.)
  • group_concat,您需要使用分号和写分隔符.
  • 如果您正在使用聚合group_concat,那么您将按某些变量进行分组,并且无法选择您未进行分组的变量.这意味着你需要group by ?s.

一旦你解决了这些问题,你最终会得到类似的东西:

prefix dbpedia-owl: <http://dbpedia.org/ontology/>

select ?s (group_concat(?obj; separator=' ') as ?artist_list)
where {
  ?s a dbpedia-owl:Single ;
     (dbpedia-owl:artist|dbpedia-owl:producer) ?obj
}
group by ?s
limit 10
Run Code Online (Sandbox Code Playgroud)

那是合法的SPARQL 1.1.如果Virtuoso仍然抱怨这一点,你可以使用一个values块而不是属性路径,所以有以下,这是等效的:

prefix dbpedia-owl: <http://dbpedia.org/ontology/>

select ?s (group_concat(?obj; separator=' ') as ?artist_list)
where {
  values ?p { dbpedia-owl:artist dbpedia-owl:producer }
  ?s a dbpedia-owl:Single ;
     ?p ?obj
}
group by ?s
limit 10
Run Code Online (Sandbox Code Playgroud)

如果你仍然抱怨values(但DBpedia的端点支持values,它是Virtuoso;你安装的版本多大了?),你可以使用union:

prefix dbpedia-owl: <http://dbpedia.org/ontology/>

select ?s (group_concat(?obj; separator=' ') as ?artist_list)
where {
  ?s a dbpedia-owl:Single .
  { ?s dbpedia-owl:artist   ?obj } UNION
  { ?s dbpedia-owl:producer ?obj }
}
group by ?s
limit 10
Run Code Online (Sandbox Code Playgroud)

如果您需要一些SPARQL 1.1支持,则至少需要使用Virtuoso 7.0.0.发行说明包括:

2013-08-05 - Virtuoso开源版7.0.0发布

  • 添加了对SPARQL 1.1 BIND和VALUES子句的支持
  • 添加了对SPARQL 1.1函数和聚合的支持
  • 在SPARQL 1.1图形协议中添加了对图形参数的支持
  • 修复了Transitivity,Inference和SPARQL 1.1 Property Paths的问题