SPARQL:两个节点之间有路径吗? [英] SPARQL: is there any path between two nodes?
本文介绍了SPARQL:两个节点之间有路径吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如果两个给定节点连接到一个/多个SPARQL终结点,是否有一种好的SPARQL查询让我来回答?
假设我要检查这两个节点
<http://wiktionary.dbpedia.org/resource/dog>
和
<http://dbpedia.org/resource/Dog>
已连接。如果是,我会对路径感兴趣。
通过猜测,我已经知道它们是通过标签连接的,所以这样的查询返回长度为3的路径:
SELECT * WHERE {
<http://wiktionary.dbpedia.org/resource/dog> ?p1 ?n1.
# SERVICE <http://dbpedia.org/sparql> {
<http://dbpedia.org/resource/Dog> ?p2 ?n1 .
# }
}
现在,如果我还没有想法,并且希望针对任意长度和方向自动&;执行此操作,该怎么办?
我知道SPARQL 1.1的属性路径,但它们似乎只对已知属性有效(http://www.w3.org/TR/sparql11-query/#propertypaths):
变量不能用作路径本身的一部分,只能用作末端。
我还希望允许任何路径,因此该路径上的谓词可能会更改。
我目前(我觉得很荒谬)的方法是查询所有可能的路径,其长度k
最大限制为n
。
推荐答案
虽然您不能在属性路径中使用变量,但您可以使用通配符,因为对于任何URI,每个属性要么是该属性,要么不是。例如,(<>|!<>)
与任何属性匹配,因为每个属性要么是<>
,要么不是。您可以通过将通配符与其自身在另一个方向上交替来生成通配符。这意味着当
?u ((<>|!<>)|^(<>|!<>))* ?v
例如,以下查询应返回true(表示存在路径):
ASK {
<http://wiktionary.dbpedia.org/resource/dog> ((<>|!<>)|^(<>|!<>))* <http://dbpedia.org/resource/Dog>
}
现在,要实际获取两个节点之间路径的链接,您可以这样做(让<wildcard>
代表看起来很恶心的通配符):
?start <wildcard>* ?u .
?u ?p ?v .
?v <wildcard>* ?end .
然后,?U、?P和?V将给出路径上的所有边。请注意,如果有多条路径,您将获得所有路径的所有边。由于通配符可以在任意方向上使用,因此您实际上可以从开始或结束到达任何可以到达的位置,因此您确实应该考虑以某种方式限制通配符。
在您链接到的终结点上,它没有,但这似乎是Virtuoso实现属性路径的问题,而不是实际查询的问题。
请注意,在许多情况下,如果您有任何类型的推理发生,这将是微不足道的。例如,如果您使用的是owl,那么每个个体都是owl:thing的实例,所以总会有以下形式的路径: ; ;?u&right tarrow;rdf:类型owl:thing&leftarrow;rdf:type?v
这篇关于SPARQL:两个节点之间有路径吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文