批量插入节点和关系 neo4jclient
Batch insert nodes and relations neo4jclient
我在一个列表中有很多节点和边。目前我正在遍历列表并使用非常慢的查询插入每个节点。如何使用 neo4jclient 执行批量插入?
节点对象:
public class myNode
{
public int id { get; set; }
public int floor { get; set; }
public double x { get; set; }
public double y { get; set; }
}
当前插入节点的方法:
public static void addNode(GraphClient client, myNode node, string nodeName)
{
client.Cypher
.Create("(" + nodeName + ":Node {node})")
.WithParams(new { node })
.ExecuteWithoutResults();
}
当前插入节点列表的方法:
List<myNode> nodeList;
foreach(var elem in nodeList)
addNode(client, elem, "foo");
您可以传入集合,而不是仅仅将单个节点传递到您的 Cypher。根据 Neo4j 手册
By providing Cypher an array of maps, it will create a node for each map
请参阅 Neo4j Manual v2.2.2 中的 使用属性参数创建多个节点 部分。
因此,您的 C# 代码将变得更简单,性能应该会更好。
public static void AddNodes(GraphClient client, List<MyNode> nodes)
{
client.Cypher
.Create("(n:Node {nodes})")
.WithParams(new { nodes })
.ExecuteWithoutResults();
}
希望对您有所帮助。
为了完整起见,以下是一个示例,可以使用 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();
}
关系是 RelationshipCommon 类型的列表集合。 RelationshipCommon 具有以下结构
public class RelationshipCommon
{
public string SourceEntityId { get; set; }
public string TargetEntityId { get; set; }
public string RelationshipId { get; set; }
public long ProportionalValue { get; set; }
}
在我的开发 VM 上,此代码在 6 秒内加载了 54000 个关系。
我在一个列表中有很多节点和边。目前我正在遍历列表并使用非常慢的查询插入每个节点。如何使用 neo4jclient 执行批量插入?
节点对象:
public class myNode
{
public int id { get; set; }
public int floor { get; set; }
public double x { get; set; }
public double y { get; set; }
}
当前插入节点的方法:
public static void addNode(GraphClient client, myNode node, string nodeName)
{
client.Cypher
.Create("(" + nodeName + ":Node {node})")
.WithParams(new { node })
.ExecuteWithoutResults();
}
当前插入节点列表的方法:
List<myNode> nodeList;
foreach(var elem in nodeList)
addNode(client, elem, "foo");
您可以传入集合,而不是仅仅将单个节点传递到您的 Cypher。根据 Neo4j 手册
By providing Cypher an array of maps, it will create a node for each map
请参阅 Neo4j Manual v2.2.2 中的 使用属性参数创建多个节点 部分。
因此,您的 C# 代码将变得更简单,性能应该会更好。
public static void AddNodes(GraphClient client, List<MyNode> nodes)
{
client.Cypher
.Create("(n:Node {nodes})")
.WithParams(new { nodes })
.ExecuteWithoutResults();
}
希望对您有所帮助。
为了完整起见,以下是一个示例,可以使用 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();
}
关系是 RelationshipCommon 类型的列表集合。 RelationshipCommon 具有以下结构
public class RelationshipCommon
{
public string SourceEntityId { get; set; }
public string TargetEntityId { get; set; }
public string RelationshipId { get; set; }
public long ProportionalValue { get; set; }
}
在我的开发 VM 上,此代码在 6 秒内加载了 54000 个关系。