9

如何检索两个节点之间的路径长度?例如,给定一个组织层次结构,我如何确定父组织和子组织之间的距离?考虑以下场景:

  1. OrgA -hasSubOrganization-> OrgB, OrgC

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

  2. OrgA -> OrgB -> OrgC

    或一般情况

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

hasSubOrganization我想递归地遍历图表并通过属性找到属于另一个组织的每个组织。要使所有子组织递归,我可以使用属性路径,例如+运算符:

OrgA hasSubOrganization+ ?subOrg

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

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

4

2 回答 2

24

这基于使用 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 的可能方式的数量表示路径的长度。

于 2013-09-24T20:32:36.183 回答
1

您不能使用正确的路径来执行此操作,因为工作组特别选择不提供此信息,因为它使实施变得更加复杂。

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

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

于 2011-03-05T09:16:29.200 回答