使用Neo4j Cypher查找哪些节点彼此无关

时间:2015-08-28 14:47:21

标签: neo4j cypher

在Neo4j中,我创建了一个包含4个节点的小图,其中一些节点与其他节点相关联:

CREATE
(a:Room {name:"A"})
-[:DOOR]->
(b:Room {name:"B"})
-[:DOOR]->
(c:Room {name:"C"})
-[:DOOR]->
(d:Room {name:"D"}),
a-[:DOOR]->c,
a-[:DOOR]->d,
b-[:DOOR]->a
RETURN a,b,c,d

enter image description here

我想找到哪些房间在他们之间有一扇门。我希望得到这样的输出:

{"B": ["D"], "C": ["A", "B"], "D": ["A", "B", "C"]}

我可以为一个给定的起点做到这一点......

MATCH (b), (r)
WHERE b.name = "B"
AND NOT (b)-[:DOOR]->(r)
AND b <> r
RETURN r
// Returns Room D

这是我的货物崇拜伪代码,用于迭代每对可能的节点:

MATCH rooms = (r)
SET output = {}
FOREACH (
room IN nodes(rooms),
exit IN nodes(rooms),
missing = [],
output[room.name] = missing
|
IF room <> exit AND NOT room-[:DOOR]->(exit)
THEN missing = missing + exit
)
RETURN output

请帮助我了解如何在Cypher中正确地阐明这一点。

1 个答案:

答案 0 :(得分:1)

WHERE子句采用关系模式,您可以使用NOT函数来过滤没有关系。

MATCH (a:Room), (b:Room)
WHERE NOT a-[:DOOR]-b AND a <> b
RETURN a, b

这是docs中的部分。