找到一个节点,其中所有指向它的节点都将 属性 设置为相同的值

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 的快速起点,那就太好了。此外,我强烈建议您对节点使用 Labels 以快速缩小匹配范围并获得(更多)更好的性能。

编辑: 在 OP 提供更多输入后更新了查询。