我正在运行Neo4j 3.0.6,并且正在将大量数据导入到来自多个源的新实例中。我使用以下约束来强制执行唯一性:
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})
的多条记录,但只有一条记录填充了name
数据。
在Neo4j中似乎存在一种竞争条件,即如果同一个id同时发生两个MERGE
,则它们都将被创建。有没有办法避免这种竞争条件?有没有办法建立必要的锁?
可能重复:Neo4J 2.1.3 Uniqueness Constraint Being Violated, Is This A Bug?但这适用于CREATE
而this google groups answer表示CREATE
在约束方面的行为与MERGE
不同。< /子>
答案 0 :(得分:0)
我知道您可以在某个节点上获得隐式锁定,然后将其用于同步,但我认为这会有效地序列化处理,因此处理将不会真正同时处理。
总体而言,我认为更好的方法是放弃在多个线程中处理相同类型的数据,只需在一个线程上单独导入MERGE:Persons并设置其属性。
在导入之后,您可以处理您的关系的创建,同时理解您将匹配而不是合并:人物。