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