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

标签 rdf sparql jena

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

  • OrgA -hasSubOrganization-> OrgB, OrgC
    这是非常简单的情况,我想获取实体的所有直接子组织。因此,路径长度为1。
  • OrgA -> OrgB -> OrgC
    或一般情况
    OrgA -> OrgB - - - - - - - - OrgZ
    

  • 我想递归遍历该图,并通过hasSubOrganization属性找到属于另一个组织的每个组织。要获得所有子组织的递归信息,我可以使用property paths,例如+运算符:
    OrgA hasSubOrganization+ ?subOrg
    

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

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

    最佳答案

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

    关于rdf - 计算节点之间的路径长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5198889/

    相关文章:

    java - 线程 "main"java.lang.UnsupportedClassVersionError : org/apache/jena/fuseki/cmd/FusekiCmd : Unsupported major. 次要版本 51.0 中出现异常

    java - Sesame中BNode的解决方案

    java - RDF文件到java对象: DMOZ base

    sparql - 芝麻 : how to remove the inference during queries?

    sparql - 在 sparql IN 子句中使用另一个 sparql

    java - JENA:初始化 HSQLDB RDF 数据存储

    user-interface - 基于 Web 的 RDF 三元组编辑器? (如 RDB 的 phpMyAdmin)

    java - 如何从 sparql 结果中提取 dataproperty 值?

    rdf - 在 Web 应用程序中实现语义搜索