寻找没有特定关系的节点(Cypher/neo4j)

22

我有一个包含以下内容的neo4j数据库:

a:Foo
b:Bar

大约有10%的数据库具有 (a)-[:has]->(b) 关系。

我需要获取没有这种关系的节点!

以前可以使用 ()-[r?]-(),但不再支持 :( 相反,按照建议执行

OPTIONAL MATCH (a:Foo)-[r:has]->(b:Bar) WHERE b is NULL RETURN a

因为可选匹配需要两个节点都存在或都不存在,所以我得到了一个空结果...

那么,如何获取所有未连接到b:Bara:Foo节点?

注意:数据集中有数百万个节点,因此查询需要高效,否则会超时。

2个回答

38

那将是

MATCH (a:Foo) WHERE not ((a)-[:has]->(:Bar)) RETURN a;

天啊...就是这个!我一直试图把标签放在那个匹配的右侧。 - Diaspar
它没有任何性能问题吗?它似乎占用了所有节点。 - vladkras

12

如果您正在寻找所有独生子或孤儿,则此方法同样适用:

MATCH (a:Foo) WHERE not ((a)--()) RETURN a;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接