我有三种节点(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)。似乎我错过了什么 - 任何提示都非常感谢,谢谢。
答案 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才能获得正确的结果。