apoc使用触发器:如apoc官网指导
-
CREATE (d:Person {
name:‘Daniel’})
-
CREATE (l:Person {
name:‘Mary’})
-
CREATE (t:Person {
name:‘Tom’})
-
CREATE (j:Person {
name:‘John’})
-
CREATE (m:Person {
name:‘Michael’})
-
CREATE (a:Person {
name:‘Anne’})
-
CREATE (l)-[:DAUGHTER_OF]->(d)
-
CREATE (t)-[:SON_OF]->(d)
-
CREATE (t)-[:BROTHER]->(j)
-
CREATE (a)-[:WIFE_OF]->(d)
-
CREATE (d)-[:SON_OF]->(m)
CREATE (j)-[:SON_OF]->(d)
-
-
CALL apoc.trigger.add(‘setAllConnectedNodes’,‘UNWIND apoc.trigger.propertiesByKey({assignedNodeProperties},“surname”)
as prop
-
WITH prop.node
as n
MATCH(n:Person)-[]-(a) //库中不同标签的节点较多,所以较官方手册加了一个Person标签
-
SET a.surname = n.surname’, {phase:‘
after’});
使用如下的set语句构造触发条件 MATCH (d:Person {name:‘Daniel’}) SET d.surname = ‘William’
该语句执行完成后,触发器的功能已经实现了,但是为什么web页面显示一直转圈,虚机和物理机都是这样,超过5min。
apoc.trigger.enabled=true已经设置过了,而且这之后继续使用MATCH (d:Person {name:‘Daniel’}) SET d.surname = ‘Xaaa’这样的语句不起作用,person的surname是之前的William没有变成Xaaa,为什么?
按F12后发现,一直在向后台发送请求,引发数据库后台进程阻塞。个人推测为'setAllConnectedNodes'这样的触发器,在节点上添加surname属性时,它会添加到所有的连接的节点(但是添加之后又会循环触发,导致走进了一个死循环。)
解决方法:
要注意的是,这样的情况会引发数据库后台进程阻塞,需要后台重启neo4j实例,来阻止对应的阻塞进程。前端刷新并不生效。仅仅在前端刷新,会阻塞对Person标签类对象的一切操作,包括delete与set。
//修改相应的触发器语句,此时成功执行,不再阻塞,但是在前端显示不会说Set 6 //properties。仅仅显示Set 1 property,因为其他5个节点的属性是后台触发完成的。
-
CALL apoc.trigger.add(
'setAllConnectedNodes',
'UNWIND apoc.trigger.propertiesByKey({assignedNodeProperties},"surname") as prop
-
WITH prop.node as n
-
MATCH(n:Person)-[]-(a:Person)
-
where not exists(a.surname) or n.surname<>a.surname
-
SET a.surname = n.surname', {phase:
'after'});
原文地址:https://blog.csdn.net/weixin_42348333/article/details/89855189