如何用Cypher查询折叠Neo4j中多关系路径的节点?
问题描述
在我的Neo4j数据库中,Item节点之间通过Connection三元节点连接(由于无法创建三元关系/箭头才采用这种建模方式)。我认为当前建模本身没问题,但希望通过Cypher查询忽略CONNECTED_BY关系,将连接路径(即中间的Connection节点)折叠为Item之间的简单关系,该如何实现?
我知道apoc.refactor.collapseNode过程,但它会修改数据库,有没有办法仅在查询中实现类似效果?另外,我还需要忽略折叠节点(Connection)上的其他关系(比如这里的CONNECTED_BY)。
以下是重现该场景的Cypher代码:
// Users // #1 CREATE (:User{name: "philippe_fanaro"}); CREATE (:User{name: "john_doe"}); // Items // #1 MATCH (u:User{name: "john_doe"}) CREATE (u)-[:CREATED]->(:Item{title: "Designing Data-Intensive Applications"}); // #2 MATCH (u:User{name: "philippe_fanaro"}) CREATE (u)-[:CREATED]->(:Item{title: "System Design Interview – An insider's guide"}); // Connections // #1 MATCH (i1:Item), (i2:Item), (u:User{name: "philippe_fanaro"}) WHERE i1.title CONTAINS "Designing" AND i2.title CONTAINS "System" CREATE (i1)- [:CONNECTION_ORIGIN] ->(c:Connection{title: "Relation"}) - [:CONNECTION_DESTINATION]->(i2), (c)-[:CONNECTED_BY]->(u);
解决方案
不需要修改数据库,直接用Cypher的路径匹配和投影就能实现折叠效果,同时忽略Connection节点上的其他关系。
基础查询:折叠为虚拟关系
下面的查询会匹配Item通过Connection节点连接的路径,将其投影为两个Item节点之间的虚拟关系(命名为RELATED),同时完全忽略CONNECTED_BY这类Connection节点上的其他关系:
MATCH (i1:Item)-[:CONNECTION_ORIGIN]->(c:Connection)-[:CONNECTION_DESTINATION]->(i2:Item) RETURN i1, i2, c.title AS relation_title, apoc.create.vRelationship(i1, 'RELATED', {title: c.title}, i2) AS virtual_relation
如果不需要可视化虚拟关系,仅需获取关联的Item对与关系属性,用简化版即可:
MATCH (i1:Item)-[:CONNECTION_ORIGIN]->(c:Connection)-[:CONNECTION_DESTINATION]->(i2:Item) RETURN i1, {type: 'RELATED', title: c.title} AS relation_info, i2
扩展:包含Item的其他关联信息
如果需要同时查询Item的其他关联(比如创建者),可以在查询中加入对应匹配逻辑,不影响折叠效果:
MATCH (i1:Item)-[:CONNECTION_ORIGIN]->(c:Connection)-[:CONNECTION_DESTINATION]->(i2:Item), (i1)<-[:CREATED]-(u1:User), (i2)<-[:CREATED]-(u2:User) RETURN i1.title AS item1, u1.name AS creator1, c.title AS relation, i2.title AS item2, u2.name AS creator2, apoc.create.vRelationship(i1, 'RELATED', {title: c.title}, i2) AS virtual_relation
核心逻辑说明
- 只匹配
Item→Connection→Item的路径,完全不涉及CONNECTED_BY关系,自然就忽略了该关系 - 使用
apoc.create.vRelationship可以在Neo4j浏览器中可视化直接的虚拟关系,方便查看;如果仅用于数据导出或分析,可直接返回节点对和关系属性 - 该方式仅在查询层面做投影转换,完全不会修改数据库
内容的提问来源于stack exchange,提问作者psygo
相关产品推荐
相关产品推荐

