2016-04-07 10 views
2

Ich bin derzeit mit einem Problem zu kämpfen und ich habe keine Problemumgehung im Moment gefunden. (Ich verwende Neo4j C# -Bibliothek)Neo4J - Kopieren Sie alle Beziehungen von einem zum anderen Knoten (C# Wrapper)

Ich brauche zwei Knoten miteinander verschmelzen zu einem dritten und kopieren Sie alle Beziehungen (Typ & Eigenschaften) aus diesen beiden Knoten zu meinem neu dritten Knoten erstellt:

(a:Label)-[r]-() 
(b:Label)-[r2]-() 
(c:Label) 

Ich konnte meine beiden ersten Knoten & ordnungsgemäß in einen dritten Knoten, der in der Datenbank erstellt wurde, abrufen, aber ich habe Schwierigkeiten, alle Beziehungen von den beiden ersten Knoten auf den dritten zu kopieren.

Ich habe ohne Erfolg mehrere Dinge ausprobiert, wie zum Beispiel:

 using (GraphClient graphClient = GetGraphClient()) 
     { 
      var inputString = string.Format("({0}:{1})-[r]->(n), ({2}:{3})", "a", typeof(Label).Name, "b", typeof(Label).Name); 
      var query = graphClient.Cypher 
        .SendQueryOnMaster() 
        .Match(inputString) 
        .Where((Label a) => a.Id == from.Id) 
        .AndWhere((Label b) => b.Id == to.Id) 
        .Create("(b)-[r2:type(r)]->(n)"); 
      query.ExecuteWithoutResults(); 
     } 

Kopieren Sie alle Beziehungen von einem Knoten zum anderen könnte ein Use-Case-Leute :)

Gibt es angetroffen haben könnte sein, jede Möglichkeit, damit es funktioniert?

Dank

Antwort

1

Update, ich habe einen Weg gefunden, alle Beziehungen von einem Knoten zum anderen mit C# -Wrapper zu kopieren.

internal static void DuplicateRelationships<T>(T from, T to) where T : IDataObject 
    { 
     string aVariable = "a"; 
     string bVariable = "b"; 
     string nVariable = "n"; 
     string relationVariable = "r"; 
     string newRelation = "r2"; 
     string relationsVariable = "rels"; 
     string relationPostCollectVariable = "rel"; 

     Guid fromId = from.Id; 
     Guid toId = to.Id; 

     foreach (string relation in CypherVerbs.GetAllVerbs()) 
     { 
      using (GraphClient graphClient = GetGraphClient()) 
      { 
       /*-[r]->*/ 
       graphClient.Cypher 
        .SendQueryOnMaster() 
        .Match(string.Format("({0}:{1})-[{2}:{3}]->({4}), ({5}:{6})", aVariable, from.GetType().Name, relationVariable, relation, nVariable, bVariable, to.GetType().Name)) 
        .Where((T a) => a.Id == fromId) 
        .AndWhere((T b) => b.Id == toId) 
        .With(string.Format("COLLECT({0}) AS {1}, {2}, {3}, {4}", relationVariable, relationsVariable, aVariable, bVariable, nVariable)) 
        .ForEach(string.Format("({0} in {1} | ", relationPostCollectVariable, relationsVariable)) 
        .Create(string.Format("({0})-[{1}:{2}]->({3})", bVariable, newRelation, relation, nVariable)) 
        .Set(string.Format("{0} += {1})", newRelation, relationPostCollectVariable)) 
        .ExecuteWithoutResults(); 

       /*<-[r]-*/ 
       graphClient.Cypher 
        .SendQueryOnMaster() 
        .Match(string.Format("({0}:{1})<-[{2}:{3}]-({4}), ({5}:{6})", aVariable, from.GetType().Name, relationVariable, relation, nVariable, bVariable, to.GetType().Name)) 
        .Where((T a) => a.Id == fromId) 
        .AndWhere((T b) => b.Id == toId) 
        .With(string.Format("COLLECT({0}) AS {1}, {2}, {3}, {4}", relationVariable, relationsVariable, aVariable, bVariable, nVariable)) 
        .ForEach(string.Format("({0} IN {1} | ", relationPostCollectVariable, relationsVariable)) 
        .Create(string.Format("({0})<-[{1}:{2}]-({3})", bVariable, newRelation, relation, nVariable)) 
        .Set(string.Format("{0} += {1})", newRelation, relationPostCollectVariable)) 
        .ExecuteWithoutResults(); 
      } 
     } 
    } 

ist die Chiffre-Code:

MATCH (a:Test {props1:"1"}), (b:Test {props3:"3"}) 
WITH a,b 
MATCH (a)-[r:LINKED_TO]->(c) 
WITH COLLECT(r) AS rels, a, b, c 
FOREACH (rel in rels | 
     CREATE (b)-[r:LINKED_TO]->(c) 
     SET r+=rel 
) 

EDIT: Da Neo4j 3.0 Sie gespeicherte Prozedur verwenden, kann dies effizienter auszuführen, entwickelte Michael Hunger mehrere Vorlage gespeicherte Prozedur einschließlich der Kopie aller Beziehungen von einem Knoten zu einer anderen Prozedur.

Hier ist der Link zum Repository gespeicherte Prozedur: https://github.com/neo4j-contrib/neo4j-apoc-procedures

Hier ist der Link zu der Dokumentation Graph Refactoring: https://neo4j-contrib.github.io/neo4j-apoc-procedures/#_graph_refactoring

0

Leider ist dieses in Neo4j nicht möglich ist, kann ich mir vorstellen, die anderen Beiträge auf Stackoverflow für diese gefunden habe:

Es wäre möglich, wenn Sie das Label der Beziehung zum Zeitpunkt der Kompilierung kennen, aber es wird nicht für mehrere/dynamische Label-Typen funktionieren. Es tut mir leid, dass es keine bessere Antwort darauf gibt.

+0

Danke für die Antwort Chris, ich hatte gehofft, dass eine Antwort seitdem gefunden wurde weil die Beiträge ziemlich alt aber ok waren;) – Ashallar

Verwandte Themen