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





Это возможно с триггерами 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"}│
└───────────────────────────────────────────────┘
Вы можете использовать UNWIND ["prop1", "prop2"] AS prop CALL apoc.trigger ..... и использовать псевдоним prop вместо attr1
Поскольку данные поступают из внешней системы, я не уверен на 100%, что у меня есть фиксированный список свойств. Однако я знаю, что имена свойств всегда будут начинаться с «u_». Я пытался выполнить SET, только если свойство начинается с u_, но пока безуспешно. Не знаю, возможно ли это. Большое спасибо
Для любого свойства узла, создания и удаления узла смотрите здесь: doc.linkurio.us/admin-manual/2.10.15/incremental-indexing
Основываясь на отличной поддержке Кристофа, я немного поигрался с 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 Реми
Это потрясающе ! Я отмечу это как решение моей проблемы, просто нужна еще одна деталь, можно ли добавить такой триггер для всех свойств, соответствующих определенному имени, или я должен добавить один для всех свойств, которые я хочу отслеживать?