2017-04-24 74 views
2

所以,作爲一個併發症合併成一個單一的列this question,我基本上想要做暗號的節點和關係

MATCH (n:TEST) OPTIONAL MATCH (n)-[r]->() RETURN DISTINCT n, r

而且我想返回n和r爲無重複值的一列。但是,運行

MATCH (n:TEST) OPTIONAL MATCH (n)-[r]->() UNWIND n+r AS x RETURN DISTINCT x

提供了一個 「類型不匹配:預計名單,但被關係(1號線,列47)」 的錯誤。而這個查詢

MATCH (n:TEST) RETURN DISTINCT n UNION MATCH()-[n]->() RETURN DISTINCT n

提出節點和關係在同一列,而是從第一場比賽的情況下在下半場丟失。

所以,我怎麼能返回所有匹配的節點和關係爲一個最小的名單?

UPDATE:

這就是答案查詢的最終修改後的版本,我使用

MATCH (n:TEST) OPTIONAL MATCH (n)-[r]->() RETURN n {.*, rels:collect(r {properties:properties(r), id:id(r), type:type(r), startNode:id(startNode(r)), endNode:id(endNode(r))})} as n

回答

4

有一對夫婦的方式來處理這個問題,這取決於您是否要內持有這些上列表或地圖內,或者如果您希望節點的地圖投影包含其關係。

如果您使用的Neo4j 3.1或更高版本,然後map projection可能是最簡單的方法。利用這一點,我們就可以輸出一個節點的屬性,包括其作爲一個收集財產關係:

MATCH (n:TEST) 
OPTIONAL MATCH (n)-[r]->() 
RETURN n {.*, rels:collect(r)} as n 

這裏的,如果你想你會做什麼每一行是自己的一個節點的配對和單一個

... 
RETURN [n, r] as pair 

而作爲一個圖:其作爲一個列表關係

... 
RETURN {node:n, rel:r} as pair 

編輯

只要從每個關係中返回更多數據,如果您檢查代碼結果選項卡,就會看到ID,關係類型以及開始和結束節點ID都包含在內,並可從您的後端代碼訪問。

但是,如果你想明確地返回這個數據,那麼我們只需要包括它在查詢,使用每個關係的其他地圖投影:

MATCH (n:TEST) 
OPTIONAL MATCH (n)-[r]->() 
RETURN n {.*, rels:collect(r {.*, id:id(r), type:type(r), startNode:startNode(r), endNode:endNode(r)})} as n 
+0

最後2它們合併成1列,但它只是一種格式變化,而節點信息是返回關係時間。第一個查詢做我想要的,但關係標籤(和結束節點)丟失。有沒有辦法讓整個關係節點成爲價值的一部分? (我需要的ID,開始,結束,標籤/類型,並從關係屬性) – Tezra

+0

增加了一個查詢應該做的伎倆 – InverseFalcon

+0

好了,我可以用開始和結束節點上的ID()函數(這些節點也會被返回,所以不止是重複的信息);只是最後一件事。類型字段可能會被重載,所以我需要將屬性降低到「屬性」字段以保持其清潔。看來我不能只是做「屬性:」。*「那麼我該如何解決這個問題? – Tezra

相關問題