3

並行環境でNeo4jを使用していますが、次のようなグラフがあります。

グラフ

各アイテムは、なし、または最大で3つの状態(、、S1およびS2)のいずれかになりS3ます。アイテムはその状態を変更でき、フローは次のようになります。アイテムはどの状態にも存在せず、次にS1S2そして最後にS3

S1これは、アイテムを追加するときに、アイテムが、、S2またはにすでに存在するかどうかを確認する必要があることを意味しS3ます。もしそうなら、私はそれを再び追加するべきではありません。さらに、アイテムが入っS1ていて、フロー内の次の状態に進むように要求された場合、アイテムを最初に削除してからS1、に追加する必要がありますS2

並行環境であるため、これらの操作はすべてアトミックに実行する必要があるため、各状態にインデックスを設定しても、この問題は解決されません。私はこのリンクを確認しましたが、悲観的なロックアプローチを採用することしか考えられませんでした。例に基づいて、新しいアイテムを追加するための擬似コードは、次のようになります。

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) {}聞こえますが、このソリューションを続行するには少し説明が必要です
  2. 参照ノードを#lockNode#として使用するとどのような影響がありますか?
  3. アトミックに同期して3つのインデックスで検索を実行し、ノードを状態に追加/移動することは可能ですか?

Java同期を使用することでこれを簡単に解決できますが、ドキュメントには、これを行うべきではないと明確に記載されています。私のようなNeo4j初心者のための助けをいただければ幸いです。

4

2 に答える 2

1

アイテムは1つの状態しか持てないため、インデックスは1つだけで、指定したリンクで「取得または作成」の手法を使用できます。アイテムの状態を知るために、あなたはディングル関係を横断し、次に状態ノードを横断することができます。または、2つのプロパティ(名前と状態)を使用してインデックスを作成できます。または4つのインデックスがあります

参照ノードをロックするとボトルネックが発生し(s1ノードのみをロックすると少し少なくなります)、一意のノードを作成するには、get-or-createを使用するのが最善の方法だと思いますが、他に良い方法はわかりません。

同期は、neo4jの内部ロックシステムと「競合」してデッドロックを引き起こす可能性があるため、大したことではありません。

于 2012-10-03T07:11:23.007 に答える
0

コード内のLock-Nodeは、 `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

于 2012-10-07T21:08:17.207 に答える