2016-09-21 135 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

我的團隊正在努力設置! –