2011-03-04 316 views
6

如何检索两个节点之间的路径长度?例如,给定一个组织层次结构,我怎样才能确定父母和子孙组织的分离程度?请考虑以下方案:计算节点之间的路径长度?

  1. OrgA -hasSubOrganization-> OrgB, OrgC

    这就是我想要得到一个实体的所有直接下属组织的非常简单的情况。因此,路径长度为1。

  2. OrgA -> OrgB -> OrgC

    或一般情况下

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

欲递归遍历向下的曲线,并找到每个组织通过hasSubOrganization属于另一组织属性。为了让所有的下级单位,递归,我可以使用property paths,例如,在+操作:

OrgA hasSubOrganization+ ?subOrg 

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

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

+0

这不是一个简单的在线查询,但是这个_can_可以实现。 [是否可以在SPARQL中的RDF集合中获取元素的位置?](http://stackoverflow.com/q/17523804/1281433)简化为相同类型的查询,并且答案有一个响亮的“是”。 – 2013-09-24 20:23:09

回答

12

这是基于用于计算在描述中使用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)与从Z到Y的(非空)路径级联。可能的Z方式选择数表示路径的长度。

+5

需要注意的是,如果从X到Y存在多条路径,则会崩溃。计数将包括来自两条路径的所有节点。 – 2014-04-21 13:41:47

1

由于工作组专门选择不提供此信息,因为它使实现变得更加复杂,所以不能使用顺序路径执行此操作。

如果您想要生成一个层次结构,则可能会同样高效地进行一系列SPARQL查询,其中每个查询都会扩展层次结构的一个叶,而如果您的目标只是将可视化层次结构

可能还有其他方法使用Jena Ontology API - 我建议在他们的邮件列表上询问[email protected]。组织更多的专家帮助

+0

谢谢你。我在semanticoverflow.com问了同样的问题,也有人回答你说的http://www.w3.org/TR/sparql11-property-paths/#Outstanding_Issues。我想我会做的是使用属性路径来获取所有&然后做后期处理来生成层次结构。 – Chantz 2011-03-06 04:06:01

+0

听起来很不错。是的,我在SemanticOverflow上看到了您的问题,但其他人已经在那里回答了,所以没有看到我复制的答案 – RobV 2011-03-06 17:35:27

+1

这个_can_可以使用[计算RDF列表中元素的位置](http ://stackoverflow.com/q/17523804/1281433)。 – 2013-09-24 20:41:49

相关问题