查找指向它的所有节点都将属性设置为相同值的节点

时间:2015-01-12 18:44:26

标签: neo4j

如果我要使用此查询: 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'。

2 个答案:

答案 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'

的y个节点
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