在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
我想找到哪些房间不在他们之间有一扇门。我希望得到这样的输出:
{"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中正确地阐明这一点。
答案 0 :(得分:1)
WHERE
子句采用关系模式,您可以使用NOT
函数来过滤没有关系。
MATCH (a:Room), (b:Room)
WHERE NOT a-[:DOOR]-b AND a <> b
RETURN a, b
这是docs中的部分。