2015-06-16 11 views
5

Mam wiele węzłów i krawędzi na liście. Obecnie przeglądam listę i wstawiam każdy węzeł z zapytaniem, które jest bardzo powolne. Jak wykonać wstawianie wsadowe przy użyciu neo4jclient?Wstawianie wsadów wsadowych i relacje neo4jclient

obiekt Node:

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

Obecna metoda wstawiania węzła:

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

obecna metoda wkładania listę węzłów:

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

podobne pytanie z inną odpowiedzią tutaj: https://stackoverflow.com/q/47360571/237509 – JOG

Odpowiedz

5

Zamiast tylko przejazdem pojedynczego węzła do twojego Cyphera, możesz przekazać kolekcję. Według instrukcji Neo4j

poprzez zapewnienie Cypher szereg map, stworzy węzeł dla każdej mapie

Patrz sekcja Tworzenie wielu węzłów z parametrem dla ich właściwości w Neo4j Manual v2.2.2 .

Twój kod C# zostanie uproszczony i powinien działać lepiej.

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

Nadzieję, że pomaga.

+0

Próbowałem tego z ciekawości zaraz po zamieszczeniu pytania i ku mojemu zdziwieniu, zadziałało! Dobrze wiedzieć, że to jest rozwiązanie. Istnieje jednak jedna kwestia, nie jestem w stanie wymyślić, jak dodać partię relacji między tymi węzłami po tym. Skonstruowałem ciąg zapytania, aby dodać wszystkie węzły i relacje jednocześnie, ale w pewnym sensie pokonał wiele celów użycia ORM. – codeln

+0

@codeln cieszę się, że masz to samo rozwiązanie. Czy byłoby w porządku zapytać, czy mógłbyś oznaczyć jako odpowiedź, aby inni wiedzieli? Jeśli chodzi o twój drugi problem - chciałbym rozpocząć kolejne pytanie z bardziej szczegółowymi informacjami. Jeśli mogę pomóc, to zrobię. – ceej

+0

: Na pewno, dziękuję za pomoc. Proszę, wróć do mnie, jeśli znajdziesz rozwiązanie dla relacji (pytanie nie pyta o wsadowe wstawianie węzłów I RELACJI) – codeln

1

Dla kompletności poniżej przedstawiono przykład, który można zaadaptować do relacji obciążenia zbiorczego i ich właściwości za pomocą neo4jclient.

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(); 
} 

Relacje są zbiorem listy typu RelationshipCommon. RelationshipCommon ma następującą strukturę:

Na mojej maszynie VM do programowania ten kod ładował relacje 54000 w 6s.

Powiązane problemy