2015-01-16 13 views
6

Gibt es eine Möglichkeit, eine Beziehung von einem Knoten zu einem anderen zu kopieren oder zu verschieben?Verschieben/kopieren Sie alle Beziehungen zu verschiedenen Knoten

Ich habe eine Situation ähnlich der hier:

neo4j merge 2 or multiple duplicate nodes

und hier:

Copy relationships of different type using Cypher

Sagen, ich habe dieses Muster in der Grafik

(a)-[r:FOO]->(b) 
(a)<-[r2:BAR]-(c) 

I dann habe einen anderen Knoten, (d), die ein Duplikat von (a) sein kann oder auch nicht. Ich denke, es spielt keine Rolle, ob die Knoten aus Sicht der Funktionalität doppelt vorhanden sind oder nicht. Ich möchte in der Lage sein, um die Beziehungen r:FOO zu verschieben oder kopieren und r2:BAR so dass die Graph nun

(d)-[r:FOO]->(b) 
(d)<-[r2:BAR]-(c) 

enthält Wenn ich dann dies zu tun Knoten zu fusionieren, wenn ich Duplikate habe ich möchte in der Lage sein, die Beziehungen zu bewegen im Gegensatz zu kopieren und dann (vielleicht optional) löschen (a). Beachten Sie, dass es mehr als einen Beziehungstyp gibt, und ich weiß nicht genau, was die Typen sein werden. Ich weiß, dass ich das in Etappen machen kann, dachte aber, es wäre toll, wenn es eine effiziente Möglichkeit gäbe, dies in einer einzigen Abfrage zu tun. Meine aktuelle Strategie ist so etwas wie (nicht Syntax exakt, sondern nur eine Idee zu geben)

// get all outgoing relationships 
MATCH (a:Label1 { title : 'blah' })-[r]->(o) 
RETURN r 
// returns FOO and BAR 

// for each relationship type, create one from (d) and copy the properties over 
MATCH (a:Label1 { title : 'blah' })-[r:FOO]->(o), (d:Label1 { title : 'blah blah' }) 
CREATE (d)-[r2:FOO]->(o) 
SET r2 = r 
...etc... 

// now do the same for incoming relationships 
MATCH (a:Label1 { title : 'blah' })<-[r]-(o) 
RETURN r 
// returns FOO and BAR 
// for each relationship type, create one from (d) and copy the properties over 
MATCH (a:Label1 { title : 'blah' })<-[r:FOO]-(o), (d:Label1 { title : 'blah blah' }) 
CREATE (d)<-[r2:FOO]-(o) 
SET r2 = r 
...etc... 

// finally delete node and relationships (if required) 
MATCH (a:Label1 { title : 'blah' })-[r]-(o) 
DELETE r, a 

aber dies beruht auf einer Reihe von Anfragen und damit Transaktionen. Es wäre viel besser (in meiner Einfaltssicht), dies in einer Abfrage zu erreichen. Ich glaube jedoch nicht, dass so etwas in der Chiffre existiert. Liege ich falsch?

Irgendwelche Ideen? Lassen Sie es mich wissen, wenn das nicht klar ist, und ich werde versuchen, es weiter auszuarbeiten und zu erklären.

Für Informationen verwende ich Neo4j 2.1.6 Community Edition (mit neo4jclient von einer .NET-Anwendung).

Gerade erkannt, dass ich auch meinen Prozess wiederholen müsste, um die Richtung der Beziehung zu erklären, es sei denn, ich täusche mich? hole alle ausgehenden Beziehungen von (a), erstelle sie als ausgehend von (d) neu, und mache dann dasselbe für alle eingehenden Beziehungen. Cypher oben wurde entsprechend bearbeitet.

UPDATE: Ich vermute, das ist ein Wunschtraum und überhaupt nicht möglich. Kann das jemand bestätigen? Es wäre gut, eine endgültige Antwort zu haben, selbst wenn es "Nein!" Ist. Wenn ja, würde ich darüber nachdenken, die Neo4j-Jungs zu fragen, ob diese Funktionalität überhaupt machbar und überlegenswert ist.

UPDATE 2: Aus dem Mangel an Ideen, ich denke, das kann nicht getan werden. Ich bin sicher nicht weiter in meinen Forschungen oder Experimenten. Sieht aus wie eine Feature-Anfrage ist der Weg zu gehen. Ich kann nicht die einzige Person sein, die diese Funktionalität besonders nützlich finden würde.

+0

Diese Funktion wäre nett. Ich denke, ich habe das vielleicht unter http://stackoverflow.com/questions/32628783/cypher-query-to-take-all-relationships-from-one-node-and-attach-them-to-another –

Antwort

1

Ich denke, man kann die Kette gerade diese zusammen:

// get all relationships 
MATCH 
    (a:Label1 { title : 'blah' })-[r]-(o), 
    (d:Label1 { title : 'blah blah' }) 
CREATE (d)-[r2:type(r)]-(o) 
DELETE r, a 

Das einzige, was ich nicht ganz sicher bin, ist die Fähigkeit, die type() Funktion zu verwenden, wo es dort verwendet wird wird.Ich werde es jetzt ausprobieren

+0

dupliziert Vielen Dank. Interessiert sein zu sehen. Ich habe mich mit 'type (r)' ausgelassen, aber gescheitert - könnte so gewesen sein, wie ich es benutzt habe. Ich mag die Idee der Verkettung, wenn es funktionieren könnte. – ceej

+0

Ja, ich hatte das gleiche Problem. Ich denke nicht, dass dies möglich ist. Es könnte eine Möglichkeit geben, 'SET' zu verwenden, aber ich sehe es gerade nicht. Sie könnten auch in die 'WITH'-Klausel schauen, um die Anzahl der Anweisungen zu reduzieren. –

+0

Ja, ich habe über' WITH' nachgedacht, aber wenn ich etwas nicht vermisse, kann ich nur sehen, dass es den letzten 'Aufräum'-Schritt speichert. Oder meinst du "WITH a, d" wiederholt alles in einer Aussage zu tun? – ceej

Verwandte Themen