2015-05-19 49 views
3

請仔細閱讀下面的代碼,增加了一個屬性,每個節點在任意大圖的所有元素。迭代器在事務中創建。在迭代事務過程中,創建的事務完成並創建一個新事務(以限制用於正在進行的寫操作的內存)。從這一點開始,我們繼續從該迭代器中獲取節點,但是從另一個事務中獲取節點。這個可以嗎?這些方法是否被設計爲一旦被調用就無需事務就可以工作?如何變異的Neo4j的圖形

JavaDoc包含一個神祕的警告:請注意返回的ResourceIterable已正確關閉,並儘可能在事務內部關閉以避免可能的寫操作阻塞。顯然ResourceIterable不能在我們完成迭代之前關閉,那麼這個警告試圖傳達什麼?

Transaction tx = database.beginTx(); 
try {ResourceIterable<Node> nodes = GlobalGraphOperations.at(database).getAllNodesWithLabel(label); 
    long i = 0L; 
    for (Node node : nodes) { 
     node.setProperty("property", "update"); 
     i++; 
     if (i % commitInterval == 0) { 
      tx.success(); 
      tx.close(); 
      tx = database.beginTx(); 
     } 
    } 
    tx.success(); 
} 
finally { 
    tx.close(); 
} 

回答

1

警告消息是想說,如果你把這樣的鎖,在DB其他的事情可能無法同時修改數據庫。既然你在全球範圍內這樣做,這可能會給你帶來問題。

幸運的是,它看起來像你正在試圖做的可以更簡單地使用一個暗號命令來完成什麼,然後通過java和這種方法。查詢將是:

MATCH n SET n.property="update"; 

你可以consult the docs如何從java運行該密碼查詢。

此外,我認爲一般GlobalGraphOperations可能會被棄用,所以你可能希望檢查其他方式來改變整個圖(如我在這裏提供的),而不是使用該java類。

+0

是否有興趣Cypher支架是如何實現這一無鎖對其他線程更新模型。應該能夠在沒有開銷的情況下完成同樣的任務。 –

+0

我不能深入瞭解如何鎖定將在這個暗號例如工作進行評論,我只知道,這是更簡單和更安全地做這種方式,並且有你沒有使用任何棄用的API – FrobberOfBits

+0

我巨大的上漲空間可能是錯誤的,但我不認爲Cypher做任何事情來批量寫入。 –

1

你不應該從同一個迭代器實例拉節點,但可以繼續從不同的一個拉他們,你會看到在更新和一些節點的一些不依賴多遠您的更新已經走過了。

不要從另一個TX別的地方使用迭代器。

+0

謝謝邁克爾。如果我想迭代所有節點,是否有辦法告訴每個迭代器如何恢復我離開的位置?謝謝。 –

+0

思考完之後,您可能會停止迭代並繼續使用源迭代器進行操作。 –

+0

即使在新交易的背景下? –