2012-10-03 36 views
3

我在並行環境中使用Neo4j的,我有圖表,看起來像這樣:Neo4j的圖形操作

Graph

每個項目可以在沒有或最多3狀態之一(S1,S2S3)。一個項目可以改變其狀態,並且流程如下:項目不存在於任何狀態,然後S1,S2,最後S3

這意味着當添加一個項目時,我將不得不檢查它是否已經存在於S1,S2S3。如果是,那麼我不應該再添加它。另外,如果物品在S1中,並且被要求轉到流程中的下一個狀態,則必須首先從S1中刪除物品,然後將其添加到S2

在每個狀態上都有一個索引並不能解決這個問題,因爲所有這些操作都必須以原子方式發生,因爲它是一個併發環境。我檢查了this link,我只能想到悲觀鎖定的做法。添加一個新的項目,基於示例的僞代碼,應該是這樣的:

search for node in all states 
if node is present in any state 
    return node 
else 
    begin transaction 
     get a write lock on #lockNode# 
     create node 
     add node to initial state 
    commit 
    return node 
end 

中的僞從狀態變化到另一種狀態應該是非常相似的前一個。

所以問題是:

  1. 什麼是#lockNode#我的僞代碼?我無法從這個例子中弄明白。聽起來像它類似於synchronized (lockNode) {},但我需要一點點exaplanation繼續這個解決方案
  2. 使用參考節點作爲#lockNode#的影響會是什麼?
  3. 是否有可能以原子方式並以同步方式在三個索引中執行搜索,然後將該節點添加/移動到某個狀態?

我可以很容易地通過使用Java同步來解決這個問題,但文檔明確指出不應該這樣做。任何像我這樣的Neo4j新手的幫助將不勝感激。

回答

1

由於項目只能處於一種狀態,因此只能有一個索引,並在您提供的鏈接中使用「獲取或創建」技術。要知道物品的狀態,你可以遍歷丁格爾關係,然後是狀態節點。或者您可以使用2個屬性(名稱&狀態)進行索引。或者有4個索引

鎖定參考節點會產生一個瓶頸(如果只鎖定s1節點,會少一點),並且爲了創建獨特的節點,我認爲最好的方法是獲取或創建的東西,我不會「知道任何其他的好辦法

同步也是一個很大的禁忌,因爲它可以‘衝突’與Neo4j的內部鎖定系統,並創建死鎖

0

鎖定節點在你的代碼是`lockNode .removeProperty(「__ non_existing_property」)或通過事務顯式獲取鎖。

Transaction tx = graphDb.beginTx(); 
try { 
    tx.acquireWriteLock(lockNode); 
    // do something 
    tx.success(); 
} 
finally { 
    tx.finish(); 
} 

從Neo4j的手冊: http://docs.neo4j.org/chunked/snapshot/transactions-unique-nodes.html