计算节点之间的路径长度?

时间:2011-03-04 20:26:31

标签: rdf sparql jena

如何检索两个节点之间的路径长度?例如,给定组织层次结构,如何确定父组织和后代组织分离的距离?请考虑以下情况:

  1. OrgA -hasSubOrganization-> OrgB, OrgC

    这是一个非常简单的案例,我希望得到一个实体的所有直接子组织。因此路径长度为1。

  2. OrgA -> OrgB -> OrgC

    或一般情况

    OrgA -> OrgB - - - - - - - - OrgZ
    
  3. 我希望以递归方式遍历图表,并通过hasSubOrganization属性查找属于另一个组织的每个组织。为了让所有子组织递归,我可以使用property paths,例如+运算符:

    OrgA hasSubOrganization+ ?subOrg
    

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

    除了子组织的名称外,如何捕获“节点数”信息?

2 个答案:

答案 0 :(得分:17)

这是基于使用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.

描述了这样的层次结构:

organization hierarchy

然后你可以使用这样的查询:

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)与a连接(非空)从Z到Y的路径。选择Z的可能方式的数量表示路径的长度。

答案 1 :(得分:1)

由于工作组明确选择不提供此信息,因为它使实施变得更加复杂,所以不能使用propery路径。

如果要生成层次结构,那么制作一系列SPARQL查询可能同样有效,其中每个查询扩展层次结构的一个叶子,如果您的目标只是可视化层次结构,则根本不使用属性路径

使用Jena Ontology API可能还有其他方法 - 我建议在他们的邮件列表中询问jena-users@incubator.apache.org以获得更多专家帮助

相关问题