2016-05-10 9 views
1

エラーなく次のサイファークエリを書き込むにはどうすればよいですか?neo4jノードとの関係を作成しようとしました

Match (n: {id :"someid"}),(x {id:"otherId"}) 
OPTIONAL MATCH (n)-[]->(t:Other) 

merge x-[]->(t)` 

問題はtはnullにして病気のエラーを取得することcanceがあるということです。 Expected to find a node at t but found nothing Some(null)

これは完全なクエリです:

MATCH (traveler:${labels.N_TRAVELER} {id: {traveler}.id}) 
     OPTIONAL MATCH (traveler)-[r:${labels.R_TRAVELER_LATEST_EVENT}]->(prev:${labels.N_EVENT}) 
     OPTIONAL MATCH (interest:${labels.N_INTERESTS}) WHERE interest.id IN {interests} 

     DELETE r 
     MERGE (traveler)-[:${labels.R_TRAVELER_LATEST_EVENT}]->(trip:${labels.N_TRIP_EVENT}) 
     ON CREATE SET trip={trip} 

     MERGE (traveler)-[:${labels.R_TRAVELER_WRITE_TRIP}]->(trip) 
     MERGE (trip)-[:${labels.R_TRIP_INTEREST}]->(interest) 

     WITH trip, collect(prev) as prevs 
     UNWIND prevs as prev 
     MERGE (trip)-[:${labels.R_EVENT_PREV_EVENT}]->(prev) 
     WITH trip 
     RETURN properties(trip) as trip` 

すべてlabels.だけです文字列.. {interests}はIDの配列です

基本的にはトリップのリンクされたリスト

答えて

1

最初の解決策は、tノードがない場合にクエリを停止するMATCHのみを使用することです。

MATCH (n {id:"someid"}), (x {id:"otherId"}) 
MATCH (n)-->(t:Other) 
MERGE (x)-[:RELATIONSHIP]->(t) 

場合、第二の溶液は、このクエリの部分が大きなクエリの一部であり、あなたが後でものを行う必要があるが、トンを収集することで、NULLコレクションの場合は空になりますので、あなただけ繰り返すことができますそれは要素が含まれている場合:ここで

MATCH (n {id:"someid"}), (x {id:"otherId"}) 
OPTIONAL MATCH (n)-->(t:Other) 
WITH n, x, collect(t) as ts 
UNWIND ts as t 
MERGE (x)-[:RELATIONSHIP]->(t) 
WITH n, x 
// continue query 
+0

「UNWIND」の部分は、私が必要としていることとその作業ですが、それ以上の優雅な解決法はありません。 tがnullでないか、それとも何かのようなマージのようなものですか? – tubu13

+0

現在、Cypherには条件付きのビットがありません。私は今、もっとエレガントなものを見ていないのだろうか? –

+0

何かが正しくない..関係は作成されているが、その後は 'n return n'を実行して空を返す? – tubu13

1

を、私は、オプションのMERGEを処理するために使用する回避策です:

MATCH (n {id:"someid"}), (x {id:"otherId"}) 
OPTIONAL MATCH (n)-->(t:Other) 
FOREACH(y IN CASE WHEN t IS NULL THEN [] ELSE [1] END | MERGE (x)-[:RELATIONSHIP]->(t)); 

FOREACH意志0 tNULLでない場合は、MERGEを実行します。

+0

これはうまくいきましたが、前と同じ問題です。私は 'x'を返します。 – tubu13

+0

neo4j 3.0では、最小限のテストデータを作成し、 'RETURN x'を使ってクエリを終了すると、常に' x'が返されます。これは、 'OPTIONAL MATCH'が失敗した場合でもあります。どのneo4jバージョンを使用していますか? – cybersam

+0

3.ちょうどforeachループの質問と同じクエリを実行する – tubu13

関連する問題