Calculate length of path between nodes?
如何检索两个节点之间的路径长度?例如,给定组织层次结构,我如何确定上级组织和下级组织之间的距离?请考虑以下情形:
这是一种非常简单的情况,我想获取实体的所有直接子组织。因此,路径长度为1。
或一般情况
1 | OrgA -> OrgB - - - - - - - - OrgZ |
我想递归地遍历该图,并通过
1 | OrgA hasSubOrganization+ ?subOrg |
这将把我所有的子组织带到叶节点。但是我的最终目标是建立组织层次结构,但是有关"子组织的节点数/步骤数/级别/跳跃数"的信息却丢失了。这意味着我无法重新创建可视化的组织结构。
除了子组织的名称,我如何捕获"节点数"信息?
这基于使用SPARQL在RDF列表中计算元素位置的相同技术,该技术在以下内容中进行了描述:是否有可能在SPARQL中获取RDF集合中元素的位置?
如果您有这样的数据:
1 2 3 4 5 6 | @prefix : <http://example.org> . :orgA :hasSuborganization :orgB, :orgC, :orgD. :orgB :hasSuborganization :orgE, :orgF. :orgE :hasSuborganization :orgG. :orgG :hasSuborganization :orgH. |
描述了这样的层次结构:
然后您可以使用如下查询:
1 2 3 4 5 6 7 8 | 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 |
获得以下结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | $ 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的可能方式数表示路径的长度。
您不能使用适当的路径来执行此操作,因为工作组明确选择不提供此信息,因为它会使实现变得更加复杂。
如果要生成层次结构,则进行一系列SPARQL查询可能会同样有效,如果您的目标只是可视化层次结构,则每个查询都将扩展层次结构的一个叶子,而根本不使用属性路径
使用Jena Ontology API可能还有其他方法-我建议在他们的邮件列表[email protected]上寻求更多专家帮助