Neo4j在Cypher中通过WITH传递不同的节点

我有以下查询,其中有3个MATCHES,与WITH连接,搜索3个路径 .

MATCH (:File {name: 'A'})-[:FILE_OF]->(:Fun {name: 'B'})-->(ent:CFGEntry)-[:Flows*]->()-->(expr:CallExpr {name: 'C'})-->()-[:IS_PARENT]->(Callee {name: 'd'}) 
WITH expr, ent 

MATCH (expr)-->(:Arg {chNum: '1'})-->(id:Id) 
WITH id, ent

MATCH (entry)-[:Flows*]->(:IdDecl)-[:Def]->(sym:Sym) 
WHERE id.name = sym.name 
RETURN id.name

查询返回两个不同的id和一个不同的条目,以及7个不同的sym .

问题是因为在第二个MATCH中我传递了“WITH id,entry”,并且找到了两个不同的id,所以两个条目实例被传递给第三个匹配而不是1,并且第三个匹配的运行时间不必要地加倍至少 .

我想知道是否有人知道如何编写此查询只是使用一个单一的条目实例 .

回答(1)

3 years ago

您最好的选择是聚合ID,但是您需要相应地在查询的第三部分调整逻辑:

MATCH (:File {name: 'A'})-[:FILE_OF]->(:Fun {name: 'B'})-->(ent:CFGEntry)-[:Flows*]->()-->(expr:CallExpr {name: 'C'})-->()-[:IS_PARENT]->(Callee {name: 'd'}) 
WITH expr, ent 

MATCH (expr)-->(:Arg {chNum: '1'})-->(id:Id) 
WITH collect(id.name) as names, ent

MATCH (entry)-[:Flows*]->(:IdDecl)-[:Def]->(sym:Sym) 
WHERE sym.name in names 
RETURN sym.name