SPARQL:两个节点之间有路径吗? [英] SPARQL: is there any path between two nodes?

查看:14
本文介绍了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 .
  # }
}

try yourself

现在,如果我还没有想法,并且希望针对任意长度和方向自动&;执行此操作,该怎么办?

我知道SPARQL 1.1的属性路径,但它们似乎只对已知属性有效(http://www.w3.org/TR/sparql11-query/#propertypaths):

变量不能用作路径本身的一部分,只能用作末端。

我还希望允许任何路径,因此该路径上的谓词可能会更改。

我目前(我觉得很荒谬)的方法是查询所有可能的路径,其长度k最大限制为n

倾倒对我来说不是一个选择,因为它是数十亿的三倍…我想使用SPARQL!

推荐答案

虽然您不能在属性路径中使用变量,但您可以使用通配符,因为对于任何URI,每个属性要么是该属性,要么不是。例如,(<>|!<>)与任何属性匹配,因为每个属性要么是<>,要么不是。您可以通过将通配符与其自身在另一个方向上交替来生成通配符。这意味着当

出现以下情况时,在两个节点?u和?v之间有一条路径,其属性在两个方向上都有
?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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆