SPARQL 1.1 中任意 属性 路径的边界
boundary for arbitrary property path in SPARQL 1.1
是否可以限制属性路径的长度?例如,获取所有长度介于 (m,n) 之间或所有不在此范围内的三元组?例如,如何使用以下查询完成此操作?
select ?x ?y
where {?x p* ?y}
一些端点直接支持这个
一些 SPARQL 引擎支持使用类似正则表达式的语法直接执行此操作的方法。例如,
?s :p{n,m} ?o
将是一条长度在 n 和 m 之间的路径。 SPARQL 1.1 Property Paths: W3C Working Draft 26 January 2010 中描述了该语法。还支持精确长度、最小长度和最大长度。不管是好是坏,该语法都没有进入最终的 SPARQL 1.1 标准。不过一些 SPARQL 端点仍会接受它,因此值得一试。
一般解决方法
但有一个解决方法。这个想法是将候选路径分成两部分。通过检查有多少种方法可以将其分成两部分,您可以找到路径的长度。也就是说,你做这样的事情,例如,找到 ?s 和 ?p 它们由长度为 10 的路径连接的地方:
select ?s ?o {
?s :p* ?mid .
?mid :p* ?o .
}
group by ?s ?o
having (count(?mid) = 10)
如果您使用此方法,请务必检查实际计数。根据您想要计算长度的方式,很容易出现差一(或 -2)错误。有几个选项(是否计算属性或节点,是否计算端点等),因此值得进行一些实验。
参考和示例
有关如何使用此模式的更多示例,请查看:
- Is it possible to get the position of an element in an RDF Collection in SPARQL?
- Calculate length of path between nodes?
是否可以限制属性路径的长度?例如,获取所有长度介于 (m,n) 之间或所有不在此范围内的三元组?例如,如何使用以下查询完成此操作?
select ?x ?y
where {?x p* ?y}
一些端点直接支持这个
一些 SPARQL 引擎支持使用类似正则表达式的语法直接执行此操作的方法。例如,
?s :p{n,m} ?o
将是一条长度在 n 和 m 之间的路径。 SPARQL 1.1 Property Paths: W3C Working Draft 26 January 2010 中描述了该语法。还支持精确长度、最小长度和最大长度。不管是好是坏,该语法都没有进入最终的 SPARQL 1.1 标准。不过一些 SPARQL 端点仍会接受它,因此值得一试。
一般解决方法
但有一个解决方法。这个想法是将候选路径分成两部分。通过检查有多少种方法可以将其分成两部分,您可以找到路径的长度。也就是说,你做这样的事情,例如,找到 ?s 和 ?p 它们由长度为 10 的路径连接的地方:
select ?s ?o {
?s :p* ?mid .
?mid :p* ?o .
}
group by ?s ?o
having (count(?mid) = 10)
如果您使用此方法,请务必检查实际计数。根据您想要计算长度的方式,很容易出现差一(或 -2)错误。有几个选项(是否计算属性或节点,是否计算端点等),因此值得进行一些实验。
参考和示例
有关如何使用此模式的更多示例,请查看:
- Is it possible to get the position of an element in an RDF Collection in SPARQL?
- Calculate length of path between nodes?