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.
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 –