【问题标题】:Neo4j: How to find all nodes that: connected to either 0 nodes with specific property, or all nodes with property setNeo4j:如何找到所有节点:连接到具有特定属性的 0 个节点,或具有属性集的所有节点
【发布时间】:2024-10-07 18:55:01
【问题描述】:

假设我有一个包含 A 和 B 类型节点的有向图。A 类型的节点可以连接到 A 或 B 类型的节点,而 B 类型的节点没有传出连接。

此外,节点 B 具有 boolean 属性。我需要找到所有节点 A : 与节点 B 没有直接或间接连接 如果节点 A 与至少 1 个节点 B 有连接,则仅当所有连接的节点 B 的属性设置为 true 时才应返回。

或者换句话说,我需要找到所有未连接到任何 B 且属性设置为 false 的 A。

我试图通过查询来做到这一点:

OPTIONAL MATCH (a:A)-[*]->(b:B)
WITH a,b, collect(b) as bc
WITH a,b,COLLECT(bc) AS coll
UNWIND coll as unwinded
WITH a,b,unwinded
WHERE ALL (x IN unwinded WHERE x.prop = true)
return a

但如果他们至少有 1 个 b 和 prop=true,它会返回我 A。我做错了什么?

谢谢!

【问题讨论】:

    标签: graph neo4j cypher


    【解决方案1】:

    这应该返回所有没有连接的B 节点的A 节点和错误的prop

    MATCH (a:A)
    OPTIONAL MATCH (a)-[*]->(b:B { prop: false })
    WITH a, COLLECT(b) AS bs
    WHERE SIZE(bs)= 0
    RETURN a;
    

    这里是 a console 显示此查询。

    [更新]

    正如@InverseFalcon 所建议的,上面的查询可以大大简化:

    MATCH (a:A)
    WHERE NOT (a)-[*]->(:B {prop:false})
    RETURN a;
    

    【讨论】:

    • 谢谢!!!我想知道我的查询有什么问题。看起来我不完全理解 WHERE ALL () 的工作原理
    • 请注意,应该可以缩短一点:MATCH (a:A) WHERE NOT (a)-[*]->(:B {prop:false}) RETURN a
    • @InverseFalcon 另一个很棒的建议。谢谢。
    【解决方案2】:

    这行得通吗?

    MATCH (a:A)
    OPTIONAL MATCH (a)-[*]->(b:B {prop: false})
    WITH a, b
    WHERE b IS NULL
    RETURN a
    

    【讨论】:

    • 此查询返回所有A 节点。 WHERE 子句仅过滤第二个 (OPTIONAL) MATCH,并不会消除第一个匹配项找到的任何 A 节点。
    • 再次感谢密码! ;) 我认为我刚刚添加的 WITH 应该修复它
    • 这是一个微妙的解决方案,可能比我的更有效。很整洁。
    最近更新 更多