Cypher技术咨询:如何获取关联A但未与C建立Knows关系的B节点
可行的Cypher查询方案
针对你要找的「与A通过LinkedTo关联,但未与C建立Knows关系的B节点」需求,这里提供两种实用方案:
方案一:利用子查询集合差集
先匹配所有A关联的B,再通过子查询获取所有被C关联的B节点集合,最后筛选出不在该集合里的B:
MATCH (a)-[:LinkedTo]->(b) WHERE b NOT IN [(c)-[:Knows]->(b_knows) | b_knows] RETURN DISTINCT b
子查询[(c)-[:Knows]->(b_knows) | b_knows]会返回所有和C有Knows关系的节点列表,NOT IN直接排除这些节点,剩下的就是符合要求的B。
方案二:OPTIONAL MATCH结合空值判断
你提到觉得Optional Match无法解决,可能是之前的用法有误。试试这种写法:
MATCH (a)-[:LinkedTo]->(b) OPTIONAL MATCH (c)-[:Knows]->(b) WHERE c IS NULL RETURN DISTINCT b
逻辑是:先找到所有A关联的B,再尝试为每个B匹配对应的C-Knows-B关系。如果某个B和C没有Knows关系,OPTIONAL MATCH会返回c = NULL,通过WHERE c IS NULL就能精准筛选出目标B节点。
内容的提问来源于stack exchange,提问作者jqdoumen
相关产品推荐
相关产品推荐

