2016-05-09 24 views
0

我想基於2個節點之間的路徑長度2的傳遞關係添加新的關係,所有這些關係都是相同類型(:TRUST)。我正在使用Java API,並得到如下所示的工作,但似乎新添加的關係最終會出現在我的結果迭代器中,儘管它在執行查詢時並不存在。無論如何,我可以避免它?從查詢結果中迭代關係,同時添加同一類型的新關係

private final String FIND_TRANSITIVE_RELATION_QUERY = 
     "MATCH (a:" + TwitterLabels.USERS + ") " + 
       "- [ab:" + TwitterRelationships.TRUST + "] -> " + 
       "(b:" + TwitterLabels.USERS + ") " + 
       "- [bc:" + TwitterRelationships.TRUST + "] -> " + 
       "(c:" + TwitterLabels.USERS + ")\n" + 
       "WHERE a <> c\n" + 
       "return ab, bc"; 

public void insertSimpleTransitiveTrust(){ 
    try (Transaction tx = graphDb.beginTx()) 
    { 
     Map<String, Object> params = new HashMap<String, Object>(); 
     Result result = graphDb.execute(FIND_TRANSITIVE_RELATION_QUERY, params); 

     while(result.hasNext()){ 
      Map<String, Object> map = result.next(); 
      Object object = map.get("ab"); 
      Relationship trustAb = (Relationship) object; 
      object = map.get("bc"); 
      Relationship trustBc = (Relationship) object; 

      Node nodeA = trustAb.getStartNode(); 
      Node nodeB = trustAb.getEndNode(); 
      Node nodeC = trustBc.getEndNode(); 

      Relationship transitiveTrust = nodeA.createRelationshipTo(nodeC, TwitterRelationships.TRUST); 
      transitiveTrust.setProperty("transitiveTrust", trustBc.getPropety(TwitterProperties.CONVERSATIONAL_TRUST)); 

     } 


     tx.success(); 
    } 

回答

0

這兩個迭代和修改都在同一個事務中運行。這就是爲什麼你看到你自己的修改。

爲了防止執行的另一個事務的修改在不同的線程,使用這種方法看到APOC程序的代碼片段:https://github.com/neo4j-contrib/neo4j-apoc-procedures/blob/master/src/main/java/apoc/periodic/Periodic.java#L230-L260

+0

感謝您的答覆,這將有可能簡單介紹一下怎麼用它在我的情況?謝謝。 – Aithusa

+0

嗨我嘗試使用的代碼,但它給了我NotInTransactionException。我在線閱讀說,事務是綁定到一個線程,是否在單線程執行器中創建事務將它綁定到消費者所在的另一個線程? – Aithusa