2016-05-10 4 views
1

Wie kann ich die nächste Cyper-Abfrage ohne Fehler schreiben?neo4j "Versuch", eine Beziehung zum Knoten zu erstellen

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

merge x-[]->(t)` 

Das Problem ist, dass es eine cance ist, dass t null sein wird und krank eine Fehlermeldung erhalten: Expected to find a node at t but found nothing Some(null)

dies ist die komplette Abfrage:

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` 

alle labels. sind nur Zeichenketten .. {interests} ist ein Array von IDs

Im Grunde zu erstellen, ein verkettete Liste von Reisen

Antwort

1

Die erste Lösung ist, nur MATCH zu verwenden, die die Abfrage dann beendet, wenn keine t Knoten vorhanden sind. nur

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

Die zweite Lösung, falls dieser Abfrageteil ist ein Teil einer größeren Abfrage und Sie müssen Dinge tun danach werden die t, im Fall von null der Sammlung leer sein sammeln und somit können Sie iterieren wenn es Elemente enthält:

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

der 'UNWIND' Teil ist genau was ich brauche und seine Arbeit .. aber es gibt keine elegantere Lösung? wie merge wo t ist nicht null oder so ähnlich? – tubu13

+0

Momentan fehlen Cypher ein paar Bedingungen, ich bin mir sicher, dass es kommen wird. Ich fürchte, ich sehe derzeit nichts eleganteres. –

+0

Etwas stimmt nicht. Die Beziehung wird erstellt, aber danach mache ich 'n n return n' und es kommt leer zurück .. irgendwelche Ideen? – tubu13

1

Hier ist die Abhilfe würde ich das optionale MERGE zu handhaben verwenden:

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

die FOREACH wird o nur die MERGE wenn t ist nicht NULL.

+0

Danke das funktioniert aber ich als das gleiche Problem wie zuvor .. ich Kanone zurück 'x' es immer leer .. irgendwelche Ideen? – tubu13

+0

Wenn ich mit neo4j 3.0 einige minimale Testdaten erstelle und meine Abfrage mit 'RETURN x 'beende, bekomme ich immer' x' zurück. Dies ist auch dann der Fall, wenn das "OPTIONAL MATCH" fehlschlägt. Welche neo4j-Version verwendest du? – cybersam

+0

3. Im Runnibg die gleiche Abfrage wie in der Frage nur mit der foreach-Schleife – tubu13