2013-12-23 28 views
1

可以將TraversalDescription配置爲接收沒有一對路徑作爲另一路徑的子路徑(尤其是前綴)的路徑的集合嗎?TraversalDescription中沒有包含彼此的路徑

+1

請澄清你的問題,例如通過一個示例圖形顯示你想要做什麼。 –

+0

這實際上意味着你永遠不會走出一條路,但總是隻遵循一種關係,那麼你的「RelationshipExpander」就會照顧到這一點。否則,對於每個分支你都會得到你不想要的共享前綴。 –

回答

2

有,使用評估者。

給出的示例圖表:

A->B->C 

A(反向,在這個例子中)穿越由C沒有評估將返回三個路徑:

{C, B->C, A->B->C} 

比方說,我感興趣的遍歷到圖的輸入(在這種情況下,'A')。如果路徑中的最後一個節點是輸入,我可以通過終止並返回一個路徑來實現。我創建評估器對象(像下面):

public class TerminalEvaluator implements Evaluator { 

    @Override 
    public Evaluation evaluate(Path path) { 
     if (path.endNode().hasRelationship(Direction.INCOMING)) { 
      return Evaluation.EXCLUDE_AND_CONTINUE; 
     } 
     return Evaluation.INCLUDE_AND_CONTINUE; 
    } 
} 

這會檢查路徑的端末節點是否爲輸入(即,不具有輸入的關係/邊緣)。如果它不是輸入,則它將從遍歷返回的集合中排除該路徑,並繼續返回Evaluation.EXCLUDE_AND_CONTINUE。如果該節點是輸入,則它會在返回的集合中包含該路徑(使用Evaluation.INCLUDE_AND_CONTINUE)。

您將需要設置評價者 - ,在我的玩具例子給出了一個名爲「graphDb」 GraphDatabaseService(我已經排除驅動反向這個穿越的代碼):

graphDb.traversalDescription().depthFirst().evaluator(new TerminalEvaluator()) 

運行此遍歷返回一個路徑:

A->B->C 

修改評估方法,並且還改變遍歷順序(例如,以深度優先的後序遍歷)將允許更復雜的行爲,其可以是或可以不是使用的給你。