【问题标题】:Using Neo4j Cypher to find which nodes are not related to each other使用 Neo4j Cypher 查找哪些节点彼此不相关
【发布时间】:2015-08-28 14:47:20
【问题描述】:

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

【问题讨论】:

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

标签: neo4j cypher


【解决方案1】:

WHERE 子句采用关系模式,您可以使用NOT 函数过滤不存在​​的关系。

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

这是docs 中的部分。

【讨论】:

  • 我添加了一行AND a &lt;&gt; b
  • 对,除非这是爱丽丝梦游仙境或树叶屋,否则房间可能没有自己的门 :)
猜你喜欢
  • 2014-10-29
  • 2020-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 1970-01-01
  • 1970-01-01
  • 2017-05-28
相关资源
最近更新 更多