Устанавливайте только несуществующие свойства

Я хочу обновить узел из входной карты в моем запросе cypher, но я хочу установить только те свойства, которые еще не существуют в узле (тогда как = переопределяет все свойства узла, а += переопределяет все свойства, которые появляются на карте ).

Например, если у меня есть узел (n {key: "abc", prop1: "value"}) и мне нужно обновить карту:

WITH {key: "abc", prop1: "othervalue", prop2: "newvalue"}) AS update_map

Я хотел бы, чтобы операция соответствовала key и обновляла prop2 без переопределения prop1, чтобы результат был: (n {key: "abc", prop1: "value", prop2: "newvalue"}).

Мой нынешний подход заключался в том, чтобы идти по ключам:

UNWIND KEYS(update_map) AS update_map_key
MATCH (n {key: update_map.key})
WHERE n[update_map_key] IS NULL
SET n[update_map_key] = update_map[update_map_key]

Это выглядит великолепно (возможно, за исключением поиска-узла-по-ключу), но, к сожалению, не работает, потому что, хотя вы можете получить свойство с именем переменной, используя синтаксис [], вы не можете его обновить.

Любые идеи? Работаем на Neo4j 2.3.7, если это важно.


person PaF    schedule 06.02.2017    source источник


Ответы (1)


Я думаю, здесь будет работать APOC: apoc.create.setProperty ([node, id, ids, nodes], key, value) - устанавливает данное свойство на узле (ах), хотя я не уверен, в какой версии это было добавлен. См .: Neo4j: динамическое добавление свойства / установка динамического свойства

person Vardan    schedule 06.02.2017
comment
Очень признателен, но похоже, что это только для Neo4j 3 (требующих пользовательских процедур). А для Neo4j 2.3 есть решение? - person PaF; 07.02.2017
comment
К сожалению нет. Это функция 3.x. - person Vardan; 07.02.2017