2016-03-25 5 views
1

Ich möchte ein Projekt von einer SQL-Graph-Datenbank 'Emulation' zu Neo4j migrieren, und jetzt bin ich fest. Ich habe eine Tabelle mit 100000+ Zeilen des Formulars source_id, relationship_type, target_id. Hier ist die Import-Anweisung:Verwenden von Variablen für Beziehungen beim Importieren von csv

LOAD CSV WITH HEADERS FROM 
'file:///usr/local/n4jinput/special_semrelations.csv' AS line 
WITH line 
MATCH (s:SemObject {sem_id: TOINT(line.ool_source_id)}) 
MATCH (t:SemObject {sem_id: TOINT(line.ool_target_id)}) 
CREATE (s)-[line.rlt_relation]->(t) 

Das Problem in der Anweisung erstellen ist. Was ist die korrekte Syntax zum Abrufen von [: WHATEVER_IS_IN_THE_CSV]? Da ich einige Dutzend Beziehungstypen habe, muss ich hier eine Art Variable verwenden ... Wenn das bei CYPHER nicht möglich ist, gibt es andere Möglichkeiten, dies effizient zu tun?

+0

Danke für den Hinweis, cybersam, ist die Antwort in der Tat das gleiche im Prinzip, obwohl die Frage klingt auf den ersten Blick anders ... – cip22

Antwort

1

Beziehungstypen können in Cypher nicht dynamisch parametrisiert oder angegeben werden. Wenn Sie eine definierte Menge von Beziehungstypen haben, gibt es eine Problemumgehung. Sie können eine CASE Anweisung Beziehungstypen zu vergleichen, einen Array füllen, wenn der Beziehungstyp übereinstimmt, dann durch das Array iterieren (n) die richtige Verhältnis Art zu schaffen:

LOAD CSV WITH HEADERS FROM 'file:///myfile.csv' AS line 
MATCH (s:SemObject {sem_id: TOINT(line.ool_source_id)}) 
MATCH (t:SemObject {sem_id: TOINT(line.ool_target_id)}) 
WITH s,t, 
    CASE WHEN line.rlt_relation = "MEMBER_OF" THEN [1] ELSE [] END AS member_of, 
    CASE WHEN line.rlt_relation = "BELONGS_TO" THEN [1] ELSE [] END AS belongs_to 
FOREACH (x IN member_of | CREATE (s)-[:MEMBER_OF]->(t)) 
FOREACH (x IN belongs_to | CREATE (s)-[:BELONGS_TO]->(t)) 
+0

Danke für die Antwort und die Abhilfe. Ich werde es versuchen. BTW, ist es aus technischen Gründen, dass Beziehungstypen nicht dynamisch in Cypher angegeben werden können, oder ist es eine bestimmte Art von Workflow oder Modellierungsgewohnheiten zu erzwingen? – cip22

+0

Ich glaube, der Grund hat mit dem Prozess der Erstellung des Abfrageplans zu tun. Jede Cypher-Abfrage wird in einen Ausführungsplan kompiliert, der dann zwischengespeichert wird, damit der Plan beim nächsten Aufruf der Abfrage wiederverwendet werden kann. Wenn der Beziehungstyp oder die Knotenbeschriftung jedoch parametrisiert ist, kann der Abfrageplan nicht zwischengespeichert werden (weil sich der Ausführungsplan mit den Beziehungstypen/Knotenbeschriftungen ändern kann). –

+0

Funktioniert wie ein Charme, danke! – cip22