2017-04-24 1 views
2

にノードとの関係を結合するのでthis questionの合併症として、私は基本的にCYPHERは、単一の列

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

をしたいと私はノーリピート値が1列としてのnとrを返すようにしたいです。 ":予想一覧が、関係(行1、列47)であった型の不一致" エラーただし、

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

を実行することができます。そして、このクエリ

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

は、同じ列内のノードとの関係を置きますが、最初の試合からのコンテキストは後半に失われています。

どのようにして、一致するすべてのノードと関係を1つの最小リストとして返すことができますか?

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 

EDIT

各関係からさらに多くのデータを返す限り、コード結果タブをチェックすると、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つのリストにそれらを結合しますが、その単なるフォーマットの変更であり、ノード情報は関係の時間に返されます。最初のクエリは私が望むことをしますが、関係ラベル(およびエンドノード)は失われます。関係ノード全体を値の一部にする方法はありますか? – Tezra

+0

トリック – InverseFalcon

+0

Okを実行する必要があるクエリを追加したので、開始ノードと終了ノードでid()関数を使用できます(これらのノードは、このノードの開始、終了、ラベル/タイプ、も返されるので、それ以上の情報は重複している)。ただ一つの最後のこと。型フィールドがオーバーロードされる可能性があるので、プロパティを「プロパティ」フィールドにプッシュして、それをきれいに保つ必要があります。それは私が単にできないようだ "プロパティ:。* "どうすればそれを修正できますか? – Tezra