按每个顶点的名称计算相邻边的最佳方法是什么?

问题描述

我正在尝试按集合名称计算相邻边。

例如,我有一个顶点集合“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}

他提到的重点是直接收集边缘集合!