优化创建
Optimize Create
我得到了 20 000 个苹果。
如何以比这更聪明的方式创建它们?
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; }
}
我想 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 的建议更新了实现。
Remark. 在Cypher查询中,如果你使用的是Neo4j 3.2+,你应该切换到new parameter syntax,它使用$param
样式参数, 因此查询更容易阅读:
UNWIND $apples AS newApple
CREATE (a:Apple)
SET a = newApple
我得到了 20 000 个苹果。
如何以比这更聪明的方式创建它们?
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; }
}
我想 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 的建议更新了实现。
Remark. 在Cypher查询中,如果你使用的是Neo4j 3.2+,你应该切换到new parameter syntax,它使用$param
样式参数, 因此查询更容易阅读:
UNWIND $apples AS newApple
CREATE (a:Apple)
SET a = newApple