如何用Neo4j Cypher判断是否存在包含全部指定Unit ID的PublicList节点
满足需求的Cypher查询语句
根据你的节点结构和需求,这里提供两种场景的Cypher语句,均返回布尔值:
场景1:检查是否存在包含所有指定Unit的PublicList(允许包含其他Unit)
这个查询会验证是否有PublicList节点通过:INCLUDES关系关联到数组中的每一个Unit,不管该PublicList是否还关联其他Unit:
WITH [197, 196, 19, 20, 191, 171, 3, 174, 194, 185] AS targetUnitIds MATCH (pl:PublicList) WHERE ALL(unitId IN targetUnitIds WHERE EXISTS((pl)-[:INCLUDES]->(:Unit {id: unitId}))) RETURN EXISTS(pl) AS existsMatchingList
- 逻辑:用
ALL断言遍历目标ID数组,确认每个ID对应的Unit都与当前PublicList存在:INCLUDES关系;最后通过EXISTS(pl)判断是否存在符合条件的节点。
场景2:检查是否存在仅包含指定Unit的PublicList(严格匹配)
如果需要PublicList关联的Unit恰好是数组中的这些(不多不少),可以用这个查询:
WITH [197, 196, 19, 20, 191, 171, 3, 174, 194, 185] AS targetUnitIds MATCH (pl:PublicList) WHERE ALL(unitId IN targetUnitIds WHERE EXISTS((pl)-[:INCLUDES]->(:Unit {id: unitId}))) AND SIZE((pl)-[:INCLUDES]->(:Unit)) = SIZE(targetUnitIds) RETURN EXISTS(pl) AS existsExactMatchingList
- 逻辑:在场景1的基础上,增加了
SIZE判断,确保PublicList关联的Unit总数和目标数组长度一致,避免包含额外的Unit。
内容的提问来源于stack exchange,提问作者Miha Šušteršič
相关产品推荐
相关产品推荐

