【问题标题】:How to find sum of all descendents attribute named x in ArangoDB?如何在 ArangoDB 中找到名为 x 的所有后代属性的总和?
【发布时间】:2016-07-19 05:49:06
【问题描述】:

因为我的图形数据库 ArangoDB 中有树形结构,如下所示

id 为 2699394 的节点是此图树的父节点。并且每个节点都有名为 X 的属性分配给它。我想知道父节点 2699394 的所有后代的 x 的总和,不包括它自己的属性 x 总和。 例如假设如果,

 2699399 x value is = 5,
 2699408 x value is = 3,
 2699428 x value is = 2,
 2699418 x value is = 5,

then parent node 2699394 sum of x should be = 5 + 3 + 2 + 5 
                                            = 15

所以答案是 15。那么任何人都可以在 ArangoDB AQL 中查询这个计算吗?

为了找出特定节点的后代,我使用了以下查询,

`FOR v, e, p   in 1..1000 OUTBOUND 'Person/1648954' 
GRAPH 'Appes'
RETURN v.id`

提前致谢。 马扬克

【问题讨论】:

    标签: arangodb


    【解决方案1】:

    假设孩子与他们的父母有联系,数据可以这样可视化:

    nodes/2699394 SUM of children?
          ↑
    nodes/2699399 {x: 5}
          ↑
    nodes/2699408 {x: 3}
          ↑
    nodes/2699428 {x: 2}
          ↑
    nodes/2699418 {x: 5}
    

    要遍历子链,我们需要沿 INBOUND 方向遍历(如果父节点指向子节点,则为 OUTOBUND):

    FOR v IN 1..10 INBOUND "nodes/2699394" relations
      RETURN v
    

    在本例中,通过指定边集合关系来使用匿名图。您还可以使用命名图,例如GRAPH "yourGraph"

    nodes/2699394 开始,遍历到nodes/2699418 的边,并且沿途的每个节点都返回原样。

    由于我们只对x 属性感兴趣,我们可以将其更改为仅返回该属性:RETURN v.x - 这将返回[ 5, 3, 2, 5 ]。除非我们说IN 0..10,否则不会包含起始顶点。

    在 FOR 循环中,我们无法访问所有 x 值,但一次只能访问一个。我们不能在这里做类似RETURN SUM(v.x) 的事情。相反,我们需要将遍历的结果分配给一个变量,这使它成为一个子查询。然后我们可以将所有数字相加并返回结果值:

    LET x = (
      FOR v IN 1..10 INBOUND "nodes/2699394" relations
        RETURN v.x
    )
    RETURN SUM(x) // [ 15 ]
    

    如果您想返回带有计算的x 属性的起始节点,您可以执行以下操作:

    LET doc = DOCUMENT("nodes/2699394")
    LET x = (
      FOR v IN 1..10 INBOUND doc relations
        RETURN v.x
    )
    RETURN MERGE( doc, { x: SUM(x) } )
    

    结果会是这样的:

    [
      {
        "_id": "nodes/2699394",
        "_key": "2699394",
        "_rev": "2699394",
        "x": 15
      }
    ]
    

    【讨论】:

    • 嗨 Codemanx,您的回答几乎是正确的。但我使用了之前查询中所示的命名图来查找节点的所有后代。那么在这种情况下怎么办呢?您可以参考我的以下查询 FOR v, e, p in 1..1000 OUTBOUND 'Person/1648954' GRAPH 'Appes' RETURN v.id`
    • 正如我所指出的,您还可以使用命名图。只需将relations 替换为GRAPH yourGraph
    • 至于计算每个节点的后代总和,我已经开始从下到上的方法意味着首先我找到节点节点/2699418的后代总和,即最后一个节点,然后是节点/2699428,然后节点/ 2699408 喜欢......所以如果我已经计算了最后一个节点后代的值,那么在计算他的父节点时有没有办法获得已经计算的节点的值并添加直接后代值。无需一次又一次地计算同样的事情。
    • 您可以UPDATE doc WITH { x } IN nodes 以便稍后访问它,而不是只返回计算值。但我不会称它为x 以避免混淆,也许xCached 或类似的东西更好?然后,您可以显式检查该属性 (HAS(doc, "xCached")) 并使用它 - 但请注意不要将其用于不同的路径,否则会导致 x 的总和不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多