簡體   English   中英

在 ArangoDB 中通過遍歷過濾返回組

[英]Filtering a return group by traversal in ArangoDB

我正在評估要使用 ArangoDB 來代替 OrientDB。 我的數據集本質上是一個不必要連接的樹的森林(家譜)。

因為數據集是一個有向無環圖(一棵樹),所以沿着樹上走尋找東西總是比沿着樹下走更有效。

在 OrientDB 的早期版本中,在他們為我刪除這個關鍵特性之前,我能夠執行以下查詢:

SELECT FROM Person WHERE haircolor = "Red" and in traverse(0, -1, "in") (birth_country = "Ireland")

由於 haircolor 是一個索引字段,因此獲取所有這些頂點是有效的。 神奇之處在於 WHERE 子句中的遍歷運算符,如果它找到來自愛爾蘭的任何祖先,它會停止遍歷並立即返回 TRUE。

是的,你可以把它轉過來,尋找所有來自愛爾蘭的人,然后向下走,尋找那些討厭的紅發女郎,將它們歸還,但它的效率要低得多,因為你必須評估每條向下的路徑,這可能會呈指數級增長。

由於 OrientDB 通過刪除該功能(在我看來)自取其辱,我想知道是否有一個 ArangoDB 查詢可以在不走下樹的情況下執行類似的任務。

在此先感謝您的幫助!

在 AQL 中,它會 go 是這樣的:

FOR redhead IN Person                             // Find start vertices
  FILTER doc.haircolor == "Red"
  FOR v, e, p IN 1..99 INBOUND redhead Ancestor   // Traversal up to depth 99
    PRUNE v.birth_country == "Ireland"            // Don't walk further if condition is met
    RETURN p                                      // Return the entire path

這假設關系(邊)存儲在名為Ancestor的邊集合中。

PRUNE防止進一步向下(或此處:向上)路徑遍歷,但包括它所在的節點。 https://www.arangodb.com/docs/stable/aql/graphs-traversals.html#pruning

請注意,可變深度遍歷不僅返回最長路徑,還返回同一路線的“中間”路徑。 您可能希望在客戶端將它們過濾掉,或者以額外的遍歷為代價查看此 AQL 解決方案: https://stackoverflow.com/a/64931939/2044940

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM