2016-05-16 12 views
0

Ich versuche, unsere aktuellen Daten auf Neo4J zu migrieren und waren ziemlich erfolgreich, so weit, bis ich dieses Problem erreichen. Ich versuche, eine Menge von Beziehungen zwischen 2 Knoten zu erstellen, wobei der Name der Beziehung eine Variable ist. In meiner MySQL-Datenbank habe ich ein Role-Objekt, das einem Paar von (Resource, Action) zugeordnet ist, also versuche ich, es in Neo4J mit Datenmodell wie (Role)-[Action]->(Resource) zu konvertieren. Dies ist, was ich habe, aber das scheint nicht wie gültige Syntax:Erstellen einer Beziehung mit Name als Variable. (RDBMS Neo4j Migration)

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///roletoresourceaction.csv" AS row 
MATCH (role:Role {roleId: row.ROLE_ID}) 
MATCH (resource:Resource {resourceId: row.RESOURCE_ID}) 
MATCH (action:Action {actionId: row.ACTION_ID}) 
MERGE (role)-[r:action.name]->(roleAsResource) 

Ich würde jede Hilfe zu diesem Thema schätzen. Vielen Dank.

+0

Das ist nicht gerade jetzt in Neo4j unterstützt :( –

+0

Sie die Beziehung mit einem statischen Namen erstellen könnten und einen „Namen“ Eigenschaft auf es wie mit den Knoten gesetzt sehr. Danke –

Antwort

0

Neo4j 3.x Unterstützung für apoc procedures (die auf dem Server installiert werden müssen, bevor sie verwendet werden kann).

Mit dem apoc Verfahren apoc.create.relationship Sie sollte der Lage sein, das Äquivalent eines MERGE von dynamischen Beziehungstypen zu tun. Die Cypher-Sprache allein unterstützt nur das Erstellen/Zusammenführen von statischen Beziehungstypen.

Hoffentlich funktioniert dies für Sie:

USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:///roletoresourceaction.csv" AS row 
MATCH 
    (role:Role {roleId: row.ROLE_ID}), 
    (resource:Resource {resourceId: row.RESOURCE_ID}), 
    (action:Action {actionId: row.ACTION_ID}) 
OPTIONAL MATCH (role)-[rel]->(resource) 
WITH role, resource, action, COLLECT(TYPE(rel)) AS relTypes 
WHERE NOT action.name IN relTypes 
CALL apoc.create.relationship(role, action.name, NULL, resource) YIELD newRel 
RETURN role, resource, newRel; 

Die OPTIONAL MATCH und WHERE Klauseln überprüfen, ob die Beziehung bereits vor nicht existiert apoc.create.relationship erlaubt es zu schaffen.

ASIDE: Ich hatte gehofft, auch anstelle der OPTIONAL MATCH Klausel die apoc.path.expand Verfahren zu verwenden (mit einigen zusätzlichen Änderungen), aber das Verfahren scheint zur Zeit die Abfrage abzubrechen, wenn es eine Übereinstimmung finden versagt - auch die Prüfung der zurück Pfad für NULL hilft nicht.

+0

. helfen diese auf jeden Fall, aber es gibt ein paar Problem, das ich in die lief toll wäre, wenn Sie 1) verlassen erklären helfen kann mit diesem Fehler fehlschlagen „Regelmäßige COMMIT“ „Der angeforderte Vorgang kann nicht ausgeführt werden, , weil es in einer Transaktion ausgeführt werden muss Stellen Sie sicher, dass Sie Ihre Operation in die entsprechende Transaktion boi einschließen Versuchen Sie es erneut. " 2) YIELD newRel wird mit "Unbekannte Prozedurausgabe:' newRel' "fehlgeschlagen, aber die Änderung zu" YIELD rel "hat das Problem behoben und ich bin mir nicht sicher warum? – chickenmagician

0

Diese Lösung für mich gearbeitet

LOAD CSV WITH HEADERS FROM "file:///roletoresourceaction.csv" AS row 
MATCH 
    (role:Role {roleId: row.ROLE_ID}), 
    (resource:Resource {resourceId: row.RESOURCE_ID}), 
    (action:Action {actionId: row.ACTION_ID}) 
OPTIONAL MATCH (role)-[rel]->(resource) 
WITH role, resource, action, COLLECT(TYPE(rel)) AS relTypes 
WHERE NOT action.name IN relTypes 
CALL apoc.create.relationship(role, action.name, NULL, resource)  YIELD rel 
RETURN role, resource, rel; 
Verwandte Themen