Я использую 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 есть условие гонки, когда два MERGE
происходят для одного и того же идентификатора одновременно, они оба будут созданы. Есть ли способ избежать этого состояния гонки? Есть ли способ установить необходимые блокировки?
Возможный дубликат: Neo4J 2.1 .3 Нарушено ограничение уникальности. Является ли это ошибкой? Но это для CREATE
и этот ответ группы Google указывает, что CREATE
ведет себя иначе, чем MERGE
в отношении ограничений.
ON CREATE SET...
, так и наON MERGE SET...
У вас все еще будут дубликаты узлов? - person InverseFalcon   schedule 17.11.2016CREATE
вместоMERGE
? - person cybersam   schedule 18.11.2016MERGE
. Вы можете убедиться, что ограничение подключено к сети, запустив:schema
в браузере илиCALL db.constraints
. Если ограничение не было создано и находится в сети, уникальность не гарантируется. - person William Lyon   schedule 18.11.2016