ArangoDB:通过图遍历汇总计数

6
在我的ArangoDB图形中,我有一个主题,与该主题关联的邮件线程和邮件线程内的邮件。我希望以这样的方式遍历图形,以返回与邮件线程相关联的数据以及邮件线程内的邮件计数。
数据结构相当简单:我有主题节点,延伸到线程节点的边缘与相关的日期和类别,以及从线程节点到邮件节点的边缘。
我想返回存储在线程节点中的数据以及附加到线程的邮件计数。
我不确定如何使用for v, e, p in 1..2 outbound语法完成此操作。我应该只是用一个嵌套在其中的图形进行 for v, e, p in outbound 吗?那样还能保证性能吗?
1个回答

7

抱歉耽搁了,我们正在努力准备3.1版本发布;)

我认为你已经找到了正确的解决方案:在1..2 OUTBOUND语句中表达你想要实现的内容并不容易。 用两个1..1 OUTBOUND语句来表达会更容易。

根据你的解释,我认为以下查询是你需要使用的:

FOR thread IN 1 OUTBOUND @start @@threadEdges
  LET nr = COUNT(FOR message IN 1 OUTBOUND thread @@messageEdges RETURN 1)
  RETURN {
    date: thread.date,
    category: thread.category,
    messages: nr
  }

对于说明:首先我选择相应的线程。 接下来,我执行一个子查询来简单地获取一条线程的信息。 最后,我返回我需要的信息。

在性能方面: 在数据访问方面(这很可能是“瓶颈”操作),FOR x IN 1..2 OUTBOUND [...]FOR x IN 1 OUTBOUND [...] FOR y IN 1 OUTBOUND x [...] 没有区别,两者都必须查看完全相同的文档。 后一种情况下的查询优化可能会慢一点,但差异远低于1ms


这实际上就是我的团队一直在做的事情。目前,每个聚合大约需要5秒钟,尽管当同时运行6个时,服务器会显著减速,并且查询开始需要30-40秒钟。这是针对大约60个线程和最多70,000条消息的情况。假定当我们使用集群时,我们会看到它回到大约5秒钟,但我们真的很想让它更快。 - Nate Gardner
好的,明白了 ;) 你能否提供一些匿名数据集,以便我们尝试优化正在进行的工作?对于我们来说,使用“真实”数据集总比生成一个数据集容易得多。我们愿意为此签署保密协议(我不是详细了解所有正在进行的通信,所以如果我们已经从您那里获得了这样的数据集,我会找到它并更快地回复您)。我也对超过1秒的所有内容感到不满意。 - mchacki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接