如何在Cypher查询中按关系类型匹配不同方向的节点
解决方法
你之前用逗号分隔两个匹配模式的写法,在Cypher里属于逻辑与关系,要求两个路径必须同时存在才能匹配到节点,这和你需要的“或”条件不符。要实现按不同关系类型匹配不同方向的需求,有两种简洁的写法:
写法一:直接用OR连接路径模式
在OPTIONAL MATCH中用OR同时声明两种路径规则,直接匹配所有符合任一条件的节点:
MATCH (s {type: 'service'}) OPTIONAL MATCH (s)-[:Sync*]->(dependent) OR (s)<-[:Async*]-(dependent) WITH s, COLLECT(DISTINCT dependent) AS allDependentNodes RETURN s, allDependentNodes
写法二:分步匹配后合并结果
如果需要更清晰的分步逻辑,可以分开匹配两种路径,再合并去重结果(同时过滤空值):
MATCH (s {type: 'service'}) // 匹配向外的Sync多层关系节点 OPTIONAL MATCH (s)-[:Sync*]->(syncDep) // 匹配向内的Async多层关系节点 OPTIONAL MATCH (s)<-[:Async*]-(asyncDep) // 合并两个集合并去重,过滤空值 WITH s, [node IN COLLECT(DISTINCT syncDep) + COLLECT(DISTINCT asyncDep) WHERE node IS NOT NULL] AS allDependentNodes RETURN s, allDependentNodes
两种写法都能实现你的需求:获取通过向外Sync或向内Async关系直接/间接可达的所有节点,最终得到去重后的节点列表。
内容的提问来源于stack exchange,提问作者Richard Deurwaarder
相关产品推荐
相关产品推荐

