2017-02-08 6 views
1

メッセージキューを介してデータベース書き込みコマンドをワーカー(非常に大量)にディスパッチするアプリケーションがあるので、エンドノードが存在する場合にノードとリレーションシップを作成する(そうでなければ最初のノードのみを作成する)

私は2つのノード、例えば "アカウント"と "メディア"を持っています。この仮想アプリケーションでは、ユーザーは匿名のメディアをアップロードできます。匿名のメディアは自動的に作成され、後で関連付けることができます。

アカウント用とメディア用の2つのメッセージが受信されます(ほぼ確実に異なるワーカーによって)。どちらも、もう一方がまだ書かれているかどうかは分かりません。他のノードが存在する場合は、

  • 新しいアカウントを作成/メディア
  • POSTED_BYの関係、他のノードは、Ifを作成します。私は、各ワーカー上で実行されるクエリを、記述する必要があります存在しない場合、のみにかかわらず、各メッセージは、受信された注文の、したがって
  • 戻り、新しく作成されたノード

を現在のノードを作成し、最初のクエリは、ノードAを作成し、第うeの2番目のクエリはノードB +関係を作成します。

私は同じクエリでそれらの両方を作成していた場合、それは簡単で、次のようになります。

CREATE (m:Media { url: 'xyz.jpg' })-[:POSTED_BY]->(u:Account { username: 'johndoe' }) 
RETURN m,u 

私は、CREATE UNIQUEMERGEを見てきましたが、両方のは、それが存在しない場合、ノードを作成するように見えます、何もしないだけではありません。

答えて

1

この操作にはMERGEを使用したいと思います。基本的に、一度に1つのノードを作成するのではなく、ノードとリレーションシップの両方を作成できますが、追加のプロパティで特定のノードを更新できます。

考えてみましょうメッセージの一つははあなたが考えられるMERGEを経由して各ノードを個別に作成し、持っている可能性があり

MERGE (u:Account { username: 'johndoe' }) 
SET u =+ {user_props} 
MERGE (m:Media { url: 'xyz.jpg' }) 
MERGE (m)-[:POSTED_BY]->(u) 
RETURN u 

新しいユーザーアカウントのメッセージであるメッセージ二つを考えてみましょう

MERGE (m:Media { url: 'xyz.jpg' }) 
SET m =+ {media_props} 
MERGE (u:Account { username: 'johndoe' }) 
MERGE (m)-[:POSTED_BY]->(u) 
RETURN m 

メディアメッセージであります関係の3番目のメッセージ。パターンは同じですが、ノードのいずれかに追加のプロパティーを設定しません。ソリューションのすべてが、MERGE文でメディアやアカウントを識別するためのキーが一意であることを前提としていること例えば

...

// message 1 
// create the media node 
MERGE (m:Media { url: 'xyz.jpg' }) 
SET m =+ {media_props} 
RETURN m 


// message 2 
// create the user/account node 
MERGE (u:Account { username: 'johndoe' }) 
SET u =+ {user_props} 

// message 3 
// create the relationship 
MERGE (u:Account { username: 'johndoe' }) 
MERGE (m:Media { url: 'xyz.jpg' }) 
MERGE (m)-[r:POSTED_BY]->(u) 
RETURN m,r,u 

注意。

0

私は答えがすでに受け入れられている知っているが、それは実際にウィットに、質問に答えるように感じることはありません。

他のノードが存在しない場合は、現在のノードのみを作成

これは、次のことによって達成することができます:マッチが成功した場合

CREATE (m:Media { url: 'xyz.jpg' }) 
WITH m 
MATCH(u:Account { username: 'johndoe' }) 
CREATE(m)-[r:POSTED_BY]->(u)" 
RETURN m 

残念ながら、これが唯一のmを返します。

+0

'm、r、u'を返すことができず、' m'の代わりにすべての変数を返すことができない理由はありません –

関連する問題