我有以下查询,其中有 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,因此将两个 entry 实例传递给第三个匹配而不是 1,并且第三个匹配的运行时间不必要地加倍至少。
我想知道是否有人知道我应该如何编写此查询以仅使用一个条目实例。
最好的办法是聚合 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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句