Ich versuche, einige Daten in Neo4J zu laden. Ich habe einen Person
Knoten, der bereits eingerichtet ist. Jetzt muss dieser Knoten eine email
Eigenschaft haben, die ein Array (oder eine Sammlung) sein sollte. Grundsätzlich ist die email
Eigenschaft muss mehrere Werte haben, wie -Wie mehrere Werte zu bestehenden Knoten mit Cypher in Neo4J hinzugefügt werden
email: ["[email protected]", "[email protected]"]
Ich bin gekommen, über ähnliche Fragen hier aber alle Antworten zeigen auf mehrere Eigenschaft festlegen an dem Zeitwert der Knoten selbst erstellt wird. Wie diese Abfrage aus this Antwort -
CREATE (e:Employee { name:"Sam",languages: ["C", "C#"]})
RETURN e
Aber das Problem in meinem Fall ist, dass Person
Knoten bereits erstellt wird, und ich brauche jetzt die email
Eigenschaft auf sie einzustellen.
Dies ist eine kleine Teilmenge der Daten, die ich laden müssen -
Personid|email
933|[email protected]
933|[email protected]
933|[email protected]
1129|[email protected]
1129|[email protected]
1129|[email protected]
4194|[email protected]
4194|[email protected]
Auch werden die Daten aus einer CSV kommen mit Tausenden von Zeilen-Datei, so meine Frage generisch sein muss, kann ich‘ t Legen Sie die Eigenschaften für jeden einzelnen Knoten Person
fest.
Als ich die Erstellung der E-Mail-Eigenschaft mit dieser Untergruppe, mein erster Versuch testet war -
MATCH (n:TESTPERSON{id:933})
SET n.email = "[email protected]"
RETURN n
MATCH (n:TESTPERSON{id:933})
SET n.email = "[email protected]"
RETURN n
Als ich dachte, dies überschreibt nur die email
Eigenschaft auf den Wert in den jüngsten Abfrage.
Nachdem hier bei den Antworten zu suchen und auf dem Cypher docs, fand ich heraus, dass Neo4j Ihnen einen Array/Sammlung (mehrere Werte des gleichen Typs) als Eigenschaft Wert setzen, und ich habe dann versucht, diese -
// CREATE test node
CREATE (n:TESTPERSON{id:933})
RETURN n
// at this time, this node does not have any `email` property, so setup
// email as an array with one string value
MATCH (n:TESTPERSON{id:933})
SET n.email = ["[email protected]"]
RETURN n
// Now, using +=, I can append to the array of strings
MATCH (n:TESTPERSON{id:933})
SET n.email = n.email + "[email protected]"
RETURN n
// add a third value to array
MATCH (n:TESTPERSON{id:933})
SET n.email = n.email + "[email protected]"
RETURN n
Wie Sie sehen können, die email
Eigenschaft hat jetzt mehrere Werte.
Aber das Problem ist, dass, da meine CSV-Datei Tausende von Zeilen hat, brauche ich eine generische Abfrage, um dies zu tun.
Ich dachte an eine CASE
Erklärung gemäß der Dokumentation mit here und versuchte, diese -
MATCH (n:TESTPERSON {id:933})
CASE
WHEN n.email IS NULL THEN SET n.email = [ "[email protected]"]
ELSE SET n.email = n.email + "[email protected]"
RETURN n
Aber das wirft nur den Fehler - mismatched input CASE expecting ;
.
Ich habe gehofft, ich diese Abfrage als eine generische Art und Weise nutzen könnte für meine CSV-Datei wie diese -
LOAD CSV WITH HEADERS FROM 'FILEURL' AS line FIELDTERMINATOR `|`
MATCH (n:TESTPERSON {id:toInt(line.Personid)})
CASE
WHEN n.email IS NULL THEN SET n.email = [line.email]
ELSE SET n.email = n.email + line.email
Aber ich weiß nicht einmal, ob das funktionieren würde, auch wenn die CASE
Fehler behoben sind.
Ich bin wirklich ratlos und würde jede Hilfe zu schätzen wissen. Danke.
Danke! Das hat perfekt funktioniert.Hier ist die Abfrage, die ich ausgeführt habe - 'CSV mit Kopfzeilen laden von 'fileURL" AS Zeile FIELDTERMINATOR' | ' MATCH (n: TESTPR. {ID: toInt (line.Personid)}) SET n.email = COALESCE (n.email, []) + line.email' –