SPARQL 1.1 中任意属性路径的边界

问题描述 投票:0回答:1

是否可以限制属性路径的长度?例如,获取长度在 (m,n) 之间或所有不在该范围内的所有三元组?例如,如何通过以下查询来完成此操作?

select ?x ?y
where {?x p* ?y}
sparql rdf semantic-web
1个回答
7
投票

某些端点直接支持此功能

一些 SPARQL 引擎支持使用类似正则表达式的语法直接执行此操作的方法。例如,

?s :p{n,m} ?o

是一条长度在 n 到 m 之间的路径。该语法在 SPARQL 1.1 属性路径:W3C 工作草案 2010 年 1 月 26 日 中进行了描述。还支持精确长度、最小长度和最大长度。无论好坏,该语法都没有进入最终的 SPARQL 1.1 标准。不过,一些 SPARQL 端点仍然会接受它,因此值得尝试。

一般解决方法

但是有一个解决方法。这个想法是将候选路径分成两部分。通过检查有多少种方法可以将其分成两部分,您可以找到路径的长度。也就是说,您可以执行类似的操作来查找 ?s 和 ?p,其中它们由长度为 10 的路径连接起来:

select ?s ?o {
  ?s :p* ?mid .
  ?mid :p* ?o .
}
group by ?s ?o
having (count(?mid) = 10)

如果您使用此方法,请务必检查实际计数。根据您想要计算长度的方式,很容易出现相差一(或二)的错误。有几个选项(是否计算属性或节点、是否计算端点等),因此值得进行一些实验。

参考文献和示例

有关如何使用此模式的更多示例,请查看:

© www.soinside.com 2019 - 2024. All rights reserved.