2017-07-31 98 views
1

我在ArangoDB中有兩個頂點集合P和F,以及一個包含兩種邊的邊集合:fp和hp。如何停止基於入站邊緣的遍歷

enter image description here

注意,圖像上面已經簡化 - 的「F」的節點經由多個「FP」邊緣本身連接至另一架F節點。換句話說,我不知道(例如)「F4」是否有入站「fp」邊緣或更多。

我想使用一個AQL查詢來遍歷圖,從節點PA開始,但是停止在沒有入站「hp」邊的任何頂點。該Documentation表明,停止遍歷的方法是使用類似的查詢:

FOR v, e, p IN 0..100 OUTBOUND 'P/PA'GRAPH 'test' 
    FILTER p.<vertices|edges>... <condition> 
    RETURN v 

而且我希望看到:

PA, PC, PE, PF 

但我不知道該如何實現,如果沒有第一填充「P」節點上的新屬性表明它們具有入站「fp」邊緣。如果我這樣做,這會接着是可能的:

FOR v, e, p IN 0..100 OUTBOUND 'P/PA'GRAPH 'test' 
    FILTER p.vertices[*].hasFP ALL == true 
    RETURN v 

有沒有辦法實現這個沒有預處理步驟,在一個AQL查詢?

回答

1

您可以使用以下查詢來做到這一點。它在你的起點P/PA處開始遍歷並檢查是否沒有連接邊緣(起點本身需要)或邊緣的typehp。然後開始對每個找到的頂點直接或間接連接P/PA的深度爲1和方向INBOUND的另一遍歷。這裏它過濾邊type等於fp並返回來自周圍遍歷的頂點。在此RETURN中需要DISTINCT,否則您的起點將返回兩次。

FOR v, e, p IN 0..100 OUTBOUND 'P/PA' GRAPH 'test' 
    FILTER e == null 
    OR e.type == 'hp' 
    FOR v1, e1, p1 IN 1 INBOUND v._id GRAPH 'test' 
    FILTER e1.type == 'fp' 
    RETURN DISTINCT v 
+0

嗯,可惜這仍然返回「PD」的結果中,與頂點在非深度優先順序返回... – rfernandes

+1

好吧,現在我明白你的情況了。 AQL目前不可能。目前,你對hasFP標誌的想法應該是最好的解決方案。 – mpv1989

0

如果我理解正確的問題,答案是:使用子查詢來檢查條件。然而,不幸的是,目前AQL不支持修剪,因此(使用當前版本,即3.2),這種方法可能太慢。

簡言之,子查詢應該是這樣的:

(FOR v0 IN p.vertices 
    LET hasP = (FOR v1, e1 IN 1..1 INBOUND v0 GRAPH 「test」 
       FILTER e1.type == 「fp」 
       COLLECT WITH COUNT INTO c 
       RETURN c>0) 
    FILTER hasP 
    COLLECT WITH COUNT INTO c 
    RETURN c == LENGTH(p.vertices))