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

时间:2017-03-31 19:53:41

标签: neo4j cypher

我有以下查询,其中有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 个答案:

答案 0 :(得分:0)

您最好的选择是聚合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