如何获取两个节点之间的路径长度?例如,给定组织层次结构,我如何确定上级组织和下级组织之间的距离?请考虑以下情形:
OrgA -hasSubOrganization-> OrgB, OrgC
这是非常简单的情况,我想获取实体的所有直接子组织。因此,路径长度为1。
OrgA -> OrgB -> OrgC
或一般情况
OrgA -> OrgB - - - - - - - - OrgZ
我想递归遍历该图,并通过
hasSubOrganization
属性找到属于另一个组织的每个组织。要获得所有子组织的递归信息,我可以使用property paths,例如+
运算符:OrgA hasSubOrganization+ ?subOrg
这将使我所有的子组织都直达叶节点。但是我的最终目标是建立组织层次结构,但是有关“子组织的节点数/步骤数/级别/跳数丢失”的信息却丢失了。这意味着我无法为可视化重新创建组织结构。
除了子组织的名称,我如何捕获“节点数”信息?
最佳答案
这基于与使用SPARQL计算RDF列表中元素位置的技术相同,该技术在Is it possible to get the position of an element in an RDF Collection in SPARQL?中进行了描述:
如果您有这样的数据:
@prefix : <http://example.org> .
:orgA :hasSuborganization :orgB, :orgC, :orgD.
:orgB :hasSuborganization :orgE, :orgF.
:orgE :hasSuborganization :orgG.
:orgG :hasSuborganization :orgH.
描述了这样的层次结构:
那么您可以使用如下查询:
prefix : <http://example.org>
select ?super ?sub (count(?mid) as ?distance) {
?super :hasSuborganization* ?mid .
?mid :hasSuborganization+ ?sub .
}
group by ?super ?sub
order by ?super ?sub
得到这样的结果:
$ sparql --query query.rq --data subs.n3
----------------------------
| super | sub | distance |
============================
| :orgA | :orgB | 1 |
| :orgA | :orgC | 1 |
| :orgA | :orgD | 1 |
| :orgA | :orgE | 2 |
| :orgA | :orgF | 2 |
| :orgA | :orgG | 3 |
| :orgA | :orgH | 4 |
| :orgB | :orgE | 1 |
| :orgB | :orgF | 1 |
| :orgB | :orgG | 2 |
| :orgB | :orgH | 3 |
| :orgE | :orgG | 1 |
| :orgE | :orgH | 2 |
| :orgG | :orgH | 1 |
----------------------------
这里的技巧是要认识到,从X到Y的任何路径都可以看作是从X到某个中间节点Z的(可能为空)路径(非空意味着您可以选择X作为Z)与( Z到Y。拾取Z的可能方式的数量表示路径的长度。
关于rdf - 计算节点之间的路径长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5198889/