我有一个节点列表作为输入,我想找到连接到给定列表中每个节点的所有节点。
例如,输入是
[1,2,3,..] . //This could come in any order such as [1,4,2,...]
,输出应为
[[n1,m1,p1,..],[n2,m2,p2,..],,,,]
其中
[n1,m1,p1,..]
是连接到1的节点列表。
所以我认为以下内容应该有效
FOREACH (num in [1,2,3] |
match (a : a_node {id:num})-[]-(b:b_node)
with a, collect(b) as set )
return set
which did not work, so I tried
UNWIND [1,2,3] as num
match (a : a_node {id:num})-[]-(b:b_node)
with a, collect(b) as set
return set
哪个有效,但顺序错了。我得到了以下
[[n2,m2,p2,..],[n1,m1,p1,..],...]
我尝试了'UNWIND',但输出中列表的顺序不正确 我需要按给定列表中的元素顺序收集它们。只需要通过订单获得结果。
我的问题是我的想法是否正确? 任何人都可以在这里指出我的错误,在此先感谢!
答案 0 :(得分:1)
对于按照列表中给出的顺序进行自定义排序,您需要创建并使用自己的列表索引,并在最后使用该索引进行排序:
WITH [1,2,3] as num
UNWIND range(0, size(num) - 1) as index
MATCH (a : a_node {id:num[index]})-[]-(b:b_node)
WITH index, a, collect(b) as set
ORDER BY index ASC
RETURN set
请记住,由于您的MATCH,任何:与a:b_node没有关系的a_node将被排除在结果中(以及任何没有的输入id:带有id的a_node ),因此您的结果集大小可能不等于您的输入列表大小。
如果您知道每个id输入都有一个:a_node节点,并且您希望支持没有连接的情况:b_node,请考虑仅对:a_node进行MATCH,并对b_node进行可选匹配。这样你就可以正确获取空集:a_nodes没有:b_node连接。
以下是这种修改的样子:
WITH [1,2,3] as num
UNWIND range(0, size(num) - 1) as index
MATCH (a : a_node {id:num[index]})
OPTIONAL MATCH (a)--(b:b_node)
WITH index, a, collect(b) as set
ORDER BY index ASC
RETURN set
答案 1 :(得分:0)
好的,你需要添加的是ORDER BY
。这应该工作
UNWIND [1,2,3] as num
match (a : a_node {id:num})-[]-(b:b_node)
with a, collect(b) as set order by a.id asc
return set