如何在ArangoDB中找到名为x的所有子代属性之和?

如何在ArangoDB中找到名为x的所有子代属性之和?,arangodb,Arangodb,因为我的图形数据库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 sho

因为我的图形数据库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`
提前谢谢。
Mayank

假设孩子们与父母有联系,数据可以可视化如下:

nodes/2699394 SUM of children?
      ↑
nodes/2699399 {x: 5}
      ↑
nodes/2699408 {x: 3}
      ↑
nodes/2699428 {x: 2}
      ↑
nodes/2699418 {x: 5}
要遍历子节点链,我们需要沿入站方向遍历(如果父节点指向子节点,则为出站):

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

nodes/2699394
开始,向下到
nodes/2699418
的边将被遍历,并且到目前为止,返回过程中的每个节点都保持不变

由于我们只对
x
属性感兴趣,因此可以将其更改为仅返回该属性:
return v.x
——它将返回
[5,3,2,5]
。除非我们在0..10中说
,否则将不包括起始顶点

在FOR循环中,我们不能访问所有的
x
值,但一次只能访问一个值。我们不能在这里执行类似于
返回和(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,你的答案几乎是正确的。但我使用了命名图(如前一个查询中所示)来查找节点的所有后代。那么在这种情况下该怎么办呢?您可以参考我下面对1..1000 OUTBOUND'Person/1648954'图形'Appes'RETURN v.id'中v,e,p的查询。正如我指出的,您还可以使用命名图形。只需将
关系
替换为
GRAPH yourGraph
。至于计算每个节点的后代之和,我已经开始从下到上的方法,即首先我找到节点的后代之和/2699418,即最后一个节点,然后是节点/2699428,然后是节点/2699408,如。。。所以,如果我已经计算了最后一个节点后代的值,那么在计算其父节点时,是否有任何方法可以获得已经计算的节点的值,并只添加直接后代的值。不需要一次又一次地计算相同的内容。您可以
在节点中使用{x}更新文档,而不只是返回计算值
,以便以后可以访问它。但是为了避免混淆,我不会称之为
x
,也许
xCached
或者类似的东西更好?然后,您可以显式地检查该属性(
HAS(doc,“xCached”)
)并使用它,但请注意不要将其用于不同的路径,否则会导致
x
的不同总和。
[
  {
    "_id": "nodes/2699394",
    "_key": "2699394",
    "_rev": "2699394",
    "x": 15
  }
]