如何在ArangoDB中查找所有名为x的后代属性的总和?

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

因为我在我的图形数据库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。那么谁能用ArangoDBAQL查询一下这个计算呢?
为了找出没有后代的特定节点,我已经使用下面的查询,

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

提前感谢Mayank

bn31dyow

bn31dyow1#

假设子项链接到其父项,则数据可以如下所示:

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

要遍历子节点链,我们需要沿“入界”方向遍历(如果父节点指向子节点,则为“出界”方向):

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

在本例中,通过指定边集合 relations 来使用匿名图。您也可以使用命名图,如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
  }
]

相关问题