如何在Cypher查询的路径中排除code属于指定列表的节点?
解决Cypher查询排除指定code子节点的问题
问题核心
你需要返回code为ARNOG的节点的所有子节点,且子节点的code不在给定排除列表(示例为['1V2ZG'])中,原查询未对返回路径和节点做排除校验,所以返回了全部节点。
正确查询语句
// 先收集所有需要排除的节点 WITH ['1V2ZG'] AS exclude_codes MATCH (excl:Client) WHERE excl.code IN exclude_codes WITH collect(excl) AS exclude_nodes // 匹配符合要求的路径:路径中不包含任何排除节点 MATCH (b:BaseHierarchy)-[:INCLUDES]->(n:Client:Group {code: 'ARNOG'}) MATCH path = (n)-[:PARENT_OF*]->(inc:Client) WHERE NONE(node IN nodes(path) WHERE node IN exclude_nodes) // 汇总返回去重的节点和关系 WITH b, apoc.coll.toSet(collect(nodes(path))) AS node_lists, apoc.coll.toSet(collect(relationships(path))) AS rel_lists RETURN b, apoc.coll.flatten(rel_lists) AS relationships, apoc.coll.flatten(node_lists) AS nodes
逻辑说明
- 先用Cypher内置的
NONE()函数校验路径内所有节点都不在排除集合中,既过滤了终点节点,也排除了路径中途经过排除节点的情况 - 提前收集排除节点集合,避免重复查询匹配,提升执行效率
- 去掉了原查询中无意义的excl节点匹配逻辑,原逻辑仅校验排除节点存在,未起到过滤作用
内容的提问来源于stack exchange,提问作者Marcos
相关产品推荐
相关产品推荐

