如果我要使用此查询:
MATCH (x {foo:'bar'})-->(y) RETURN y;
它会返回任何节点' y'有一个或多个节点' x'指着它与物业&foo foo'设定价值' bar'。我只想找到节点' y' 指向它的每个节点都有' foo'设置为' bar'。所以,让我们说除了' x'节点' a'和' b'也指向' y'。 ' Y'只有当所有三个节点都是' x'' a'和' b'有' foo'设置为' bar'。
答案 0 :(得分:1)
我相信这样的事可能适合你:
MATCH
(node { foo:"bar" })-[:REL]->(target),
target<-[:REL]-(checkPoint)
WITH
target,
COLLECT(checkPoint) AS checkPoints
WHERE ALL (x IN checkPoints
WHERE x.foo="bar")
RETURN target
因此,target
将成为所有相关节点都设置了属性foo="bar"
的所有节点的命中。查询匹配会返回连接到target
的所有节点,然后根据ALL
- 谓词筛选出节点,您可以阅读有关here的更多信息}。
我认为如果你能根据id或索引命中找到target
的快速起点,那将是非常好的。此外,我强烈建议您使用Label
s来节点快速缩小匹配范围并获得(更好)更好的性能。
编辑:在OP输入更多内容后更新了查询。
答案 1 :(得分:0)
考虑以下数据......
create (x:Test {name: "X", foo:"bar"})
create (a:Test {name: "A", foo:"bar"})
create (b:Test {name: "B", foo:"bar"})
create (c:Test {name: "C", foo:"notbar"})
create (y1:Test {name:"Y1"})
create (y2:Test {name:"Y2"})
create x-[:CONNECTED]->y1
create a-[:CONNECTED]->y1
create b-[:CONNECTED]->y1
create x-[:CONNECTED]->y2
create c-[:CONNECTED]->y2
此查询仅返回连接节点为foo = 'bar'
match (n:Test)-->(y:Test)
where n.foo = 'bar'
with y, count(n) as num_bar
match (n:Test)-->y
with y, count(*) as num_total, num_bar
where num_bar = num_total
return y