计算节点之间的path长度?

我如何检索两个节点之间的path的长度? 例如,给定一个组织层次结构,我怎样才能确定父母和子孙后代的分离程度? 考虑以下情况:

  1. OrgA -hasSubOrganization-> OrgB, OrgC

    这是一个非常简单的情况,我想获得一个实体的所有直属子组织。 因此path长度是1。

  2. OrgA -> OrgB -> OrgC

    或一般情况

     OrgA -> OrgB - - - - - - - - OrgZ 

我想通过hasSubOrganization属性recursion地遍历图并find属于另一个组织的每个组织。 为了得到所有的子组织recursion,我可以使用属性path ,例如+运算符:

 OrgA hasSubOrganization+ ?subOrg 

这将给我所有的子组织,直到叶节点。 但是我的最终目标是构build组织层次结构,但是“关于节点/步骤/级别/跳过子组织的信息”的信息丢失了。 这意味着我无法重新创build可视化的组织结构。

除了子组织的名称,我怎样才能捕获“节点数量”信息呢?

这是基于用于使用SPARQL计算元素在RDF列表中的位置的相同技术的,该SPARQL描述如下: 是否可以在SPARQL中的RDF集合中获取元素的位置?

如果你有这样的数据:

 @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的任何path都可以看作是从X到某个中间节点Z(非空意味着你可以selectX作为Z)(可能是空的),从Z到Y.拾取Z的可能方式的数量表示path的长度。

由于工作组特别select不提供这些信息,因为它使得实现更为复杂,所以你不能使用properypath来做到这一点。

如果你想生成一个层次结构,那么做一系列的SPARQL查询可能是同样高效的,如果你的目标只是为了可视化层次结构,每个查询扩展一个层次结构的叶子,而不是使用属性path

使用Jena Ontology API可能还有其他的方法 – 我build议在他们的邮件列表jena-users@incubator.apache.org上寻求更多的专家帮助