ArangoDB 一种计算两个节点间跳数并识别层次图中最低节点的方法

eimct9ow  于 2022-12-09  发布在  Go
关注(0)|答案(1)|浏览(132)

我对arangodb比较陌生,因此下面的问题可能很容易回答,但我还不能从文档中找到解决方案。

我拥有的:
**1.问题:**我已经对通过边(isChildOf)链接的项(节点)的父子层次结构进行了建模。各个分支的深度是不平衡的,可以从1除以1.1到1.1.1和1.1.1.1。每个层次结构都有一个根节点。现在,我想找出给定子节点(例如,1.1.1.1的子节点)与根节点1之间的边数。因此,不要将边数设置为查询筛选器参数,我想做相反的事情,计算从1到1.1.1.1或从1.1.1.1到1.1.1.1.5.2的“跳数”。如何在AQL中实现这一点?
**2.问题:**我仍在寻找一种方法来检索先前定义的层次结构的最低节点(不是子节点的父节点的节点)。例如,如果层次结构在1.1.1.1和1.1.1.2.1结束,我如何在一个AQL查询中检索所有这些最低节点?

sqougxex

sqougxex1#

有几种方法可以实现这一点,这取决于你想返回什么(或者查询是如何嵌套的),但是无论哪种方法,SHORTEST_PATHK_SHORTEST_PATHS都将是你的朋友。

FOR v,e IN INBOUND SHORTEST_PATH start_node to root_node
    GRAPH 'named_graph'
    RETURN e

参考SHORTEST_PATH文档,我们可以开始对此进行分解。
1.我们正在寻找从“开始”节点到“结束”节点的路径(由跳数或“权重”确定的最短路径)。
1.使用INBOUNDOUTBOUND将取决于您的图形/数据模型是如何构建的。
1.变量v,e表示沿着路径找到的“顶点”和“边”(分别为ve)。
然后,可以使用此查询模式来计算顶点或边的数量,如下所示:

FOR start_node in child_collection
    FOR root_node IN root_collection
        LET edges = (
            FOR v,e IN INBOUND SHORTEST_PATH start_node to root_node
                GRAPH 'named_graph'
                RETURN e._id
        )
        RETURN {
            root: root_node._id,
            child: start_node._id,
            pathLen: LENGTH(paths)
        }

这可能有点基础(可能有一些方法可以优化它),但它显示了如何使用变量保存子查询,并使用这些结果计算路径长度。
或者,您可以使用K_SHORTEST_PATHS来执行此计算。例如,可以将前面的查询简化为:

FOR p IN INBOUND K_SHORTEST_PATHS start_node to root_node
    GRAPH 'named_graph'
    OPTIONS { weightAttribute: 'weight' }
    LIMIT 1
    RETURN p

在这里,我们使用LIMIT 1来确保我们只返回一条路径,结果如下:

[
  {
    edges: [ ... ],
    vertices: [ ... ],
    weight: <number>
  }
]

或者您可以自定义返回以更好地满足您的需要。不要返回您不需要或不会使用的数据。

相关问题