2015-08-28 120 views
0

在Neo4j的,我创建了一个小图有4个节点,其中一些链接到其他一些:使用Neo4j的暗号找到哪些节点没有相互关联的

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中正确表达这一点。

+0

我在回答之前错过了编辑,问题是如何针对所有节点对执行此操作? – jjaderberg

回答

1

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

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

以下是docs中的部分。

+0

我已经添加了一行'AND a <> b' –

+0

没错,除非这是爱丽丝梦游仙境或叶子之屋,否则房间可能没有自己的门:) – jjaderberg

相关问题