graph - Neo4j:如何查找以下所有节点:连接到具有特定属性的 0 个节点,或连接到具有属性集的所有节点

标签 graph neo4j cypher

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

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

或者换句话说,我需要找到所有未连接到任何属性设置为 false 的 B 的 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。我做错了什么?

谢谢!

最佳答案

这应该返回所有没有连接 B 节点且 prop 为 false 的 A 节点:

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;

关于graph - Neo4j:如何查找以下所有节点:连接到具有特定属性的 0 个节点,或连接到具有属性集的所有节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35195651/

相关文章:

javascript - Neo4j API 中阻止跨源请求

neo4j - 如何在 RDF 中表达关于关系的附加信息(时间、概率)?

java - 在 Java 应用程序中使用嵌入的 Neo4j

c++ - 传递不同数据类型的问题

python - 拓扑排序python

r - 在 R 中如何从 igraph 中删除小社区

neo4j - 摄取速度缓慢

Neo4j Cypher 路径使用多次相同的边

neo4j - 度中心性算法仅返回 0.0 作为分数

database - 如何对 titan graph DB 中的顶点属性执行通配符搜索?