Neo4j查询未关联B节点的A节点失败问题求解
问题分析与解决方案
首先得点明你当前查询的核心问题:你写的查询开头 match (x:A)-[r:C]-(y:B) 已经强制限定了要找的A节点必须和B节点通过C关系相连,后面再加上 where NOT ((x)-[*]-(y)) 相当于在已经有直接关联的节点里找没有关联的,这本身就是矛盾的逻辑,所以自然返回空结果。
要查询未与B节点建立C关联的A节点,有几种靠谱的写法:
方法1:使用NOT EXISTS子查询(最直观)
MATCH (x:A) WHERE NOT EXISTS { MATCH (x)-[:C]-(:B) } RETURN x
逻辑很清晰:先找到所有A节点,然后排除掉那些存在和B节点的C关系的节点,剩下的就是未关联的目标节点。
方法2:使用OPTIONAL MATCH筛选无匹配的节点
OPTIONAL MATCH (x:A)-[r:C]-(:B) WHERE r IS NULL RETURN x
OPTIONAL MATCH会尝试为每个A节点匹配对应的C关系,对于没有关联的A节点,r会是NULL,筛选出这些节点即可得到结果。
方法3:使用NOT IN结合列表推导
MATCH (x:A) WHERE x NOT IN [ (a)-[:C]-(:B) | a ] RETURN x
先通过列表推导式得到所有和B节点有C关联的A节点集合,然后排除这个集合里的元素,剩下的就是未关联的A节点。
测试以上任意一种语句,都能正确返回02-A和04-A这两个节点。
内容的提问来源于stack exchange,提问作者AFigueroa
相关产品推荐
相关产品推荐

