Neo4jClient - 在ForEach中合并1000非常慢(Unique Constraint)

时间:2014-02-20 12:45:42

标签: neo4j neo4jclient

这源于这个问题:Map params with Merge or build a Batch operation via the client?

此查询:

FOREACH (n in {set} | MERGE (c:Label {Id : n.Id}) SET c = n) 

适用于能够根据唯一键(在本例中为Id)更新或创建新节点。然而,它非常缓慢。当我尝试处理42000个项目的列表时,批量为1000,大约需要2分钟才能完成。在硬件方面,这是在我的笔记本电脑上运行的(i7,8GB RAM,三星840 Pro SSD)。顺便说一句,这是在一个干净的数据库上运行,所以最初,没有匹配,只是创建。 (虽然我希望它支持更新数据,因此使用Merge。

C#代码:

        createUniqueConstraint(label, PK_Field); //Creating a constraint automatically creates an index
        string propKey = label + "s" ;
        string strForEach = string.Format("(n in {655 seconds to process 42k items} |  MERGE (c:{1} {{{2} : n.{2}}}) SET c = n)",
            propKey, label, PK_Field);
        foreach (var entities in list.Batch(1000))
        {
            var query = client
                            .Cypher
                            .ForEach(strForEach)
                            .WithParam(propKey, entities.ToList());

            query.ExecuteWithoutResults();
            Debug.WriteLine("Batch passed for " + label + " ("+entities.Count()+" items)");
        }

更新

如果我只是使用Merge和foreach(具有唯一约束)手动插入每个节点类型列表,则CPU占32%,每个40-50k项列表需要很长时间。 获取50k项目的数据大约需要2秒钟。

(我在没有执行插入查询的情况下通过拉取数据来运行此操作,我可以看到数据拉取最多2秒)

这是运行时的QueryText(它仍在执行第一批42k)

[Neo4jClient.Cypher.CypherFluentQuery] = 
"FOREACH (n in System.Collections.Generic.List`1[Common.Models.Contact] |
 MERGE (c:Contact {ContactId : n.ContactId}) SET c = n)"

截图: {{0}}

0 个答案:

没有答案