Neo4j技术问询:如何排除含特定关系的目标Policy节点
解决方案
正确的Cypher查询
MATCH (p:Policy {state: "enabled"}) // 匹配和指定CloudApp的INCLUDE关系 MATCH (ca:CloudApp)-[:INCLUDE]-(p) WHERE ca.id IN ["All", "b9a97804-0c6b-4d83-8b35-84bda7f8b69c"] // 关联macOS平台且无排除关系 MATCH (p)-[]-(pl:Platform {id: "macOS"}) WHERE NOT (p)-[:EXCLUDE_Platform]-(pl) // 核心:确保这个Policy没有和任何CloudApp的EXCLUDE关系 OPTIONAL MATCH (p)-[:EXCLUDE_CLOUDAPP]-(anyCa:CloudApp) WHERE anyCa IS NULL RETURN p, ca, pl
问题出在哪?
你之前的查询只排除了当前匹配的那个CloudApp和Policy的EXCLUDE关系,但如果这个Policy和其他CloudApp还有EXCLUDE关系,只要它同时满足和指定CloudApp的INCLUDE关系,就会被保留下来。这就是为什么你看到Policy还在,只是对应的CloudApp被过滤了。
更简洁的写法(推荐)
用NOT EXISTS直接判断Policy是否不存在任何EXCLUDE_CLOUDAPP关系,逻辑更清晰、性能更优:
MATCH (p:Policy {state: "enabled"}) MATCH (ca:CloudApp)-[:INCLUDE]-(p) WHERE ca.id IN ["All", "b9a97804-0c6b-4d83-8b35-84bda7f8b69c"] AND NOT (p)-[:EXCLUDE_Platform]-(:Platform {id: "macOS"}) AND NOT EXISTS((p)-[:EXCLUDE_CLOUDAPP]-(:CloudApp)) RETURN p, ca
内容的提问来源于stack exchange,提问作者Matthew
相关产品推荐
相关产品推荐

