如何使用 collect 组成一个允许空列表作为结果的节点?

How to use collect to compose a node allowing empty lists as results?

考虑如下图:

(node) -> (related nodes)
a1 -> [b1, b2, b3]
a2 -> [b1]
a3 -> []

我想return所有节点扩展其邻居列表。我当前的查询如下

MATCH (x0:A)
MATCH (x1:B )
WHERE ((x0)-[:B]->(x1))
WITH x0,collect(x1) as x2
WITH x0,x0{.*, neighbors:x2} as x3
RETURN x3 as result

执行查询后得到以下结果:

╒══════════════════════════════╕
│"result"                      │
╞══════════════════════════════╡
│{"name":"a1","neighbors":[{"na│
│me":"b1"},{"name":"b2"},{"name│
│":"b3"}]}                     │
├──────────────────────────────┤
│{"name":"a2","neighbors":[{"na│
│me":"b1"}]}                   │
└──────────────────────────────┘

但我希望节点 "a3" 也出现在结果中,如下所示:

╒══════════════════════════════╕
│"result"                      │
╞══════════════════════════════╡
│{"name":"a1","neighbors":[{"na│
│me":"b1"},{"name":"b2"},{"name│
│":"b3"}]}                     │
├──────────────────────────────┤
│{"name":"a2","neighbors":[{"na│
│me":"b1"}]}                   │
├──────────────────────────────┤
│{"name":"a3","neighbors":[]}  │
└──────────────────────────────┘

我应该如何编写查询?

MATCH (x0:A)
MATCH (x1:B )
WHERE ((x0)-[:B]->(x1))

等同于

MATCH (x0:A)-[:B]->(x1:B )

这表示 "match all A and their neighbors B where A has neighbors B"。又名,B 是必需的。要使 B 可选,您需要使用可选匹配

MATCH (x0:A)
OPTIONAL MATCH (x0)-[:B]->(x1:B )

现在 B 列可以为空了!

完整查询(由 Cyber​​sam 简化)

MATCH (x0:A)
OPTIONAL MATCH (x0)-[:B]->(x1:B)
RETURN x0{.*, neighbors:COLLECT(x1)} AS result;

要添加到@Tezra 的答案,您可以大大简化查询的其余部分:

MATCH (x0:A)
OPTIONAL MATCH (x0)-[:B]->(x1:B)
RETURN x0{.*, neighbors:COLLECT(x1)} AS result;