gpt4 book ai didi

SPARQL:两个节点之间是否有任何路径?

转载 作者:行者123 更新时间:2023-12-04 16:52:05 25 4
gpt4 key购买 nike

如果两个给定的节点连接在单个/多个 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 ):

Variables can not be used as part of the path itself, only the ends.



我也想允许任何路径,所以路径上的谓词可能会改变。

我目前(因为我觉得很荒谬)的方法是查询所有可能的长度为 k 的路径最高为 n .

倾销对我来说不是一种选择,因为它有数十亿个三元组......我想使用 SPARQL!

最佳答案

虽然您不能在属性路径中使用变量,但您可以利用以下事实来使用通配符:对于任何 URI,每个属性要么是该属性,要么不是该属性。例如,(<>|!<>)匹配任何属性,因为每个属性要么是 <>或者不是。您可以通过在另一个方向上与自身交替来制作一个在任一方向上的通配符:(<>|!<>)|^(<>|!<>) .这意味着在两个节点 ?u 和 ?v 之间有一条路径,属性在两个方向上都有,当

?u ((<>|!<>)|^(<>|!<>))* ?v

例如,以下查询应返回 (表示有路径):
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 为您提供路径上的所有边。请注意,如果有多个路径,您将获得所有路径的所有边。由于您的通配符朝任何一个方向发展,您实际上可以从 ?start 或 ?end 获得任何可访问的内容,因此您确实应该考虑以某种方式限制通配符。

在您链接到的端点上,它没有,但这似乎是 Virtuoso 实现属性路径的问题,而不是实际查询的问题。

请注意,如果您有任何类型的推理发生,这在许多情况下都会很容易满足。例如,如果你使用的是 OWL,那么每个人都是 owl:Thing 的一个实例,所以总会有一个这样的路径:

?u →rdf:type owl:Thing ←rdf:type ?v

关于SPARQL:两个节点之间是否有任何路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30916040/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com