我已经安装了本地的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端点中工作
我不认为Virtuoso支持所有SPARQL 1.1,但您的查询也不合法SPARQL.(Virtuoso 确实接受了一些不太SPARQL的东西,但是你的查询属于SPARQL领域.)我建议你看一下sparql.org的查询验证器.您至少会发现以下问题:
(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的问题