2012-10-30 144 views
0

讓我們假設一個非常簡單的人(作爲節點)和KNOWS-和FRIEND_OF-中間關係的示例圖。 現在我想讓每個知道隨機人員的節點都是FRIEND_OF(這個或另一個人)。請考慮,我想使用遍歷來檢查這些關係,而不是簡單的node.hasRelationship()。Neo4j:遍歷返回

因此我將描述一個TraversalDescription,它在其Evaluator中檢查路徑長度,並在步驟1中選擇KNOWS關係。如果有一個I(自動)轉到路徑中連接的KNOWS節點,必須退回到傳出節點。因此,我只需檢查傳入的KNOWS關係的path.length == 2時間,並在當前遍歷的節點具有path-startnode的標識時將continue-variable設置爲true。

問題:我從來沒有回到path-startnode(我檢查了KNOWS關係的那個),它從不出現在評估器中;我也嘗試使用不同的UNIQUENESS參數,但沒有一個能夠工作。

/編輯: 這是我穿越描述(僞代碼或多或少):

TraversalDescription td = Traversal.description() 
    .relationships(RelTypes.KNOWS, Direction.BOTH) 
    .relationships(RelTypes.FRIEND_OF, Direction.OUTGOING) 
    .uniqueness(Uniqueness.NONE) 
    .evaluate(new Evaluator(){ 
     public Object evaluate(final Path path){ 
      if (path.length == 0) return EXCLUDE_CONTINUE; 
      Relation currentRel = path.lastRelationship(); 
      boolean continue = false; 
      boolean include = false; 
      if (path.length == 1){ 
       // check for outgoing knows-relation 
       continue = currentRel.isType(KNOWS) && currentRel.startNode().getId == path.startNode().getId(); 
      } 
      else if (path.length == 2){ 
       // check for outgoing knows-relation to the original start node 
       // SECOND PART OF STATEMENT NEVER GETS TRUE! 
       toContinue = currentRel.isType(KNOWS) && currentRel.startNode().getId == path.startNode().getId(); 
      } 
      else if (path.length == 3){ 
       // ... 
      } 
      return Evaluation.of(toContinue, include); 
     } 

回答

0

嘗試

private static Traverser getHomies(final Node ofPerson) { 
     TraversalDescription td = Traversal.description().breadthFirst().relationships(RelTypes.KNOWS, Direction.INCOMING) 
       .relationships(RelTypes.FRIEND_OF, Direction.OUTGOING).evaluator(Evaluators.includingDepths(1, 2)) 
       .evaluator(Evaluators.returnWhereLastRelationshipTypeIs(RelTypes.FRIEND_OF)); 

     return td.traverse(ofPerson); 
    } 

你的僞代碼:

  • 說,沒有路徑應該是包括 - 字段包括是每次虛假
  • 你的說法的第二部分是沒有可比性(==),它是一個賦值(=)
+0

是的,感謝您的評論。如上所述:它只是僞代碼,所以不要介意include字段總是假的。在示例中將分配給比較。 當我有機會測試你的遍歷時會回來。 – funglejunk