2017-02-13 1 views
1

Я пытаюсь написать запрос слияния для отношения между двумя узлами. Сложная часть состоит в том, что если я не найду узел со вторым совпадением, я хочу сделать другое совпадение, чтобы искать «резервный» узел с различными условиями фильтрации для запроса слияния.Имейте «резервный» узел при слиянии отношений в cypher

Чтобы сделать его коротким: я хочу объединить (A) -> (B), если существует B, и (A) -> (C), если B не существует.

Это то, что я придумал, посмотрев на различных должностях:

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))

Однако он не работает по назначению: если оба дополнительные узлы матч не нуль, то два отношения создаются ориентации каждого узла ,

Спасибо!

ответ

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

Мне нравится ваше решение, чище, чем у меня, и я узнал, что COALESCE работает на узлах ^^ –

Смежные вопросы