是否有可能限定属性路径的长度?例如获取所有长度在(m,n)之间或不在此范围内的三元组?例如,如何使用以下查询实现此操作?
select ?x ?y
where {?x p* ?y}
是否有可能限定属性路径的长度?例如获取所有长度在(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端点仍然接受它,所以值得一试。
但是有一个解决方法。思路是将候选路径分成两部分。通过检查它可以被分成两部分的方式数量,可以找到路径的长度。也就是说,你可以像这样做,例如查找连接了长度为10的路径的?s和?p:
select ?s ?o {
?s :p* ?mid .
?mid :p* ?o .
}
group by ?s ?o
having (count(?mid) = 10)
?s :p+ ?mid . ?mid :p+ ?o
,因为这将要求路径至少为2。我认为Jena也支持{n,m}
符号,但你可能需要将其放入“启用扩展”模式中。 - Joshua Taylor