找到不存在的关系

时间:2017-10-08 18:38:25

标签: neo4j cypher

我有三种节点(a),(b)和(c)。 (a)和(b)总是通过关系(a) - (b)连接。

我希望找到所有节点类型(a)

a)与(c)

没有关系

b)满足(b)

属性的条件

我尝试了几种方法,例如像

MATCH (a), (c) WHERE NOT (a)--(c) MATCH (a)--(b) WHERE b.condition = "foo" return a

MATCH (a)--(b)
WHERE b.condition = "foo" AND NOT EXISTS ((a)--(c))
RETURN a

但我也得到了与(b)和(c)有联系的节点(a)。似乎我错过了什么 - 任何提示都非常感谢,谢谢。

1 个答案:

答案 0 :(得分:1)

假设以下......

1)节点没有标记(性能不佳)

2)(a)与(b)

有1和1的关系

你可以通过计算它的边缘来判断(a)是否有(c)关系

MATCH (a)--(b{condition:"foo"})
WITH a, COUNT((a)--()) as count
WHERE count = 1
RETURN a

请注意,这不是执行情况。如果可以,您应该指定标签和关系方向。此外,检查MATCH中的属性而不是WHERE,因为通常更快。

以下是具有适当标签的相同查询。

MATCH (a:A)-->(b:B{condition:"foo"})
WHERE NOT (a)--(:C)
RETURN a

关于此查询的错误

MATCH (a), (c) WHERE NOT (a)--(c) MATCH (a)--(b) WHERE b.condition = "foo" return a

您将每个节点与每个其他节点进行匹配,检查是否存在(a)与之无关的节点,然后将所有(a)与(a)--(b{condition:"foo"})匹配。简而言之,匹配NOT (a)--(c)的方式非常昂贵,并且不执行任何操作,因为它不是您想要的过滤器。

第二个查询更接近,但没有编译,因为(c)没有定义。它仍然是错误的过滤器(这次询问(a)是否与任何人无关)。这是第二个修复的查询。 (<>是Cypher中的&#34;不等于&#34;运算符)

MATCH (a)--(b), (c)
WHERE b.condition = "foo" AND (b) <> (c) AND NOT (a)--(c)
RETURN a

请注意,没有标签,此查询仍然是错误的,并且只是非常昂贵的边缘计数。您需要一个标签或属性来标识节点是a,b还是c才能获得正确的结果。