2017-04-17 53 views
0

我有一個節點列表作爲輸入,我想找到連接到給定列表中的每個節點的所有節點。密碼:如何確保結果列表的順序?

例如,輸入是

[1,2,3,..] . //This could come in any order such as [1,4,2,...] 

和輸出應該是

[[n1,m1,p1,..],[n2,m2,p2,..],,,,] 

其中

[n1,m1,p1,..] 

是連接到1

所以節點的列表我想到了以下幾點d工作

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

不能使用'MATCH'內'FOREACH'不幸的是,你需要使用'UNWIND'。如果你可以更詳細地闡述你如何嘗試你的'UNWIND',以及它與期望的輸出有什麼不同,我們可以幫助你 –

+0

@TomažBratanič我發佈了使用'UNWIND'的查詢:) – arslan

回答

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_n​​ode),所以這是可能的您的結果集大小將不會等於您的輸入列表大小。

如果您知道每個id輸入都有一個a_node節點,並且您希望支持沒有連接的情況:b_node,請考慮只在a_node上執行MATCH,並在b_node上執行OPTIONAL MATCH。這樣你就可以正確地獲得空集: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 
+0

非常明確的解釋,謝謝:) – arslan

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 
+0

仍然無法正常工作。 [1,2,3]可能有很多次序,但並不總是按順序遞增。 – arslan

+0

並且您想要根據輸入[1,2,3]返回而不是按升序排序? –