簡體   English   中英

AQL-圖遍歷-復雜條件路徑上的過濾

[英]AQL - graph traversal - filtering on path with complex condition

我想問一問如何最好地遍歷圖,並根據復雜的條件僅返回子圖,這是從根到葉的所有節點都必須滿足的條件。 換句話說,我需要某種機制,以便在不滿足任何中間級別的條件時,停止遍歷(不處理任何嵌套節點並返回到輸出)

假設我有以下圖表:

A -> B -> C (active=false) -> D

在這里我停用了節點C(請注意,標記active = false表示所有子圖都已停用,包括C和D)。

根據文檔,我可以通過對路徑,通配符[*]和ALL關鍵字進行過濾來輕松構造此類過濾器,當不滿足C的條件時,它們也將停止遍歷。 在簡單的條件下,這很好用:

for v,e,p in 1..100 outbound 'test/A' graph 'testGraph'
  filter p.vertices[*].active ALL != false return v
  // returns A, B

現在,我有另一個圖,其中每個節點都是固定的,或者具有一些有效時間跨度(從,到)屬性:

A (type="fixed") -> B (from=2,to=3) -> C (from=1, to=5) -> D (type="fixed")

現在,我只想返回子圖,其中所有(中間)節點都是固定的,或者滿足從> = 2到<= 3的時間條件。 我需要退還A,B。

for v,e,p in 0..100 outbound 'test/A' graph 'testGraph'
  filter p.vertices[*].type ALL == 'fixed' or
    (p.vertices[*].from ALL >= 2 and p.vertices[*].from ALL <= 3)
  return v

但是,這顯然是錯誤的(並且僅返回A),從邏輯上講,我需要在條件的開頭添加ALL關鍵字(我需要將條件應用於每個級別,並且當不滿足條件時,將停止遍歷)不支持:

filter ALL(p.vertices[*].type == 'fixed' or
  (p.vertices[*].from >= 2 and p.vertices[*].from <= 3)

通過對頂點進行過濾的經典方法無法滿足我的需求,因為在不滿足條件時它不會停止遍歷,即以下返回A,B,D(C被跳過,但我還需要修剪C的子樹,以便D不在輸出上):

for v,e,p in 0..100 outbound 'test/A' graph 'testGraph'
  filter  v.type == 'fixed' or 
    (v.from >= 2 and v.from <= 3)
  return v

有任何想法嗎? 謝謝。

AQL PRUNE功能是在ArangoDB版本3.4.5和3.5.0中引入的。 使用AQL關鍵字PRUNE時,如果滿足頂點,邊,路徑或之前之前定義的任何變量的條件,則停止運行。

修剪是制定條件以減少搜索過程中要檢查的數據量的最簡單變體。 因此,它可以提高查詢性能並減少查詢所產生的開銷。 修剪可以在頂點,邊和路徑以及之前定義的任何變量上執行。

視頻教程通過一個動手示例演示了FILTER和新PRUNE之間的區別。 您可以在文檔中找到更多詳細信息。

暫無
暫無

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

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