apoc使用触发器:如apoc官网指导


   
    
  1. CREATE (d:Person { name:‘Daniel’})
  2. CREATE (l:Person { name:‘Mary’})
  3. CREATE (t:Person { name:‘Tom’})
  4. CREATE (j:Person { name:‘John’})
  5. CREATE (m:Person { name:‘Michael’})
  6. CREATE (a:Person { name:‘Anne’})
  7. CREATE (l)-[:DAUGHTER_OF]->(d)
  8. CREATE (t)-[:SON_OF]->(d)
  9. CREATE (t)-[:BROTHER]->(j)
  10. CREATE (a)-[:WIFE_OF]->(d)
  11. CREATE (d)-[:SON_OF]->(m) CREATE (j)-[:SON_OF]->(d)
  12. CALL apoc.trigger.add(‘setAllConnectedNodes’,‘UNWIND apoc.trigger.propertiesByKey({assignedNodeProperties},“surname”) as prop
  13. WITH prop.node as n MATCH(n:Person)-[]-(a) //库中不同标签的节点较多,所以较官方手册加了一个Person标签
  14. 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个节点的属性是后台触发完成的。


   
    
  1. CALL apoc.trigger.add( 'setAllConnectedNodes', 'UNWIND apoc.trigger.propertiesByKey({assignedNodeProperties},"surname") as prop
  2. WITH prop.node as n
  3. MATCH(n:Person)-[]-(a:Person)
  4. where not exists(a.surname) or n.surname<>a.surname
  5. SET a.surname = n.surname', {phase: 'after'});

原文地址:https://blog.csdn.net/weixin_42348333/article/details/89855189


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!