Я хочу обновить узел из входной карты в моем запросе 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, если это важно.