【问题标题】:Neo4j 2.0 Merge with unique constraints performance bug?Neo4j 2.0 合并具有独特的约束性能错误?
【发布时间】:2014-02-21 20:32:06
【问题描述】:

情况如下: 我有一个具有属性 ContactId 的节点,该属性设置为唯一且已编入索引。节点标签为 :Contact (节点:联系人{ContactId:1})

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

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

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

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

代码和截图如下:

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());

【问题讨论】:

    标签: neo4j neo4jclient


    【解决方案1】:

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

    我看到你不使用参数,但是字符串替换,我真的建议更改它并使用参数。

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

    您可能想使用MERGEON CREATE SET 子句

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

    【讨论】:

    • 谢谢迈克尔。我使用的参数是项目列表。我可以为标签和唯一键添加参数。 On Create 功能会加快速度吗?在这个例子中,整个合并点是我想总是根据新列表更新值。所以在创建和匹配时,set c = n。另一个问题是该列表是动态的,因此在您的示例中设置属性会相当麻烦……但如果您认为这有助于提高性能,我可以尝试一下。你知道任何地方的任何文档都在谈论这个吗?
    • 另外,请记住,前两个节点类型(联系人和地址)上也发生了合并,但是那些以大约 1/秒的速度插入(这仍然有点糟糕),但是当你查看Contact Address 节点插入,其中包含索引的 ContactId 和 AddressId 键,它需要更长的时间。
    • 另一个关于您的参数评论的快速问题,第二次查找标签如何更快?我的意思是,这怎么能:{labelName} -> parse Params for correct value -> lookup value in second param list 比跳过整个第一个参数解析步骤更快?我的意思是,在我看来,2 次查找不可能比一次更快,但话又说回来,我对 Neo4j 真的很陌生(显然)。如果参数查找比静态设置字符串快,太棒了,我会做出改变。我只是不知道会怎样。
    猜你喜欢
    • 2022-06-14
    • 2018-01-30
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多