是否存在一种良好的SPARQL查询,如果两个给定节点连接在单个/多个SPARQL端点上,我们可以回答这个问题吗?
假设我想检查两个节点
<http://wiktionary.dbpedia.org/resource/dog>
Run Code Online (Sandbox Code Playgroud)
和
<http://dbpedia.org/resource/Dog>
Run Code Online (Sandbox Code Playgroud)
连接了.如果是的话,我会对这条路感兴趣.
通过猜测我已经知道它们是通过标签连接的,所以像这样的查询返回长度为3的路径:
SELECT * WHERE {
<http://wiktionary.dbpedia.org/resource/dog> ?p1 ?n1.
# SERVICE <http://dbpedia.org/sparql> {
<http://dbpedia.org/resource/Dog> ?p2 ?n1 .
# }
}
Run Code Online (Sandbox Code Playgroud)
现在如果我还没有想法并希望自动完成并且任意长度和方向怎么办?
我知道SPARQL 1.1的属性路径,但它们似乎只适用于已知属性(http://www.w3.org/TR/sparql11-query/#propertypaths):
变量不能用作路径本身的一部分,只能用作结尾.
此外,我想要允许任何路径,因此路径上的谓词可能会改变.
我当前(因为我觉得很荒谬)的方法是查询所有可能的长度k达到极限的路径n.
倾倒不是我的选择,因为它有数十亿的三元组...我想使用SPARQL!
Jos*_*lor 11
虽然您不能在属性路径中使用变量,但您可以使用通配符,因为对于任何URI,每个属性都是该属性或不是.例如,(<>|!<>)匹配任何财产,因为每个财产都是<>或不是.你可以通过在另一个方向上与自身交替来制作一个任意方向的通配符:(<>|!<>)|^(<>|!<>).这意味着在两个节点之间存在一个路径,其中属性在任一方向上,?u和?v
?u ((<>|!<>)|^(<>|!<>))* ?v
Run Code Online (Sandbox Code Playgroud)
例如,以下查询应返回true(表示存在路径):
ASK {
<http://wiktionary.dbpedia.org/resource/dog> ((<>|!<>)|^(<>|!<>))* <http://dbpedia.org/resource/Dog>
}
Run Code Online (Sandbox Code Playgroud)
现在,要实际获取两个节点之间的路径链接,您可以这样做(让<wildcard>代表令人讨厌的外观通配符):
?start <wildcard>* ?u .
?u ?p ?v .
?v <wildcard>* ?end .
Run Code Online (Sandbox Code Playgroud)
然后?u,?p和?v给你路径上的所有边缘.请注意,如果有多个路径,您将获得所有路径的所有边.由于你的通配符朝向任何一个方向,你实际上可以从?start或?end到达任何可以访问的内容,所以你真的应该考虑以某种方式限制通配符.
在您链接到的端点上,它没有,但这似乎是Virtuoso的属性路径实现的问题,而不是实际查询的问题.
请注意,如果您发生任何类型的推断,在许多情况下这将非常满意.例如,如果你使用的是OWL,那么每个人都是owl的实例:Thing,所以总会有一个表单的路径:
?u→ rdf:type owl:Thing← rdf:type?v