我有以下包含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' });
答案 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' }
);