2017-02-06 2 views
0

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

ответ

1

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

+0

Понравилось, но похоже, что это только для Neo4j 3 (требующих определяемых пользователем процедур). У вас возникло решение для Neo4j 2.3? – PaF

+0

К сожалению, нет. Это функция 3.x. – Vardan