2016-09-21 134 views
6

在我的ArangoDB图中,我有一个主题,与该主题相关的消息线程以及这些消息线程中的消息。我想以这样一种方式遍历图:我返回与消息线程相关的数据以及消息线程中的消息数。数据结构相当简单:我有主题节点,边界延伸到线程节点,日期和类别关联,边线从节点到消息节点。ArangoDB:通过图遍历聚合计数

我想返回存储在线程节点中的数据和附加到线程的消息数量。

我不知道如何用for v, e, p in 1..2 outbound语法来做到这一点。我是否应该在其中嵌入一个嵌套图形for v, e, p in outbound?这仍然是高性能的吗?

回答

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

+0

这实际上是我的团队一直在做的事情。目前,这些聚合每个大约需要5秒,但是当六个同时运行时,服务器会显着减速并且查询开始需要30-40秒。这是约60个线程与多达70,000消息。大概当我们进入集群时,我们会看到它回到大约5秒钟,但我们真的希望更快。 –

+0

好了解;)是否有可能给我们一些匿名数据集,以便我们可以尝试优化正在发生的事情?对于我们来说,使用“真实”数据集比使用“真实”数据集要容易得多。我们愿意为此签署一份保密协议(我没有详细通报所有的沟通情况,所以如果我们已经从你那里得到了这样一个数据集,我会帮助你的,并加快查询速度)我也不满意一切高于1秒。 – mchacki

+0

我的团队正在努力设置! –