1

より親しみやすい URL を持つことができるように、子オブジェクトの親しみやすい ID を作成したい関係がたくさんあります。

特定の親オブジェクトの子オブジェクトを作成するたびに、順次増加するフレンドリ ID を自動的に含めたいと考えています。したがって、最初の子はフレンドリー ID 1、2 番目の子はフレンドリー ID 2 などになります。子が削除された場合、ID を再利用したくありません。複雑なことに、私がこれをやりたいと思うような関係がたくさんあります。

現在、親ノードにいくつかの状態をキャッシュしており、それを使用して、子を作成するときにフレンドリ ID を設定しています。

CREATE (o:Foo {name: 'parent', nextChildId: 1})

MATCH (o:Foo)
WHERE o.name = 'parent'
CREATE (o)-[:HAS]->(c:Child {name: 'child1', friendlyId: o.nextChildId})
SET o.nextChildId = o.nextChildId + 1

MATCH (o:Foo)
WHERE o.name = 'parent'
CREATE (o)-[:HAS]->(c:Child {name: 'child2', friendlyId: o.nextChildId})
SET o.nextChildId = o.nextChildId + 1

問題は、2 つのクライアントが同時に子を作成しようとする可能性があるため、2 つの子が同じフレンドリ ID を持つ可能性があることです。これを防ぐ方法がわかりません。

4

2 に答える 2

1

Neo4j はACID に完全に準拠しています。SERIALIZABLE分離レベルのトランザクションでこれを実行し、対象のノードでロックを取得できます。ただし、これによりパフォーマンスが低下する可能性があることに注意してください。

于 2013-08-23T01:26:20.257 に答える