2014-09-05 3 views
0

Предположим, что для определенных узлов атрибуты имеют уникальные ограничения, определенные на них.Поддержка Neo4j для отложенных ограничений

При клонировании узлов мы копируем свойства от исходного к клонированному узлу, а затем модифицируем уникальные атрибуты на клонированном узле.

Однако neo4j демонстрирует нетерпеливую оценку ограничения и, похоже, терпит неудачу, как только уникальные свойства реплицируются от исходного к клонированному узлу.

Есть ли способ различать оценку ограничений до конца транзакции?

Или некоторое обходное решение, которое может смягчить проблему на время.

Образец высчитывать для иллюстрации проблемы:

  1. Создать уникальное ограничение для узлов меченых у на идентификатор атрибута.

    create constraint on (y:y) assert y.id is unique; 
    
  2. Создать несколько узлов.

    create (y:y{id: 1}) return y; 
    create (y:y{id: 2}) return y; 
    
  3. Теперь попробуйте клонировать у узла с наибольшим идентификатором, и назначить новые идентификаторы.

    match (y:y) 
    with max(y.id) as maxid 
    match (lasty:y{id: maxid}) 
    unwind range(1, 10) as i 
    create (nexty:y) 
    set nexty = lasty 
    set nexty.id = maxid + i 
    return nexty; 
    
  4. выше высчитывать не удается быстро с ниже ошибки:

    Node 5368657 already exists with label y and property "id"=[2] 
    

ответ

2

Mehul,

Изменить запрос к этому:

MATCH(y:y) 
WITH max(y.id) AS maxid 
MATCH (lasty:y { id : maxid}) 
UNWIND range(1, 10) AS i 
CREATE (nexty) 
SET nexty = lasty 
SET nexty.id = lasty.id + 1 
SET nexty :y 
RETURN nexty 

Это создает новый узел без ярлыка, перенос и обновление s свойства, а затем добавляет метку.

Благодати и мира,

Джим

+0

Джим, ваша рекомендация работает идеально. Добавление метки последним после заполнения свойств узла решает проблему. – Mehul