2016-11-17 14 views
1

Neo4j 3.0.6を実行していて、大量のデータを複数のソースから新しいインスタンスにインポートしています。私は複数のソースと複数のスレッドから、インポートデータとの関係でしょうNeo4j 3.0.6 MERGEで一意性制約違反が発生しました

CREATE CONSTRAINT ON (n:Person) ASSERT n.id IS UNIQUE 

:私は、次の制約を使用して一意性

MERGE (mother:Person{id: 22}) 
MERGE (father:Person{id: 55}) 
MERGE (self:Person{id: 128}) 
SET self += {name: "Alan"} 
MERGE (self)-[:MOTHER]->(mother) 
MERGE (self)-[:FATHER]->(father) 

一方、別のスレッド上で、それでも同じのNeo4jサーバーとボルトエンドポイント、私は残りのデータをインポートすることがあります:

MERGE (husband:Person{id: 55}) 
MERGE (self:Person{id: 22}) 
SET self += {name: "Phyllis"} 
MERGE (self)-[:HUSBAND]->(husband) 
MERGE (wife:Person{id: 22}) 
MERGE (self:Person{id: 55}) 
SET self += {name: "Angel"} 
MERGE (self)-[:WIFE]->(wife) 
MERGE (brother:Person{id: 128}) 
MERGE (self:Person{id: 92}) 
SET self += {name: "Brian"} 
MERGE (self)-[:BROTHER]->(brother) 
MERGE (self)<-[:BROTHER]-(brother) 

最後に、私は再び制約コマンドを実行した場合、私はこの取得:

Unable to create CONSTRAINT ON (Person:Person) ASSERT Person.id IS UNIQUE: 
Multiple nodes with label `Person` have property `id` = 55: 
    node(708823) 
    node(708827) 

をレコードがで処理される順序保証はありません何が起こって終わることは同じ(:Person{id})取得のための複数のレコードです。作成されますが、1つにはnameデータが入力されます。

Neo4jには同じIDの2つが同時に発生すると競合状態が発生するようですが、両方とも作成されます。この競合状態を避ける方法はありますか?必要なロックを確立する方法はありますか?

可能な重複:Neo4J 2.1.3 Uniqueness Constraint Being Violated, Is This A Bug?しかし、これはCREATEのためのものであり、this google groups answerCREATEが制約に関してMERGEとは動作が異なりますことを示しています。

+1

私の答えは削除されました。更新された説明には適用されなくなりました。私はもっ​​と良い解決策を考えることができれば別の答えを提出します。 – InverseFalcon

+0

ありがとうInverseFalcon。私の間違った構文は、私が見るだけの完全で有用な答えを書くように促しました。 – wizulus

+0

好奇心の邪魔をして、あなたのSETを 'ON CREATE SET ...'と 'ON MERGE SET ... 'の両方に変更するとどうなりますか?ノードが重複していますか? – InverseFalcon

答えて

0

私は、あるノードで暗黙のロックを取得し、それを同期のために使用することができますが、効果的に処理をシリアライズすると思うので、処理は実際には同時に処理されません。

全体的に、複数のスレッドで同じ種類のデータの処理を中止し、1つのスレッドでMERGE:Personに1回インポートするだけで、プロパティを設定する方が良いと思います。

これをインポートした後、MERGEing on:Personsの代わりにMATCHingすることを理解して、関係の作成を処理できます。

関連する問題