2017-05-09 54 views
0

考慮,看起來像這樣的圖表:如何使用collect來組合允許空列表作爲結果的節點?

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

我想回到擴展與鄰國的列表中的所有節點。我現在查詢是以下

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":[]} │ 
└──────────────────────────────┘ 

我該如何編寫查詢呢?

回答

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

相當於

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

它說 「匹配所有A和他們的鄰居B,其中A有鄰居B」。 AKA,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; 
+0

我已經試過了,但有一個額外的「WITH」,它不起作用。 (x0) - [:B] - >(x1:B) WITH x0,x1「 」爲什麼?謝謝! –

+0

您需要一個'RETURN'子句(否則查詢無用,Cypher不允許這樣做)。 – cybersam

+0

我的意思是WITH子句作爲查詢的一部分,在答案的可選匹配之後。 –

3

要添加到@ Tezra的回答,您可以大大簡化查詢的其餘部分:

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