2017-07-05 2 views
0

Ich versuche, eine Beziehung mit Eigenschaften abhängig von mehreren verschiedenen Fällen zu erstellen. Ich dachte, ich könnte FOREACH und CASE verwenden.Hinzufügen mehrerer Eigenschaften mit einer CASE/FOREACH-Anweisung in Cypher

Hier ist eine vereinfachte Version von meinem Code:

LOAD CSV WITH HEADERS FROM 'file:///hwconnectIDs.csv' AS cnct 
MATCH (h1:hardware), (h2:hardware), (c:cable) 
WHERE (h1.hwID= cnct.conID1) AND (h2.hwID = cnct.conID2) AND (c.cableID =cnct.cableID) 
FOREACH (plugType IN 
      CASE WHEN (h1.plug1=c.plug1 AND c.plug2=h2.plug1) 
       THEN [c.plug1,c.plug2] 
      CASE WHEN (h1.plug2=c.plug2 AND c.plug1=h2.plug1) 
       THEN [c.plug2,c.plug1] 
      ELSE [] END 
      | 
      CREATE (h1)<-[:connect{plug:plugType[0]}]-(c)-[:connect{plug:plugType[1]}]->(h2) 
     ) 

Probleme:

  • Es I Für die ELSE-Variable plugType in FOREACH
  • ein Array-Typ nicht erstellt werden kann, scheint Fall möchte ich die Beziehung überhaupt nicht schaffen. Im Moment wäre der Wert für die Beziehungseigenschaften plugType nur leer und nicht die gesamte Beziehung nicht vorhanden.

Hinweis: Die WHERE-Bedingung stellt sicher, dass ich mit den richtigen Hardware-Geräten und Kabel arbeite. Die Datei hwconnectIDs.csv gibt im Grunde eine Liste von Geräten h1 und h2 gemeint durch Kabel c verknüpft werden.

Gibt es eine Möglichkeit zur Ausführung von Befehlen nach mehreren verschiedenen Fällen in Cypher wie if/elseif /../ else in anderen Sprachen?

+0

Haben Sie eine Fehlermeldung oder ähnliches? –

+0

Ich hatte einen vorher. Aber als ich das gerade jetzt probiert habe, habe ich keins bekommen. Es sagte nur "(keine Änderungen, keine Aufzeichnungen)". –

+0

Sind Sie sicher, dass die in Ihrer 'MATCH'-Anweisung referenzierten Knoten existieren? –

Antwort

0

Sie können möglicherweise die WITH-Klausel für diese (vereinfachte Dinge unten) nutzen:

... 
WITH h1, h2, c, 
CASE 
WHEN (h1.plug1=c.plug1 AND c.plug2=h2.plug1) THEN [c.plug1,c.plug2] 
WHEN (h1.plug2=c.plug2 AND c.plug1=h2.plug1) THEN [c.plug2,c.plug1] 
ELSE [] END AS plugtype 
CREATE ... 

hoffe, das hilft, Tom

+0

Ich dachte auch darüber nach. Das Problem ist: Ich habe den Kabelknoten noch nicht. Mein Datenmodell ist so ausgelegt, dass es nur Sinn macht, die Kabelknoten als Teil einer Beziehung zwischen zwei Geräten zu erstellen. Daher erstelle ich in meinem Code das Kabel, bevor ich die Beziehung erstelle. Vielleicht sollte ich versuchen, die Kabel-Erstellung und die Beziehungs-Erstellung zu trennen, damit ich die Kabel referenzieren kann. –

+0

Nun, wenn die Datei - wie ich denke, ich verstehe aus Ihrer Erklärung - die tatsächlichen Verbindungen enthält (also wenn ein Kabel erstellt werden soll) durchlaufen Sie es einmal, um diese zu erstellen und die Beziehungen in einem zweiten Lauf zu tun. Sie können alles auf einmal erledigen ... aber selbst mit Millionen von Knoten, die zweimal durchlaufen werden, dauert das nicht lange und Sie haben zwei einfachere Abfragen anstelle einer komplizierten Abfrage. Stellen Sie sicher, dass Sie zuvor Beschränkungen für hwID und cableID erstellen. –

+0

Ich habe meine Abfrage mit dem obigen Code ausgeführt. Obwohl ich zuerst die Kabel erstellen musste, die einige andere Probleme verursachten. Ich arbeite jetzt mit py2neo daran herum. –

Verwandte Themen