优化创建

时间:2017-11-17 23:05:36

标签: cypher neo4jclient

我有2万个苹果。

如何以比这更聪明的方式创建它们?

        foreach (var a in apples)
        {
            graphClient.Cypher
                .Create("(a:Apple {newApple})")
                .WithParam("newApple", a)
                .ExecuteWithoutResults();
        }

寻找能够在不指定每个属性的情况下传递对象的通用方法。

class Fruit
{
    [JsonProperty(PropertyName = "Color")]
    public bool Color { get; set; }
}

class Apple : Fruit
{
    [JsonProperty(PropertyName = "Variety")]
    public String Variety { get; set; }
}

1 个答案:

答案 0 :(得分:2)

我认为apples是一个词典列表。在这种情况下,普通Cypher中更优化的查询将如下所示:

UNWIND {apples} AS newApple
CREATE (a:Apple)
SET a = newApple

我还没有使用过Neo4jClient .NET库,但这些内容应该有用:

graphClient.Cypher
    .Unwind(apples, "newApple")
    .Create("(a:Apple)")
    .Set(...)
    .ExecuteWithoutResults();

20k节点可能在单个事务中工作,但实现一些批处理并使用大约的批量是值得的。 10k节点。

更新。根据Chris Skardon的建议更新了实施。

备注。在Cypher查询中,如果您使用的是Neo4j 3.2+,则应切换到使用$param样式参数的new parameter syntax,因此查询为稍微容易阅读:

UNWIND $apples AS newApple
CREATE (a:Apple)
SET a = newApple