【问题标题】:Neo4j unique IDs by tree with root node counter?具有根节点计数器的树的 Neo4j 唯一 ID?
【发布时间】:2015-06-12 16:11:50
【问题描述】:

是否在根节点上使用带有计数器的树,以便在创建新节点时被引用和递增,这是在 Neo4j 中管理唯一 ID 的一种可行方法?在本论坛上一个关于性能的问题 (Neo4j merge performance VS create/set) 中,描述了该方法,我突然想到它可能建议一种用于唯一 ID 管理的方法,而无需扩展 Neo4j 数据库(并支持该扩展)。但是,我注意到在其他关于唯一 ID 管理最佳实践的讨论中没有提到这种方法 (Best practice for unique IDs in Neo4J and other databases?)。

任何人都可以帮助验证或拒绝这种方法吗?

谢谢!

【问题讨论】:

    标签: neo4j uniqueidentifier


    【解决方案1】:

    您可以只创建一个单例节点(在我的示例中我将给它标签 IdCounter)来保存“下一个有效 ID 计数器”值。它不需要成为任何“树”的一部分,也不需要它有任何关系。

    当您创建单例时,使用您要使用的第一个 id 值对其进行初始化。例如:

    CREATE (:IdCounter {nextId: 1});
    

    这里是一个简单的例子,说明如何在创建新节点时使用它。

    MATCH (c:IdCounter)
    CREATE (x {id: c.nextId})
    SET c.nextId = c.nextId + 1
    RETURN x;
    

    由于所有 Cypher 查询都是事务性的,如果由于任何原因没有创建节点,那么 nextId 增量也不会完成,因此您永远不应在分配的 id 编号中出现任何间隙。

    但是,为避免重复使用相同的 id 编号,您必须仔细编写查询,以确保在创建新节点时始终发生增量(使用 CREATECREATE UNIQUEMERGE )。

    【讨论】:

    • 啊,是的,这更简单 - 非常感谢。但这有什么问题吗?我在上面引用的最佳实践讨论中没有提到单例计数器节点解决方案,这让我感到奇怪。可扩展性/高可用性怎么样?您预计在 Neo4j 集群架构中使用此解决方案会出现什么问题吗?
    • 我有一个包含数百个MERGE 语句的脚本,用于最初将一些数据加载到我的数据库中,它一直运行良好。但是,当我添加 MATCH...SET 子句时,脚本在浏览器中失败,并显示消息“每个查询只需要一个语句,但得到:267”。我想那是因为我需要运行 267 个事务而不是 1 个事务,其中 267 MERGEs。
    • 您需要确保不要在查询中间放置任何分号,因为分号表示语句的结束。此外,您只需为每个语句执行一次MATCH (c:IdCounter)。最后,您必须非常小心您的 MERGE 语句,以确保它们按预期工作。
    • 另外,我不认为这是一个非常可扩展的解决方案。稍后我可能会添加更多信息。
    • 感谢您的反馈。没有分号,它被视为一种陈述,但无效。正如你所建议的,我首先创建了计数器节点:
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多