Neo4j技术问询:检索所有关联关系无特定属性值的节点
解决Neo4j节点查询问题:筛选所有关联关系不含特定属性值的节点
你要找的是**没有任何关联关系,或者所有关联关系的prop属性都不等于true**的节点,之前的查询问题出在分组逻辑和匹配范围上,给你两个可行的方案:
方案一:包含无关联节点的完整查询
这个查询会一次性返回所有符合要求的节点,包括没有任何关系的节点:
MATCH (foo) OPTIONAL MATCH (foo)-[r]-() WITH foo, collect(r) AS all_rels WHERE ALL(rel IN all_rels WHERE rel.prop <> true) RETURN foo
逻辑说明:
MATCH (foo):先匹配数据库中所有节点,确保无关联的节点也被纳入范围OPTIONAL MATCH (foo)-[r]-():可选匹配foo的所有关联关系,无关联的foo对应的all_rels会是空集合WITH foo, collect(r) AS all_rels:按foo分组,收集它的所有关联关系WHERE ALL(rel IN all_rels WHERE rel.prop <> true):判断所有关系的prop都不等于true,空集合会自动满足ALL条件(因为没有元素违反规则),所以无关联节点会被保留- 最后返回符合条件的
foo节点
方案二:仅筛选有关联但符合条件的节点
如果你只想找有至少一个关联关系,且所有关系prop都不为true的节点,可以去掉第一个MATCH,直接用:
MATCH (foo)-[r]-() WITH foo, collect(r) AS all_rels WHERE ALL(rel IN all_rels WHERE rel.prop <> true) RETURN foo
之前查询的问题分析
第一个查询错误:
MATCH (foo)-[r]-(bar)只匹配有至少一个关系的节点,排除了无关联节点WITH collect(r) as rs, foo, bar是按foo和bar的组合分组,收集的是foo和某个bar之间的关系,不是foo的所有关系,导致只要foo和某个bar的关系都符合条件,就会返回foo,忽略了foo和其他节点的关系可能存在prop=true的情况
第二个查询错误:
- 同样只匹配有至少一个关系的节点,漏掉无关联节点
- 返回的是CASE表达式,会包含大量
null值,而不是只返回符合条件的节点,结果不符合预期
内容的提问来源于stack exchange,提问作者sjeknic
相关产品推荐
相关产品推荐

