2017-02-13 7 views
1

2つのノード間のリレーションシップのマージクエリを作成しようとしています。トリッキーな部分は、2回目の試合でノードが見つからない場合、別のマッチを行い、マージ要求のフィルタリング条件が異なる「フォールバック」ノードを探すことです。サイファーでリレーションをマージするときにフォールバックノードがある

簡潔にする:Bが存在する場合は(A)→(B)、Bが存在しない場合は(A)→(C)をマージしたい。

これは私が別の記事を見た後思い付いたものです:

MATCH (n:ArticleConv {id:"firstId"}) OPTIONAL MATCH (m:ArticleCode {name:"targetName"}) WHERE m.begin <= n.begin <= m.end OPTIONAL MATCH (l:ArticleCode {num:"targetName"}) WHERE not(()-[:Version]->(l)) FOREACH (o IN CASE WHEN m IS NOT NULL THEN [m] WHEN m IS NULL AND l IS NOT NULL THEN [l] ELSE [] END | MERGE (n)-[r:Link]->(o))

意図したとおりに動作していないが:両方のオプション一致ノードがnullでない場合は、2人の関係は、それぞれのノードを対象に作成されます。

ありがとうございます!

答えて

0

あなたはそのような何かすることができます

MATCH (n:ArticleConv {id:"firstId"}) 
OPTIONAL MATCH (m:ArticleCode {name:"targetName"}) WHERE m.begin <= n.begin <= m.end 
OPTIONAL MATCH (l:ArticleCode {num:"targetName"}) WHERE not(()-[:Version]->(l)) 
WITH n, coalesce(m,l) AS node WHERE node IS NOT NULL 
    MERGE (n)-[r:Link]->(node) 

乾杯

+0

私は、私よりクリーンなソリューションを好むと私は合体がノード上で動作することを学んだし^^ –

関連する問題