首页 > 解决方案 > SPARQL 属性路径 x/y+ 产生的结果与 x UNION x/y+ 不同

问题描述

SPARQL 1.1 属性路径的规范包含:

elt1 / elt2 A sequence path of elt1, followed by elt2
elt*        A path of zero or more occurrences of elt.
elt+        A path of one or more occurrences of elt.

我对此的期望是,它总是与 和 的并elt1 / elt2*集相同。elt1elt1 / elt2+

然而在实践中并非如此。

此查询返回空结果

SELECT * FROM <http://www.snik.eu/ontology/bb>
{
 ?class rdfs:label ?label.
 FILTER(LANGMATCHES(LANG(?label),"en"))
 BIND(<http://www.snik.eu/ontology/bb/chapter10.4> as ?chapter)

 ?class meta:chapter/meta:subChapterOf* ?chapter.   
}

此查询返回非空结果

SELECT * FROM <http://www.snik.eu/ontology/bb>
{
 ?class rdfs:label ?label.
 FILTER(LANGMATCHES(LANG(?label),"en"))

 BIND(<http://www.snik.eu/ontology/bb/chapter10.4> as ?chapter)

 {?class meta:chapter ?chapter}
 UNION
 {?class meta:chapter/meta:subChapterOf+ ?chapter.}
}

为什么会这样?

  1. 我的假设是错误的elt1/elt2* = elt1 UNION elt1/elt2+吗?
  2. 我是否错误地将该假设转换为 SPARQL 查询?还是查询解析器未捕获到查询中的某些错误?
  3. 或者这是 SPARQL 端点的特定实现细节?我在 Linux (x86_64-unknown-linux-gnu) 单服务器版上使用 Virtuoso 版本 07.20.3217。

附言

我试图将图表附加到这篇文章,以便有人可以重现问题,但是当我转储图表并将其上传到另一个图表时,新图表中不会出现问题。

更新

关于属性路径,我们还有其他类似的奇怪结果,并假设它与旧版本的 Virtuoso 端点有关。不幸的是,由于某些应用程序使用 PHP5.6 ODBC 库,我们无法升级到最新版本,因此我们现在将尝试解决该问题。

标签: sparqlvirtuosoopenlink-virtuoso

解决方案


推荐阅读