我有以下查询,其中有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,并且第三个匹配的运行时间不必要地至少加倍。
我想知道是否有人知道如何编写此查询以仅使用一个单一的条目实例。
答案 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