我创建了一些描述流程的节点。使用非常标准的最佳实践,它看起来像这样:
(process:Process)-[:FIRST_STEP {parent:id(process)}]->(step1:Step)-[:NEXT {parent:id(process)}]->etc.
因此,它是Process类型的父节点,后面是每个步骤类型的一系列步骤,并且从父级继续的每个关系都具有父级属性,父级进程的id。
这样做是为了让一个步骤可以包含在多个进程中,并且运行良好。
现在我需要删除一个进程及其所有步骤。我想要避免的是删除属于另一个进程的一系列步骤的父级的任何子步骤。
我的第一步是:
match(p:Process)-[rel:FIRST_STEP | :NEXT* {parent:id(p)}]->(step)
where id(p) = 1234
return p, step
这将返回Process和所有步骤。现在我想不返回其他进程所说的任何步骤。这就是我所拥有的,但它不起作用,我可以使用任何想法:
match(p:Process)-[rel:FIRST_STEP | :NEXT* {parent:id(p)}]->(step)
where id(p) = 1234
and not exists(
(step)<-[otherrelation:FIRST_STEP|NEXT]-() WHERE otherrelation.parent <> id(p)
)
exists()部分中的WHERE子句将其搞砸了,我找不到有关如何执行此操作的文档。
非常感谢。
答案 0 :(得分:2)
问题在于EXISTS()
和NOT EXISTS()
中的模式不能用于引入新变量,例如otherRelation
。
如果没有EXCLUDE MATCH
子句,我们必须使用OPTIONAL MATCH
来处理我们不想要的模式,然后修剪匹配模式所在的匹配。
MATCH(p:Process)-[rel:FIRST_STEP | :NEXT* {parent:id(p)}]->(step)
WHERE id(p) = 1234
WITH p, rel, step
OPTIONAL MATCH (step)<-[otherrelation:FIRST_STEP|NEXT]-()
WHERE otherrelation.parent <> id(p)
WITH p, rel, step
WHERE otherrelation IS NULL
...