如何在ArangoDB中找到名为x的所有子代属性之和?
因为我的图形数据库ArangoDB中有树结构,如下所示 id为2699394的节点是此图形树的父节点。每个节点都指定了名为X的属性。我想知道父节点2699394的所有子代的x的总和,不包括它自己的属性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
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
}
]