如何检索两个节点之间的路径长度?例如,给定组织层次结构,如何确定父组织和后代组织分离的距离?请考虑以下情况:
OrgA -hasSubOrganization-> OrgB, OrgC
这是一个非常简单的案例,我希望得到一个实体的所有直接子组织。因此路径长度为1。
OrgA -> OrgB -> OrgC
或一般情况
OrgA -> OrgB - - - - - - - - OrgZ
我希望以递归方式遍历图表,并通过hasSubOrganization
属性查找属于另一个组织的每个组织。为了让所有子组织递归,我可以使用property paths,例如+
运算符:
OrgA hasSubOrganization+ ?subOrg
这将为我提供所有子组织,直到叶节点。但我的最终目标是构建组织层次结构,但有关“节点/步骤/级别/跳过子组织的数量”的信息将丢失。这意味着我无法为可视化重新创建组织结构。
除了子组织的名称外,如何捕获“节点数”信息?
答案 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.
描述了这样的层次结构:
然后你可以使用这样的查询:
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以获得更多专家帮助