如何使用 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 列可以为空了!
完整查询(由 Cybersam 简化)
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;
考虑如下图:
(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 列可以为空了!
完整查询(由 Cybersam 简化)
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;