问题描述
我正在尝试按集合名称计算相邻边。
例如,我有一个顶点集合“User”,它的出站边为 ['visited','add_to_cart','purchased']。
所以最终的回报是这样的
{ 用户 ID : "user_1",访问次数:3, add_to_cart_count : 5,购买_cnt : 1 }
我已经尝试了以下查询,但我怀疑它是否能发挥最佳性能,因为它使用 if else 条件,我猜它会影响整体性能。
我尝试的查询:
FOR user IN User
FOR v,e,p IN OUTBOUND user visited,add_to_cart,purchased
COLLECT user_id = user.user_id
AGGREGATE
visit_count = SUM(SPLIT(e._id,'/')[0] == 'visited'? 1 : 0),add_to_cart_count = SUM(SPLIT(e._id,'/')[0] == 'add_to_cart'? 1 : 0),purchase_cnt = SUM(SPLIT(e._id,'/')[0] == 'purchased'? 1 : 0)
RETURN {
user_id,visit_count,add_to_cart_count,purchase_cnt
}
如果这是最好的方法,我可以利用任何与索引相关的收益吗?
期待您的帮助:)
谢谢。
解决方法
感谢来自 arangoDB 社区的 tobias,我可以让它快 30%。
LET vis = (FOR e IN visited COLLECT user_id = e._from WITH COUNT INTO n RETURN {user_id,visit_count: n})
LET cart = (FOR e IN add_to_cart COLLECT user_id = e._from WITH COUNT INTO n RETURN {user_id,add_to_cart_count: n})
LET purc = (FOR e IN purchased COLLECT user_id = e._from WITH COUNT INTO n RETURN {user_id,purchase_cnt: n})
FOR x IN UNION(vis,cart,purc)
COLLECT user_id = x.user_id AGGREGATE visit_count = SUM(x.visit_count),add_to_cart_count = SUM(x.add_to_cart_count),purchase_cnt = SUM(x.purchase_cnt)
RETURN {user_id,visit_count,add_to_cart_count,purchase_cnt}
他提到的重点是直接收集边缘集合!