2012-07-06 6 views
17

Neo4JのCypherでは、2つのノードが与えられている場合、それらの間に関係がなければ、weightプロパティが1の関係(Fooタイプ)を作成したいと思います。この関係がすでに存在する場合は、その重みプロパティを増やしたいと思います。Cypherでは、関係が存在しない場合はどうすれば作成できますか?それがあればupdateプロパティ

これを単一のCypherクエリで実行するよい方法はありますか?ありがとう!

編集:いくつか追加の詳細: ノードはすでに作成されており、一意であり、インデックスに登録されています。

+0

あなたはのNeo4jのスナップショットのバージョンを使用して大丈夫か? neo4j 1.8では、Cypherを使用してグラフを更新できますが、他のバージョンでは更新できません。 – Nicholas

+0

はい、私はスナップショットを使用しています。 – Newtang

+0

本質的に、すべてのノードをスキャンすることを目指しており、接続されている場合は、増加していなければリレーションシップを作成しますか? – Nicholas

答えて

44

これは、正確に私たちが1.8でCREATE UNIQUEを追加した理由です。

START a=node(...), b=node(...) 
CREATE UNIQUE a-[r:CONNECTED_TO]-b 
SET r.weight = coalesce(r.weight?, 0) + 1 

読むよりおよそCREATE UNIQUEhere、疑問符here、およびhereを合体。

+0

パーフェクト!ちょうど私が探していたもの。私はRELATEについて知っていましたが、合体フレーズは知りませんでした。何が正確に "?"行う? – Newtang

+0

マニュアルを指すように答えを編集 – Andres

+4

Neo4j 2.0以降では?オペレータは削除されました。以下を参照してください:http://neo4j.com/docs/snapshot/query-operators.html#query-operators-comparison –

10

アンドレスの答えを完了するには、プロパティの末尾に疑問符が今のNeo4j 2 とエラーになりますので、要求は次のようになります。

MATCH a, b 
WHERE a(...) AND b(...) 
CREATE UNIQUE a-[r:CONNECTED_TO]->b 
SET r.weight = coalesce(r.weight, 0) + 1