Neo4j 如果节点与某个参数有关系,如何从匹配中排除节点
我创建了一些描述流程的节点。使用相当标准的最佳实践,它看起来像这样:Neo4j 如果节点与某个参数有关系,如何从匹配中排除节点,neo4j,cypher,Neo4j,Cypher,我创建了一些描述流程的节点。使用相当标准的最佳实践,它看起来像这样: (process:Process)-[:FIRST_STEP {parent:id(process)}]->(step1:Step)-[:NEXT {parent:id(process)}]->etc. 因此,它是流程类型的父节点,后面是一组步骤,每个步骤类型,从父节点开始的每个关系都有一个具有父流程id的父属性 这样做的目的是使一个步骤可以包含在多个流程中,并且效果非常好 现在我需要删除一个进程及其所有步骤。我
(process:Process)-[:FIRST_STEP {parent:id(process)}]->(step1:Step)-[:NEXT {parent:id(process)}]->etc.
因此,它是流程类型的父节点,后面是一组步骤,每个步骤类型,从父节点开始的每个关系都有一个具有父流程id的父属性
这样做的目的是使一个步骤可以包含在多个流程中,并且效果非常好
现在我需要删除一个进程及其所有步骤。我要避免的是删除父进程中属于另一个进程的步骤字符串的任何子步骤
我的第一步是:
match(p:Process)-[rel:FIRST_STEP | :NEXT* {parent:id(p)}]->(step)
where id(p) = 1234
return p, step
这将返回流程和所有步骤。现在我不想返回其他进程所说的任何步骤。这就是我所拥有的,但它不起作用,我可以使用任何想法:
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)
)
match(p:Process)-[rel:FIRST_STEP |:NEXT*{parent:id(p)}]>(步骤)
其中id(p)=1234
而且不存在(
(步骤)问题在于EXISTS()
和NOT EXISTS()
中的模式不能用于引入新变量,比如其他关系
在缺少EXCLUDE 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
...
MATCH(p:Process)-[rel:FIRST_STEP |:NEXT*{parent:id(p)}]>(步骤)
其中id(p)=1234
用p,rel,step
可选匹配(步骤)问题在于EXISTS()
和notexists()
中的模式不能用于引入新变量,如其他关系
在缺少EXCLUDE 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
...
MATCH(p:Process)-[rel:FIRST_STEP |:NEXT*{parent:id(p)}]>(步骤)
其中id(p)=1234
用p,rel,step
可选匹配(步骤)谢谢!这比我最后做的更直截了当。可选匹配是我没有看到的微妙之处。我会给你更多的投票,但我的声誉仍然太低。谢谢!这比我最后做的更直截了当。可选匹配是我没有看到的微妙之处.我想给你更多的选票,但我的声誉还是太低了。