2016-06-29 4 views
0

Ich habe 4 Etiketten (A, B, C, D). Alle haben eine einzige Eigenschaft {id}. Jetzt habe ich eine Datei mit Beziehungen, die ich laden möchte. Jede Zeile hat diese Struktur:Neo4j laden Datenrelationen mit unbekannten Etiketten

{ID_1}, {type_of_relations}, {} ID_2

Wie kann ich die Beziehungen schaffen?

Meine Nicht-Arbeits Vermutung ist:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:/data.csv" AS line 
FIELDTERMINATOR ',' 
MATCH (a:A{id:line.id_1} OR a:B{id:line.id_1} OR a:C{id:line.id_1} OR a:D{id:line.id_1}) 
MATCH (b:A{id:line.id_2} OR b:B{id:line.id_2} OR b:C{id:line.id_2} OR b:D{id:line.id_2}) 
MERGE (a)-[:line.type_of_relations]->(b) 

Antwort

0

Sie können den Beziehungstyp in Cypher nicht parametrisieren.

Allerdings können Sie dies tun, um die apoc.create.relationship Prozedur in Neo4j apoc procedures mit:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///file.csv" AS row 
MATCH (a) WHERE a.id = row.id_1 
MATCH (b) WHERE b.id = row.id_2 
CALL apoc.create.relationship(a, row.type_of_relations, {}, b) YIELD rel 
RETURN count(*) AS num 

Die Prozedur nimmt einen Parameter für den Beziehungstyp, welche Typen zur Erstellung von dynamischen Beziehung ermöglicht.

+0

Ich bekomme den folgenden Fehler "Abfrage kann nicht mit CALL abgeschlossen werden (müssen RETURN oder eine Update-Klausel sein) (Zeile 5, Spalte 1 (Offset: 167)) " CALL apoc.create.relationship (a, line.rel_type , {}, b) "" Meine Problemumgehung besteht darin, die große Datei je nach Beziehungstyp in kleinere zu teilen. –

+0

Ah, richtig. Entschuldigung - Ich habe die Abfrage mit einer RETURN-Klausel aktualisiert. Beachten Sie, dass Sie [apoc procedures library] installieren müssen (https://github.com/neo4j-contrib/neo4j-apoc-procedures#download-latest-release), um diese Prozedur zu verwenden. –

+0

Vielen Dank! Ich erhalte immer noch einen Fehler "Prozeduraufruf innerhalb einer Abfrage unterstützt nicht implizit Benennungsresultate (stattdessen wird explizit' YIELD' verwendet) " Ich habe apoc installiert. Es macht Spaß mit zu spielen. Was ich versuche zu erreichen, ist derzeit vielleicht nicht möglich. –

0

Ich glaube nicht, dass Sie das tun können. Wegen vielen Gründen.

create (f:bar {name:'NewUserA'}) 
create (f:foo {name:'NewUserA'}) 
match (f:foo {name:'NewUserA'} or f:bar {name:'NewUserA'}) return f; 

-Code Ungültige Eingabe 'O': erwartete Leerzeichen, Kommentar, ')' oder ein Beziehungsmuster (Zeile 1, Spalte 32 (Offset: 31)) „match (f: foo {Name:‘ NewUserA '} oder f: bar {Name:' NewUserA '}) gibt f "zurück.

Also gibt es auf jeden Fall ein Problem mit dem Spiel. Wenn die ID global eindeutig ist, können Sie die Beschriftung ignorieren und nur auf die ID passen. das wird sich um dein "oder" Problem kümmern.

match (f) where f.name='NewUserA' match (t) where t.name='NewUserA' return f,t 

würde Ihnen die Knoten geben.

Das heißt, wenn parametrisierte Abfragen codiert ist RELATIONSHIP_TYPE eines der Elemente, die Sie nicht parametrieren können. Aus der Dokumentation: 5.5. Parameter [..] Parameter können nicht wie für Eigenschaftsnamen, Beziehungstypen und Beschriftungen verwendet werden, da diese Muster Teil der Abfragestruktur sind, die in einen Abfrageplan kompiliert wird. [..]

Also müssen Sie vielleicht nach Möglichkeiten suchen, wie Sie MERGE als String irgendwo anders aufbauen (awk ist Ihr Freund) und dann das in der Shell ausführen.