Neo4j Cypher通过Node.js驱动如何将多匹配变量合并为同记录数组
Neo4j多匹配结果合并为单数组返回方案
你可以通过Cypher的列表拼接语法实现需求,同时原写法存在笛卡尔积返回冗余结果的问题,建议同步调整:
实现逻辑
- 使用
OPTIONAL MATCH替代原MATCH,避免用户无主办/参与活动时查询返回空 - 用
collect()函数将匹配到的节点转换为列表 - 用
+运算符拼接两个同类型列表,返回单个数组列
修改后完整代码
function getMyEvents(tx, userID) { return tx.run(` MATCH (self:USER {userID: $userID}) OPTIONAL MATCH (self)-[h:HOST]->(hostingEvents:EVENT) WITH self, collect(hostingEvents) AS hostEvents OPTIONAL MATCH (self)-[a:ATTENDING]-(attendingEvents:EVENT) RETURN hostEvents + collect(attendingEvents) AS allEvents `, {"userID": userID}) }
可选扩展:区分活动类型
如果后续需要区分活动是主办还是参与,可以返回带类型标识的对象数组:
MATCH (self:USER {userID: $userID}) OPTIONAL MATCH (self)-[:HOST]->(e:EVENT) WITH self, collect({event: e, type: 'hosting'}) AS hostList OPTIONAL MATCH (self)-[:ATTENDING]-(e:EVENT) RETURN hostList + collect({event: e, type: 'attending'}) AS allEvents
内容的提问来源于stack exchange,提问作者John Sorensen
相关产品推荐
相关产品推荐

