2016-10-24 3 views
0

私はこのサイファークエリを得た:13のEmailノードと10個のPhoneノード しかし:私は結果があるノードを返すときNeo4jのプロパティを返すと予期しない結果が生じるのはなぜですか?

match (c:Person) 
match (c)-[:eml]->(emls:Email) 
match (c)-[:phn]->(phns:Phone) 
return phns.Number, emls.Value 

EmailのノードはPhoneノードが10

で、13です私は財産を返す、と言うこと:phones.Number、私は130の重複した結果(13 * 10から来た数)を取得します。

+0

問題は完全に明らかではありません。まず、あなたのグラフには1人の人がいますか?第二に、結果の数はどこで数えますか?視覚化ビュー( "グラフ")は ​​"重複"を取り除きますが、テーブル( "行")に行くと、それらを見ることができます。私はここで簡単な例を作りました:https://gist.github.com/szarnyasg/62229f46e81b4a2dd58a5ea26017e561 - あなたのニーズに合わせてそれを質問に加えてください。 –

+0

コメントありがとうございました。私はデータベースに複数の人物を持っています。私はテスト目的のためにその数のノードを入力したので、カウントを知っています –

答えて

4

あなたは新しいパターンを照合することによって、結果のグラフを展開するたびに、新しい結果を以前の結果の直積を実行します。

  1. はあなたが、その後1人xを持つ
  2. 1人を持っています13通の電子メール、すなわち13(人、電子メール)が
  3. をタプルあなたはその後、1人が×10台の携帯電話13通の電子メールをxはしている、すなわち130(人、電子メール、電話は)

をタプルあなたが各ステップで収集する必要がありますアボid:1人の結果を1行、電子メールと電話の両方がコレクションである1人(人、電子メール、電話)タプル。

MATCH (c:Person) 
OPTIONAL MATCH (c)-[:eml]->(emls:Email) 
WITH c, collect(emls.Value) AS emails 
OPTIONAL MATCH (c)-[:phn]->(phns:Phone) 
RETURN c, emails, collect(phns.Number) AS phones 
+0

あなたの答えをありがとう。問題は、取得された結果が.As(Of T)メソッドを使用するときにNeo4jsCliemtによって読み込み可能でないため、私はcollect関数を使用できないということです。とにかくこれを回すことができますか? –

+1

あなたは 'collect()'を使うだけで、多くの結果行を組み合わせることができません。クライアントが文字列や数値のコレクションを列、特にNeo4jクライアントで読み取ることができないことを想像するのは難しいことです。私は、 'collect()'に頼らなくても、単一のノードプロパティにすでにコレクションが含まれている可能性があるので、それらを読むことがかなり制限されていることを意味します。 –

+0

それを試みます。助けてくれてありがとうございました。 –

関連する問題