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,因此将两个 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Neo4j/Cypher:通过 WITH 传递属性

neo4j cypher:查询结果中的“堆叠”节点

在neo4j cypher查询中通过其相关节点ID查找节点

如何在Neo4j Cypher中返回不同的节点对?

Neo4j Cypher通过关联节点的精确集合查找实体

是否可以通过REST API使用Cypher查询Neo4J db并返回节点的URI?

Neo4j 在 cypher 单节点关系中合并节点

如何使用Cypher删除neo4j中两个克隆节点中的节点

(neo4j)是否可以通过Cypher,REST或Webadmin控制台从索引中删除节点?

如何在Neo4J Cypher查询中仅从路径中检索节点?

如何使用Cypher Graph查询语言删除Neo4j中的节点?

Neo4j Cypher:检查路径中不连续节点的属性

什么Cypher查询可检索Neo4J中某些节点之间的关系?

Neo4j Cypher获取链表中的所有节点

使用Cypher在嵌入式Neo4J应用程序中创建节点

Neo4j / Cypher匹配遍历分支中的前n个节点

Neo4j Cypher查询中的FOREACH之后无法返回节点

neo4j cypher如何找到关系中特定节点的存在计数?

Neo4J(Cypher)中图节点关系的最佳方法

在单个查询中比较Cypher / Neo4J中的节点数

Neo4j中如何用Cypher求和不同于起始节点和终止节点的节点类型的属性值

Neo4j:Cypher:如何通过图案去除标签?

Neo4j Cypher 返回最多连续“通过”

Neo4j Cypher 更新节点动态属性

Neo4j - Cypher 节点和关系

Neo4j Cypher非共享后代节点

Neo4j Cypher:合并重复的节点

Neo4j/Cypher - 随机匹配节点

Neo4j / Cypher节点位于路径中心