Neo4j 3.0.6 MERGE违反了唯一性约束

时间:2016-11-17 16:01:20

标签: merge neo4j cypher unique acid

我正在运行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?但这适用于CREATEthis google groups answer表示CREATE在约束方面的行为与MERGE不同。< /子>

1 个答案:

答案 0 :(得分:0)

我知道您可以在某个节点上获得隐式锁定,然后将其用于同步,但我认为这会有效地序列化处理,因此处理将不会真正同时处理。

总体而言,我认为更好的方法是放弃在多个线程中处理相同类型的数据,只需在一个线程上单独导入MERGE:Persons并设置其属性。

在导入之后,您可以处理您的关系的创建,同时理解您将匹配而不是合并:人物。