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

6

是否有可能限定属性路径的长度?例如获取所有长度在(m,n)之间或不在此范围内的三元组?例如,如何使用以下查询实现此操作?

select ?x ?y
where {?x p* ?y}
1个回答

7

一些端点直接支持此功能

一些SPARQL引擎支持使用类似正则表达式的语法直接实现此功能。例如,

?s :p{n,m} ?o

这里指的是长度在n和m之间的路径。该语法在SPARQL 1.1 Property Paths: W3C Working Draft 26 January 2010中有描述。还支持精确长度、最小长度和最大长度。然而,这种语法并未被纳入最终的SPARQL 1.1标准。一些SPARQL端点仍然接受它,所以值得一试。

一个通用的解决方法

但是有一个解决方法。思路是将候选路径分成两部分。通过检查它可以被分成两部分的方式数量,可以找到路径的长度。也就是说,你可以像这样做,例如查找连接了长度为10的路径的?s和?p:

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

请确保使用此方法时检查实际计数。根据您如何计算长度,很容易出现偏差(或-2)。有几个选项(无论是计算属性还是节点,是否计算端点等),因此值得进行一些实验。

参考和示例

为了更多地了解如何使用此模式,请参阅以下内容:

谢谢。您的查询似乎受到Jena的支持。但这也非常昂贵。为什么不使用“+”代替“*”呢? - jd466
1
@Java开发者,如果你喜欢可以使用+,但是如果你正在寻找长度为1的路径,请确保你没有做过?s :p+ ?mid . ?mid :p+ ?o,因为这将要求路径至少为2。我认为Jena也支持{n,m}符号,但你可能需要将其放入“启用扩展”模式中。 - Joshua Taylor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接