如何合并两个Cypher查询,实现关联节点子集校验并获取目标节点
单条Cypher查询实现方案
直接使用以下语句即可实现需求:
MATCH (r:R)--(a:A) WITH collect(DISTINCT a.Id) AS r_linked_a_ids MATCH (b:B) OPTIONAL MATCH (b)--(a:A) WITH b.Id AS b_id, collect(DISTINCT a.Id) AS b_linked_a_ids, r_linked_a_ids WHERE all(a_id IN b_linked_a_ids WHERE a_id IN r_linked_a_ids) RETURN b_id
逻辑说明
- 第一步先查询所有和蓝色R节点关联的红色A节点ID,去重后存入集合
r_linked_a_ids - 遍历所有棕色B节点,可选匹配每个B关联的A节点,把每个B对应的关联A节点ID去重后存入集合
b_linked_a_ids - 用
all()函数做子集校验:如果B关联的所有A ID都存在于r_linked_a_ids中,则满足条件。无关联A的B节点对应的b_linked_a_ids是空集,天然符合子集要求,会被正常返回 - 最终返回的
b_id就是符合条件的棕色节点ID
内容的提问来源于stack exchange,提问作者Matan Avitan
相关产品推荐
相关产品推荐

