Rdf 获取传递关系中的所有节点

Rdf 获取传递关系中的所有节点,rdf,sparql,Rdf,Sparql,是否有可能通过与SPARQL的传递关系获得连接的节点列表? 我有这样连接的元素: ?a g:eastOf ?b ?b g:eastOf ?c … 并非所有节点都相互连接,因为有些节点位于更南的地方。只有当节点垂直位于同一平面时,才可能存在g:eastOf关系。这意味着有多组节点彼此未连接 我想得到所有这些节点组(基本上是一个列表列表)。在SPARQL中有这样做的方法吗?SELECT语句需要有限数量的变量,不能以某种方式表示“一系列”内容 我只对所有节点的xsd:integer属性从西向东递增的

是否有可能通过与SPARQL的传递关系获得连接的节点列表? 我有这样连接的元素:

?a g:eastOf ?b
?b g:eastOf ?c
…
并非所有节点都相互连接,因为有些节点位于更南的地方。只有当节点垂直位于同一平面时,才可能存在
g:eastOf
关系。这意味着有多组节点彼此未连接

我想得到所有这些节点组(基本上是一个列表列表)。在SPARQL中有这样做的方法吗?
SELECT
语句需要有限数量的变量,不能以某种方式表示“一系列”内容


我只对所有节点的
xsd:integer
属性从西向东递增的列表感兴趣,但在我找到第一个问题的解决方案后,这应该相对容易。

OpenLink Virtuoso支持这样的东西:这需要SPARQL查询中的自定义语法

据我所知,您无法将可变元素列表作为SPARQL解决方案。我认为最简单的方法就是从
?a g:eastOf?b
中获取对(a,b)并对它们进行排序

SELECT ?a ?b WHERE {
?a g:eastOf ?b
} ORDER BY ASC(?a) ASC(?b)
在元素列表上转换元组列表的逻辑应该非常简单


如果你使用及物性推理,你将无法追溯连接A和C的路径。如果你有类似(A,g:eastOf,B)和(B,g:eastOf,C)的东西。基本上,在这种情况下,使用推理将使事情变得更加复杂,因为您需要构建连接元素的完整列表。SPARQL中的可传递性将为您提供开始和结束节点,但您将失去所有中间点的可跟踪性

如果没有数百万条语句,我认为上面的SPARQL查询加上一些转换结果集的逻辑就可以完成这项工作

编辑以提供指向Jena+owl的指针:TransitiveProperty

因此,首先确保将具有以下公理的本体加载到您的应用程序中:

然后启用Jena OWL推理机,请参见此处的文档:

并连接到您的模型,以便能够启动SPARQL查询

一旦你做到了。。。如果你有像

:x g:eastOf :y .
:y g:eastOf :t .
:t g:eastOf :z .
然后运行一个查询,如

SELECT ?a ?b WHERE {
?a g:eastOf ?b
} ORDER BY ASC(?a) ASC(?b)
你会得到

:x g:eastOf :y .
:x g:eastOf :t .
:x g:eastOf :z .
:y g:eastOf :t .
:y g:eastOf :z .
(...)

也与耶拿考虑使用。它也能完成任务


让我们知道它是否有效,或者如果您遇到任何问题,干杯

您可以使用SPARQL 1.1至少完成其中的一部分

获取节点列表 假设您有数据,其中有两组点根据
:eastOf
形成一行:

@prefix : <http://stackoverflow.com/q/4056008/1281433/>

:a :eastOf :b .
:b :eastOf :c .
:c :eastOf :d .

:e :eastOf :f .
:f :eastOf :g .
:g :eastOf :h .
这里有一些字符串处理

group_concat(strafter(str(?westernpoint),str(:));separator=", ") as ?colatitudinalPoints
你可能不需要;关键是
?westernpoint
?最东端
以西的点的IRI(实际上包括
?最东端
,因为我们在属性路径中使用了
*
),然后我们需要以某种方式将它们连接在一起。在这里,我做了一些字符串处理,使结果更漂亮。你可以很容易地做到

prefix : <http://stackoverflow.com/q/4056008/1281433/>

select (group_concat(?westernpoint;separator=", ") as ?colatitudinalPoints)
 where {
  ?easternmost :eastOf* ?westernpoint .
  filter not exists { ?easternmoster :eastOf ?easternmost }
}
group by ?easternmost
确保节点正在上升 您的另一个要求更具挑战性:

我只对xsd:integer属性为all的列表感兴趣 当从西向东移动时,节点在上升,但这应该是正确的 在我有了第一个问题的解决方案后,相对容易

这就是说,如果你能在类似的情况下明确你想要什么

w --eastof-> x --eastof-> y --eastof-> z
|            |            |            |
5            6            2            3

例如,您想拒绝整个链,因为节点不是都是升序的,还是想得到两个子链
wx
yz
,其中的值是升序的?可能两者都可以…

不幸的是,我不得不使用Jena。SPARQL 1.1现在支持属性路径,因此您可以在任何当前引擎中执行此操作。“SPARQL中的传递性将为您提供开始和结束节点,但您将失去所有中间点的可跟踪性。”这可能足够好了,因为所有节点都有x和y坐标,我可以对它们进行排序。@panzi很公平,如果传递性可以做到这一点,那么你必须使用Jena。。。问题经过编辑,为您提供了一些相关的指导。顺便说一句,属性路径是sparql 1.1的一部分。是的,确实如此。感谢您添加了参考(+1)Hm,属性路径确实非常方便。然而,是否有可能添加一个必须应用于每个path元素的限制/条件?既然SPARQL 1.1已经推出,您实际上可以这样做。我已经发布了演示如何操作的帖子。它应该适用于任何SPARQL 1.1引擎。我和Jena一起测试过,所以没问题。
group_concat(strafter(str(?westernpoint),str(:));separator=", ") as ?colatitudinalPoints
prefix : <http://stackoverflow.com/q/4056008/1281433/>

select (group_concat(?westernpoint;separator=", ") as ?colatitudinalPoints)
 where {
  ?easternmost :eastOf* ?westernpoint .
  filter not exists { ?easternmoster :eastOf ?easternmost }
}
group by ?easternmost
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| colatitudinalPoints                                                                                                                                                                      |
============================================================================================================================================================================================
| "http://stackoverflow.com/q/4056008/1281433/e, http://stackoverflow.com/q/4056008/1281433/f, http://stackoverflow.com/q/4056008/1281433/g, http://stackoverflow.com/q/4056008/1281433/h" |
| "http://stackoverflow.com/q/4056008/1281433/a, http://stackoverflow.com/q/4056008/1281433/b, http://stackoverflow.com/q/4056008/1281433/c, http://stackoverflow.com/q/4056008/1281433/d" |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
w --eastof-> x --eastof-> y --eastof-> z
|            |            |            |
5            6            2            3