Search code examples
c#cypherneo4jclient

Batch insert nodes and relations neo4jclient


I have many nodes and edges in a list. Currently I'm looping through the list and inserting each node with a query which is very slow. How do I perform a batch insert using neo4jclient?

Node object:

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

Current method for inserting a node:

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

Current method for inserting List of nodes:

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

Solution

  • Instead of just passing a single node into your Cypher, you could pass in the collection. According to the Neo4j manual

    By providing Cypher an array of maps, it will create a node for each map

    See the section Create multiple nodes with a parameter for their properties in the Neo4j Manual v2.2.2.

    Therefore your C# code will become simplified and should perform better.

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

    Hope that helps.