Neo4j 2.0合并唯一约束性能缺陷?

Neo4j 2.0合并唯一约束性能缺陷?,neo4j,neo4jclient,Neo4j,Neo4jclient,情况如下: 我有一个节点,它有一个属性ContactId,该属性被设置为唯一并索引。节点标签为:Contact (节点:联系人{ContactId:1}) 我有另一个类似于地址模式的节点: (节点2:地址{AddressId:1}) 我现在尝试添加一个新节点,该节点(除其他属性外,还包括ContactId(用于引用)) (节点3:ContactAddress{AddressId:1,ContactId:1}) 当我为每个节点运行merge命令时,添加包含在另一个节点类型中设置为唯一的属性的节点的

情况如下: 我有一个节点,它有一个属性ContactId,该属性被设置为唯一并索引。节点标签为:Contact (节点:联系人{ContactId:1})

我有另一个类似于地址模式的节点: (节点2:地址{AddressId:1})

我现在尝试添加一个新节点,该节点(除其他属性外,还包括ContactId(用于引用)) (节点3:ContactAddress{AddressId:1,ContactId:1})

当我为每个节点运行merge命令时,添加包含在另一个节点类型中设置为唯一的属性的节点的时间似乎会使过程慢得多

ContactAddress节点仅包含Contact和Address节点之间的关系属性。联系人和地址节点每个最多包含10个属性。Neo4j检查属性键->值->然后检查节点标签,这是一个bug吗

代码和屏幕截图如下:

string strForEach = string.Format("(n in {{{0}}} |  
MERGE (c:{1} {{{2} : n.{2}}}) SET c = n)", propKey, label, PK_Field);

var query = client
            .Cypher
            .ForEach(strForEach)
            .WithParam(propKey, entities.ToList());

约束检查比插入更昂贵。它们还对约束进行全局锁定,以防止多次插入

我看到您不使用参数,但使用字符串替代,我真的建议您更改它并使用参数

同时,将整个节点c设置为n将再次触发约束检查

您可能想使用
MERGE

(n in {nodes} |  
MERGE (c:Label {key : n.key}}) ON CREATE SET c.foo = n.foo, c.bar = n.bar )

谢谢你,迈克尔。我使用的参数用于项目列表。我可以为标签和唯一键添加参数。不过,On Create函数会加快速度吗?在本例中,整个合并点是希望始终基于新列表更新值。因此,在创建和匹配时,
设置c=n
。另一个问题是列表是动态的,因此按照示例中的方式设置属性会非常麻烦……但是如果您认为这有助于提高性能,我可以尝试一下。您知道任何地方都有关于这方面的文档吗?另外,请记住,合并也发生在前两种节点类型(联系人和地址)上,但是这些节点插入速度大约为1/s(这仍然有点糟糕),但是当您查看
联系人地址
节点插入时,它同时包含索引ContactId和AddressId密钥,所需时间要长得多。另一个关于params注释的快速问题是,如何更快地进行第二次标签查找?我的意思是:
{labelName}->解析参数以获得正确的值->查找第二个参数列表中的值
怎么能比跳过整个第一个参数解析步骤更快呢?我的意思是,在我看来,2次查找不可能比1次快,但话说回来,我对Neo4j真的是个新手(显然)。如果params查找比静态设置字符串更快,那么我将进行更改。我只是不知道会是什么样子。