neo4j Neo4密码:检查是否存在与节点ID列表具有关系的节点

qzwqbdag  于 2022-11-05  发布在  其他
关注(0)|答案(2)|浏览(244)

我有以下节点结构::Unit
然后我有一个:Unit id的数组:[197, 196, 19, 20, 191, 171, 3, 174, 194, 185]
我想检查是否已经存在一个与列表中所有:Unit id都具有:INCLUDES关系的:PublicList
我试着编写一个COUNTMATCH查询,但这看起来像是一个容易出错的冗长方法:

MATCH (p:Patch)-[:INCLUDES]->(r:Roster)-[:HAS]-(d:PublicList)
    WITH COLLECT(d) as drafts
    UNWIND drafts as draft
    WITH draft
    UNWIND [197, 196, 19, 20, 191, 171, 3, 174, 194, 185] as unitID
      MATCH (draft)-[:INCLUDES]->(u:Unit)
      WHERE id(u) = unitID
      WITH count(DISTINCT u) as draftUnits
    WITH COLLECT(draftUnits) as matchCounts
    RETURN matchCounts

如果:PublicList与列表中的所有ID都有:INCLUDES关系,那么它将返回一个布尔值。

cuxqih21

cuxqih211#

我建议首先匹配单元,将它们放入一个集合中,然后使用ALL predicate 检查PublicList是否与所有单元都有连接。

MATCH (n:Unit) WHERE id(n) IN [197, 196, 19, 20, 191, 171, 3, 174, 194, 185]
WITH collect(n) AS units
MATCH (p:Patch)-[:INCLUDES]->(r:Roster)-[:HAS]-(d:PublicList)
WHERE ALL(x IN units WHERE (d)-[:INCLUDES]->(x))
RETURN count(*) AS matchCount

如果您希望返回PublicList沿着一个布尔值(如果它与所有这些值都匹配),则可以进行如下微调

MATCH (n:Unit) WHERE id(n) IN [197, 196, 19, 20, 191, 171, 3, 174, 194, 185]
WITH collect(n) AS units
MATCH (p:Patch)-[:INCLUDES]->(r:Roster)-[:HAS]-(d:PublicList)
RETURN d, ALL(x IN units WHERE (d)-[:INCLUDES]->(x)) as matchAll
2jcobegt

2jcobegt2#

您的查询看起来不错,但还可以改进。要修复它,您需要使用

u.id = unitID

而不是

WHERE id(u) = unitID

后者是一个内部id函数,它对同一数据库中的所有其他节点使用唯一标识,而后者是一个简单的属性,名为:标识符

相关问题