2015-06-16 5 views
5

Ich habe viele Knoten und Kanten in einer Liste. Derzeit durchlaufe ich die Liste und füge jeden Knoten mit einer Abfrage ein, die sehr langsam ist. Wie führe ich einen Batch-Einsatz mit neo4jclient durch?Batch einfügen Knoten und Beziehungen neo4jclient

Node-Objekt:

public class myNode 
{ 
    public int id { get; set; } 
    public int floor { get; set; } 
    public double x { get; set; } 
    public double y { get; set; } 
} 

Aktuelle Verfahren zum Einfügen eines Knotens:

public static void addNode(GraphClient client, myNode node, string nodeName) 
{ 
    client.Cypher 
     .Create("(" + nodeName + ":Node {node})") 
     .WithParams(new { node }) 
     .ExecuteWithoutResults(); 
} 

Aktuelle Verfahren zur Liste der Knoten Einfügen:

List<myNode> nodeList; 
foreach(var elem in nodeList) 
    addNode(client, elem, "foo"); 
+0

ähnliche Frage mit anderer Antwort hier: https://Stackoverflow.com/q/47360571/237509 – JOG

Antwort

5

Anstatt nur einen einzelnen Knoten vorbei in deine Cypher könntest du die Sammlung hineinreichen. Nach dem Neo4j Handbuch

Durch die Bereitstellung von Cypher eine Reihe von Karten, wird es einen Knoten für jede Karte

Siehe Abschnitt Erstellen Sie mehrere Knoten mit einem Parameter für ihre Eigenschaften in den Neo4j Manual v2.2.2 erstellen .

Daher wird Ihr C# -Code vereinfacht und sollte besser funktionieren.

public static void AddNodes(GraphClient client, List<MyNode> nodes) 
{ 
    client.Cypher 
     .Create("(n:Node {nodes})") 
     .WithParams(new { nodes }) 
     .ExecuteWithoutResults(); 
} 

Hoffe, dass hilft.

+0

Ich versuchte dies aus Neugierde nur nach dem Posten der Frage und es zu meiner Überraschung, es hat funktioniert! Gut zu wissen, dass dies die Lösung ist. Es gibt jedoch ein Problem. Ich kann nicht herausfinden, wie ich einen Stapel von Beziehungen zwischen diesen Knoten hinzufügen soll. Ich habe die Abfragezeichenfolge für das Hinzufügen aller Knoten und Beziehungen auf einmal erstellt, aber es vereitelt viele Zwecke der Verwendung eines ORM. – codeln

+0

@codeln froh, dass Sie zu der gleichen Lösung gekommen sind. Wäre es in Ordnung, zu fragen, ob Sie als Antwort markieren könnten, um es anderen klar zu machen? Was Ihr anderes Problem anbetrifft - ich würde eine weitere Frage mit etwas mehr Detail beginnen. Wenn ich helfen kann, werde ich es tun. – ceej

+0

: D sicher, danke für die Hilfe. Bitte wenden Sie sich an mich, wenn Sie eine Lösung für die Beziehungen finden (die Frage fragt nach Batch-Einfügen von Knoten und Relationen) – codeln

1

Der Vollständigkeit halber ist das folgende ein Beispiel, das mithilfe von neo4jclient an Massenlastbeziehungen und deren Eigenschaften angepasst werden kann.

public void CreateRelationships(List<RelationshipCommon> relationships) 
{ 
      graphClient.Cypher 
      .Unwind(relationships, "relationship") 
      .Match("(grant:GRANT)", "(target:THEME)") 
      .Where("grant.node_id = relationship.SourceEntityId and target.node_id = relationship.TargetEntityId") 
      .Create("grant-[r:IS_IN_THEME]->target") 
      .Set("r.relationship_id = relationship.RelationshipId") 
      .Set("r.grant_proportional_value = relationship.ProportionalValue") 
      .ExecuteWithoutResults(); 
} 

Die Beziehungen sind eine List-Auflistung vom Typ RelationshipCommon. RelationshipCommon hat die folgende Struktur

public class RelationshipCommon 
{ 
    public string SourceEntityId { get; set; } 
    public string TargetEntityId { get; set; } 
    public string RelationshipId { get; set; } 
    public long ProportionalValue { get; set; } 
} 

Auf meiner Entwicklungs-VM hat dieser Code 54000 Beziehungen in 6s geladen.