cypher:如何确保结果列表的顺序?

时间:2017-04-17 09:30:38

标签: neo4j cypher

我有一个节点列表作为输入,我想找到连接到给定列表中每个节点的所有节点。

例如,输入是

   [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',但输出中列表的顺序不正确 我需要按给定列表中的元素顺序收集它们。只需要通过订单获得结果。

我的问题是我的想法是否正确? 任何人都可以在这里指出我的错误,在此先感谢!

2 个答案:

答案 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