2014-11-14 88 views
2

一些背景信息:我有一個「問答」網站,有很多帖子和用戶。數據存儲在MSSQL數據庫中。我很感興趣的是圖形數據庫如何幫助用戶產生有趣的結果,比如建議類似的用戶或者建議相關的帖子。ArangoDB:GRAPH_NEIGHBORS產生錯誤「[1909]迭代太多」

我設法進口的所有帖子和用戶(僅適用於它們的ID)和「後張貼」和「後向用戶」關係,從一個測試數據庫到ArangoDB數據庫,並結束了4個集:

  1. 帖子:文檔集,9833項
  2. 用戶:文件集,1264項
  3. parentToChildPosts:邊收集存儲從父後關係到一個孩子後,4978項
  4. postToUsers:邊收集從郵件存儲關係給它的主人你ser,9833條目。

然後,我用2條邊建立了一個圖形「postGraph」,並創建了一個基於「用戶帖子」和「帖子後」關係實現簡單的「類似用戶」算法的AQL查詢。下面是該查詢搜索前10名類似的用戶來進行用戶與_id「用戶/ 1」:

FOR e in GRAPH_NEIGHBORS('postGraph', 'users/1', 
{ edgeCollectionRestriction: ['parentToChildPosts', 'postToUsers'], 
    vertexCollectionRestriction: 'users', 
    minDepth: 3, 
    maxDepth: 3 }) 
FILTER e.vertex._key != '1' 
COLLECT userid = e.vertex._key INTO g 
SORT LENGTH(g) DESC 
LIMIT 10 
RETURN userid 

在視覺上,我開始從一個用戶的用戶/ 1的搜索,並找到路徑給其他用戶如下:

user => post => parent/child post => user。

所以遍歷的深度爲3。然後我排除用戶本人(FILTER),組由用戶密鑰和計算結果的數量和搶前10

我測試查詢和它的工作了大多數用戶,但未能對一些活躍用戶提供了錯誤:

[1909年]太多的迭代

查詢運行(在一秒鐘內)相當快,並給出了錯誤。其中一個失敗的活躍用戶有727個帖子(在我看來沒有那麼多)。

我也嘗試過其他2種方式來實現該算法:

  1. 寫3個GRAPH_NEIGHBORS查詢模仿3個步驟之一穿越:慢得多。第一次運行需要大約3秒。
  2. 使用連接(不使用任何圖功能):相當快。

從文檔中,ArangoDB建議使用圖形函數來處理這種情況。所以我不贊成使用Join(給我一種感覺,我也可以在SQL中做到這一點,所以爲什麼要使用圖形數據庫)。

任何建議如何使GRAPH_NEIGHBORS快速工作沒有任何錯誤?或者其他任何建議如何建立圖表,如圖表可以增長多大?

回答

5

嗨,你是完全正確的,GRAPH_NEIGHBORS函數正是爲此而構建的。 有一個參數maxIterations限制一次遍歷(其中GRAPH_NEIGHBORS被映射到)將觸及的頂點數量,並且您的圖形結構可能會在那裏達到默認值(10000)。我們實現了這個值來防止無限循環。 所以要解決這個問題,你只需增加這個值即可。 另外我還有另一個表現提示: *如果您的圖只包含兩個edgeCollections,您不必爲限制設置它們。所以我們可以在那裏保存一張支票。 (不會很顯著)

這裏是一個更新的查詢:

FOR e in GRAPH_NEIGHBORS('postGraph', 'users/1', 
    { maxIterations: 1000000, 
    vertexCollectionRestriction: 'users', 
    minDepth: 3, 
    maxDepth: 3 }) 
FILTER e.vertex._key != '1' 
COLLECT userid = e.vertex._key INTO g 
SORT LENGTH(g) DESC 
LIMIT 10 
RETURN userid 

如需進一步信息,請堅持AQL遍歷文檔中的信息。 GRAPH_NEIGHBORS也提供一切可用GRAPH_NEIGHBORS https://docs.arangodb.com/Aql/GraphOperations.html

+0

嗨!非常感謝您的回覆。我在GRAPH_NEIGHBORS下看不到「maxIterations」選項。我實際上搜索過它,只在「GRAPH_TRAVERSAL」選項下找到它。該文件不是最新的:)?我也只是嘗試了你的建議,但它仍然產生了錯誤。我嘗試了不同的maxIterations數字(甚至只是10),但它仍然產生相同的錯誤。 – ydou 2014-11-14 20:03:01

+0

好吧,我會檢查是否有錯誤 – mchacki 2014-11-14 20:40:36

+0

maxIterations選項存在問題,它既沒有記錄也沒有通過。我將在下一個版本中解決這個問題(2.3.1) – florian 2014-11-18 08:30:29