找到一个节点,其中所有指向它的节点都将 属性 设置为相同的值
Find a node where all nodes that point to it have a property set to the same value
如果我要使用这个查询:
MATCH (x {foo:'bar'})-->(y) RETURN y;
它将 return 任何节点 'y' 有一个或多个节点 'x' 指向它并且 属性 'foo' 设置为值 'bar'。我只想找到节点 'y',其中 每个 指向它的节点都将 'foo' 设置为 'bar'。所以假设除了 'x' 之外,节点 'a' 和 'b' 也指向 'y'。如果所有三个节点 'x'、'a' 和 'b' 都将 'foo' 设置为 'bar',则 'y' 应该只被 returned。
考虑以下数据....
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
这个查询returns只有y个节点与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
我相信这样的事情可能对你有用:
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"
集的所有节点的命中。查询匹配 returns 所有 连接到 target
的节点,之后它根据 ALL
-predicate 过滤掉节点,你可以阅读更多关于 here.
我认为,如果您能根据 id 或索引命中找到 target
的快速起点,那就太好了。此外,我强烈建议您对节点使用 Label
s 以快速缩小匹配范围并获得(更多)更好的性能。
编辑: 在 OP 提供更多输入后更新了查询。
如果我要使用这个查询:
MATCH (x {foo:'bar'})-->(y) RETURN y;
它将 return 任何节点 'y' 有一个或多个节点 'x' 指向它并且 属性 'foo' 设置为值 'bar'。我只想找到节点 'y',其中 每个 指向它的节点都将 'foo' 设置为 'bar'。所以假设除了 'x' 之外,节点 'a' 和 'b' 也指向 'y'。如果所有三个节点 'x'、'a' 和 'b' 都将 'foo' 设置为 'bar',则 'y' 应该只被 returned。
考虑以下数据....
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
这个查询returns只有y个节点与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
我相信这样的事情可能对你有用:
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"
集的所有节点的命中。查询匹配 returns 所有 连接到 target
的节点,之后它根据 ALL
-predicate 过滤掉节点,你可以阅读更多关于 here.
我认为,如果您能根据 id 或索引命中找到 target
的快速起点,那就太好了。此外,我强烈建议您对节点使用 Label
s 以快速缩小匹配范围并获得(更多)更好的性能。
编辑: 在 OP 提供更多输入后更新了查询。