gpt4 book ai didi

ArangoDB - DAG 中后代属性的聚合和

转载 作者:行者123 更新时间:2023-12-03 06:32:43 25 4
gpt4 key购买 nike

我有一份 Material list ,在 ArangoDB 中表示为有向无环图。 Material list 中每个零件的数量由边缘表示,而零件名称则由节点的键表示。我想编写一个查询,从祖先节点向下遍历 DAG,并按部件名称对每个部件的数量求和。例如,请考虑以下图表:

       Qty: 2          Qty: 1         
Widget +------> Gadget +------> Stuff
+ + Qty: 4
| Qty: 1 +---------> Thing
+----------------------------^

Widget 包含两个 Gadget,每个小工具包含一个 Stuff 和四个 ThingsWidget 还包含一个 Thing。因此,我想编写一个 AQL 查询,该查询从 widget 开始遍历图表并返回:

{
"Gadget": 2,
"Stuff": 2,
"Thing": 9
}

我相信collectaggregate可能是我在这里的 friend ,但我还没有找到正确的咒语。部分挑战在于零件的所有后代数量都需要乘以其父数量。在深度约为 10 层的 DAG 上有效执行此求和的查询会是什么样子?

最佳答案

我想到了三种可能的选择:

1.- 从路径返回值,然后汇总应用服务器中的数据:

FOR v,e,p IN 1..2 OUTBOUND 'test/4719491' 
testRel
RETURN {v:v.name, p:p.edges[*].qty}

这将返回小工具 2、东西 [2,1]、事物 [2,4]、事物 [1]

2.- 枚举路径上的边,直接得到结果:

FOR v,e,p IN 1..2 OUTBOUND 'test/4719491' 
testRel
let e0 = p.edges[0].qty
let e1 = NOT_NULL(p.edges[1].qty,1)
collect itemName = v.name aggregate items = sum(e0 * e1)
Return {itemName: itemName, items: items}

这会正确返回 Gadget 2、Stuff 2、Thing 9。

这显然需要您事先知道级别数。

3.- 编写一个类似于现有“SUM”函数的自定义函数“multiply”,以便可以将数组的值相乘。查询类似于:

let vals = (FOR v,e,p IN 1..2 OUTBOUND 'test/4719491' 
testRel
RETURN {itemName:v.name, items:SUM(p.edges[*].qty)})
for val in vals
collect itemName = val.itemName Aggregate items = sum(val.items)
return {itemName: itemName, items: items}

因此您的函数将替换内部子选择中的 SUM。 Here是自定义函数的文档

关于ArangoDB - DAG 中后代属性的聚合和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53638787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com