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*
集相同。elt1
elt1 / 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.}
}
为什么会这样?
- 我的假设是错误的
elt1/elt2* = elt1 UNION elt1/elt2+
吗? - 我是否错误地将该假设转换为 SPARQL 查询?还是查询解析器未捕获到查询中的某些错误?
- 或者这是 SPARQL 端点的特定实现细节?我在 Linux (x86_64-unknown-linux-gnu) 单服务器版上使用 Virtuoso 版本 07.20.3217。
附言
我试图将图表附加到这篇文章,以便有人可以重现问题,但是当我转储图表并将其上传到另一个图表时,新图表中不会出现问题。
更新
关于属性路径,我们还有其他类似的奇怪结果,并假设它与旧版本的 Virtuoso 端点有关。不幸的是,由于某些应用程序使用 PHP5.6 ODBC 库,我们无法升级到最新版本,因此我们现在将尝试解决该问题。