关于rdf:计算节点之间的路径长度?

Calculate length of path between nodes?

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

  • OrgA -hasSubOrganization-> OrgB, OrgC

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

  • OrgA -> OrgB -> OrgC

    或一般情况

    1
    OrgA -> OrgB - - - - - - - - OrgZ
  • 我想递归地遍历该图,并通过hasSubOrganization属性找到属于另一个组织的每个组织。要获取所有子组织的递归信息,我可以使用属性路径,例如+运算符:

    1
    OrgA hasSubOrganization+ ?subOrg

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

    除了子组织的名称,我如何捕获"节点数"信息?


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

    如果您有这样的数据:

    1
    2
    3
    4
    5
    6
    @prefix : <http://example.org> .

    :orgA :hasSuborganization :orgB, :orgC, :orgD.
    :orgB :hasSuborganization :orgE, :orgF.
    :orgE :hasSuborganization :orgG.
    :orgG :hasSuborganization :orgH.

    描述了这样的层次结构:

    organization

    1
    2
    3
    4
    5
    6
    7
    8
    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

    获得以下结果:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    $ 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的可能方式数表示路径的长度。


    您不能使用适当的路径来执行此操作,因为工作组明确选择不提供此信息,因为它会使实现变得更加复杂。

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

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