我已经安装了本地的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
首先抱怨|在(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 '('
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'
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 '|'
我做错了什么?以上所有SPARQL查询均可在Standard SPARQL endpoints
中使用答案 0 :(得分:6)
我不认为Virtuoso支持所有SPARQL 1.1,但您的查询也不合法SPARQL。 (Virtuoso 接受一些不太SPARQL的东西,但你的查询属于SPARQL范围。)我建议你看一下sparql.org's query validator。您至少会发现以下问题:
(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
这是合法的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
如果您仍然收到关于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
如果您需要某些SPARQL 1.1支持,则至少需要使用Virtuoso 7.0.0。发行说明包括:
2013-08-05 -- Virtuoso Open-Source Edition 7.0.0 Released
- 添加了对SPARQL 1.1 BIND和VALUES子句的支持
- 添加了对SPARQL 1.1函数和聚合的支持
- 在SPARQL 1.1图形协议
中添加了对?graph参数的支持- 修复了传递性,推理和SPARQL 1.1属性路径的问题