Neo4j обнаруживает модификацию узла - PullRequest
0 голосов
/ 27 ноября 2018

Я использую запрос такого типа в базе данных Neo4j:

MERGE(n:type {key:"xyz"})
ON CREATE SET n.create_date = timestamp() 
ON MATCH SET n.update_date = timestamp()
SET n.att1=value1, n.att2=value2

ON MATCH поможет мне определить, был ли найден узел, но нет, если атрибуты действительно были изменены.

Есть ли какой-нибудь способ, которым мы можем использовать, чтобы мы могли обнаружить, что любой атрибут узла был изменен?Например, при повторном выполнении одного и того же запроса атрибут update_date изменится без изменения атрибутов.Я хотел бы быть в состоянии обнаружить, что att1 или att2 были изменены.

Большое спасибо

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Основываясь на превосходной поддержке Кристофа, я немного поиграл с apoc и использовал это решение для создания триггера для всех свойств, начиная с u_

CALL apoc.meta.data() YIELD label, property, elementType WHERE elementType = "node" AND property =~ "^u_.*" WITH DISTINCT property AS key
CALL apoc.trigger.add(
'trig_upd_'+key,
'UNWIND apoc.trigger.propertiesByKey({assignedNodeProperties},"'+key+'") as prop
WITH prop.old as oldProp, prop.new as newProp, prop.node AS n
SET n.last_updated = timestamp()', {phase:'before'})
YIELD name
RETURN name;

. Я продолжу играть с этой целью прямо сейчас.чтобы найти способ создать или удалить триггеры в случае новых или удаленных свойств.

BR Rémi

0 голосов
/ 27 ноября 2018

Это возможно с помощью триггеров APOC:

Сначала загрузите и установите APOC и включите его:

apoc.trigger.enabled=true
dbms.security.procedures.unrestricted=apoc.trigger.*
dbms.security.procedures.whitelist=apoc.*

Затем можно добавить триггер, который будет реагировать, когда свойство attr1изменено:

CALL apoc.trigger.add(
'updateTimestamp',
'UNWIND apoc.trigger.propertiesByKey({assignedNodeProperties},"attr1") as prop
WITH prop.old as oldProp, prop.new as newProp, prop.node AS n 
SET n.updated_at = timestamp()', {phase:'before'});

Проверьте это:

CREATE (n:Node) SET n.attr1 = "hello"
MATCH (n:Node) RETURN n
╒════════════════════════════════════════════╕
│"n"                                         │
╞════════════════════════════════════════════╡
│{"updated_at":1543313569105,"attr1":"hello"}│
└────────────────────────────────────────────┘

Обновите узел:

MATCH (n:Node) SET n.attr1 = "hellonew"
MATCH (n:Node) RETURN n
╒═══════════════════════════════════════════════╕
│"n"                                            │
╞═══════════════════════════════════════════════╡
│{"updated_at":1543313626248,"attr1":"hellonew"}│
└───────────────────────────────────────────────┘

Сделайте еще раз, чтобы проверить, что это не вызвано, когда свойствобез изменений:

MATCH (n:Node) SET n.attr1 = "hellonew"
MATCH (n:Node) RETURN n
╒═══════════════════════════════════════════════╕
│"n"                                            │
╞═══════════════════════════════════════════════╡
│{"updated_at":1543313626248,"attr1":"hellonew"}│
└───────────────────────────────────────────────┘
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...