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");
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.
For completeness the following is an example that can be adapted to bulk load relationships and their properties using 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();
}
The relationships are a List collection of type RelationshipCommon. RelationshipCommon has the following structure
public class RelationshipCommon
{
public string SourceEntityId { get; set; }
public string TargetEntityId { get; set; }
public string RelationshipId { get; set; }
public long ProportionalValue { get; set; }
}
On my development VM this code loaded 54000 relationships in 6s.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With