Neo4j-关于语法apoc触发器的问题

时间:2020-07-16 20:44:31

标签: neo4j cypher neo4j-apoc

我有以下包含APOC程序的APOC触发器。这可以按需工作,但是我想知道我是否使用了很多WITH语句,这是可行的方法吗?还是有更好的方法来重构此代码。我对neo4j还是陌生的,所以不确定。

控制流程-每当创建“注册”节点时,它都会创建一个SPerson节点,并根据大小(SPerson节点的数量)创建一个已注册或等待列表(如果大小> 3,并删除已注册的关系)关系,课程节点。

CALL apoc.trigger.add('loadEnrollments',   
"UNWIND apoc.trigger.nodesByLabel($assignedLabels, 'Enrollment') AS node
 MERGE (p1:SPerson { name: node.name, cell: node.cell, created_at: node.created_at})
 WITH p1, node
 MATCH (c:Course {name: 'Paradigm Shifting 101'})
 WITH node
 MATCH (n:SPerson)
 WITH node, COUNT(n) as size
 CALL apoc.do.when(
 size>3,
 'MATCH(p1:SPerson),(c:Course) 
 WHERE p1.name=node.name
 CREATE (p1)-[:Waitlist]->(c)
 WITH p1,c 
 MATCH (e:Enrollment) DETACH DELETE e',
 'MATCH(p1:SPerson),(c:Course) 
 WHERE p1.name=node.name
 CREATE (p1)-[:Enrolled]->(c)
 WITH p1,c 
 MATCH (e:Enrollment) DETACH DELETE e', {node:node}) YIELD value
 DETACH DELETE node", 
 
 { phase: 'after' });

1 个答案:

答案 0 :(得分:0)

您应该:

  • 最小化查询必须处理的数据行数,并且
  • 不要不必要地重复操作。

牢记这些规则,此查询可能对您有效(有效):

CALL apoc.trigger.add(
  'loadEnrollments',
  "
  CALL apoc.cypher.doIt('MATCH (e:Enrollment) DETACH DELETE e', {}) YIELD value
  WITH value
  MATCH (n:SPerson)
  WITH COUNT(n) as size
  MATCH (c:Course {name: 'Paradigm Shifting 101'})
  UNWIND apoc.trigger.nodesByLabel($assignedLabels, 'Enrollment') AS node
  MERGE (p1:SPerson {name: node.name, cell: node.cell, created_at: node.created_at})
  DETACH DELETE node
  CALL apoc.create.relationship(p1, CASE WHEN size > 3 THEN 'Waitlist' ELSE 'Enrolled' END, {}, c) YIELD rel
  ",
  { phase: 'after' }
);