2016-11-24 2 views
1

Ich habe eine Node-Tabelle und eine Edge-Tabelle, die beide als CSV-Dateien zur Verfügung stehen. ich es geschafft, die Node Tabelle laden von:Wie Sie Eigenschaften mit NULL-Werten mit Neo4j MERGE einbinden

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM 'file:///NodesETL.csv' AS line 
CREATE (:InfoNodes {id: toString(line.id), description: toString(line.description)}) 

Diese Abfrage erstellt die InfoNodes mit den Feldwerten der CSV-Datei als Eigenschaften: InfoNodes was in Ordnung ist.

InfoNodes haben Beziehungen mit anderen InfoNodes, z. Diese Beziehungen bestehen zwischen Knoten mit demselben Label. Diese Beziehungen werden in einer Edge-Tabelle gespeichert, die als zusätzliche CSV-Datei verfügbar ist. Jede Zeile dieser Edge-Tabelle enthält idfrom- und idto-Felder, die die Beziehungen zwischen InfoNodes auf der Basis ihrer ID-Eigenschaft definieren. Die Edge-Tabelle enthält auch 3 zusätzliche Felder, die Eigenschaften der Beziehung darstellen. Die erste Eigenschaft ist immer eine Zeichenkette und niemals NULL, z. niemals eine leere Zeichenfolge. Die secondproperty und die dritte Eigenschaft, beide vom Typ string, können NULL-Werte wie "" haben. So können zweite Eigenschaft und/oder dritte Eigenschaft NULL-Werte enthalten. Ich versuche, diese Edge-Tabelle zu verwenden, die erstellen [: BEZIEHUNG {firstproperty :, secondproperty :, thirdproperty:}] Beziehungen zwischen (: InfoNodes) von:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM 'file:///EdgesETL.csv' AS line 
MATCH (from:InfoNodes{id: toString(line.idfrom)}) 
MATCH (to:InfoNodes{id: toString(line.idto)}) 
MERGE (from)-[:RELATION {firstproperty: toString(line.firstproperty), secondproperty: toString(line.secondproperty), thirdproperty: toString(line.thirdproperty)}]->(to) 

Diese zweite Cypher Skript führt zu einem Fehler, wenn secondproperty und dritte Eigenschaft in der Edge-Tabelle enthalten NULL-Werte. Die Neo4j-Fehlermeldung lautet: Die Beziehung kann nicht mithilfe des Nulleigenschaftswerts für die zweite Eigenschaft zusammengeführt werden. Wenn ich aus dem zweiten Skript die secondproperty -Feld und secondproperty entfernen: Eigenschaft als die gleiche Art von Fehler auftritt thirtonproperty: Kann keine Beziehung mit Null-Eigenschaft Wert für thirdproperty Wenn ich secondproperty und thirdproperty Felder und Eigenschaften aus dem vorherigen Skript dann die [: RELATIONS] Beziehungen zwischen InfoNodes werden erstellt, einschließlich Felder der firstproperty-Tabelle, die als firstproperty gespeichert werden: Eigenschaft der Beziehung [: RELATION].

Frage: Wie kann das zweite Skript erweitert werden, um aus der Edge-Tabelle die zweite Eigenschaft und dritte Eigenschaft Felder in secondproperty zu laden: und thirdproperty: of [: RELATION] Beziehungen einschließlich NULL Werte?

Can't MERGE with null values; 'Cannot merge node using null property value' in neo4j beschreibt das gleiche Problem, aber beantwortet meine Frage im Falle mehrerer Felder/Eigenschaften mit NULL-Werten nicht.

+0

Gibt es mehrere Beziehungen zwischen den gleichen Knoten, aber mit unterschiedlichen Werten für einige der Eigenschaften? Oder sind die (idfrom, idto) Paare alle einzigartig? –

+0

: InfoNodes können eine oder mehrere Relationen zu anderen haben: InfoNodes, aber im Falle mehrerer Beziehungen hat jede Beziehung ein eigenes Label. Daher haben mehrere Beziehungen zwischen InfoNods ihre eigene eindeutige ID von/idto in der Edge-Tabelle mit ihren eigenen Beziehungseigenschaften als Felder. – Luc

Antwort

2

Sie sollten die MERGE section im Entwicklerhandbuch erneut überprüfen. Genauer gesagt, in der Einleitung wird ON CREATE und ON MATCH erwähnt. Auf diese Weise können Sie Eigenschaften in Fällen festlegen, in denen die MERGE zu einer Erstellung geführt hat oder wenn die MERGE stattdessen auf vorhandenen Elementen abgeglichen wurde.

Normalerweise möchten Sie nur Eigenschaften zusammenführen, die die Sache eindeutig definieren, wie IDs, und den Rest der Eigenschaften in ON CREATE setzen.

Ihre Anfrage nach dieser Änderung könnte wie folgt aussehen:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM 'file:///EdgesETL.csv' AS line 
MATCH (from:InfoNodes{id: toString(line.idfrom)}) 
MATCH (to:InfoNodes{id: toString(line.idto)}) 
MERGE (from)-[r:RELATION {firstproperty: toString(line.firstproperty)}]->(to) 
ON CREATE SET r.secondproperty = toString(line.secondproperty), r.thirdproperty = toString(line.thirdproperty) 
+0

Danke InverseFalcon. Ich gebe zu, ich bin ein Neuling in Bezug auf Cypher und seine Geheimnisse. Ich habe die ON CREATE- und ON MERGE-Klauseln versucht, aber ich habe verstanden und gelingen.Mit Ihrer Antwort verstehe ich die Funktionsweise dieser Klauseln. – Luc

Verwandte Themen