2016-05-10 2 views
1

Как написать следующий запрос cyhper без ошибок?neo4j "try", чтобы создать связь с узлом

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

merge x-[]->(t)` 

Проблема заключается в том, что существует Cance, что t будет аннулирована и плохо получаю сообщение об ошибке: 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} представляет собой массив идентификаторов

В основном им привязка для создания связанный список поездок

ответ

1

Первое решение - использовать только MATCH, который затем остановит запрос, если нет узлов t.

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

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

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» часть - это то, что мне нужно и ее работа ... но нет более элегантного решения? как merge, где t не является нулевым или что-то вроде этого? – tubu13

+0

В настоящее время Cypher не хватает условностей, я уверен, что он придет. Я боюсь, что сейчас я не вижу ничего более элегантного. –

+0

Что-то не так. Связь создается, но после этого im делает 'с 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 будет о nly сделать MERGE, если t не NULL.

+0

спасибо, что это работает, но я как та же проблема, что и раньше .. i cannon return 'x' он всегда пуст .. любые идеи? – tubu13

+0

С neo4j 3.0, если вы создаете минимальные тестовые данные и заканчиваете мой запрос с помощью 'RETURN x', я всегда получаю' x'. Это даже если «ДОПОЛНИТЕЛЬНАЯ МАТЧА» терпит неудачу. Какую версию neo4j вы используете? – cybersam

+0

3. Im runnibg тот же запрос, что и в вопросе, только с циклом foreach – tubu13

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