在根节点上使用带有计数器的树,在创建新节点时要引用和递增,这是在Neo4j中管理唯一ID的可行方法吗?在之前关于该论坛性能的问题(Neo4j merge performance VS create/set)中,描述了该方法,并且我想到它可能会建议一种独特的ID管理方法,而无需扩展Neo4j数据库(并支持该扩展)。但是,我注意到在关于唯一ID管理(Best practice for unique IDs in Neo4J and other databases?)的最佳实践的其他讨论中没有提到这种方法。
任何人都可以帮助确认或拒绝此方法吗?
谢谢!
答案 0 :(得分:2)
您可以创建一个单例节点(我将在我的示例中为其指定标签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号中留下任何空白。< / p>
但是,为了避免重复使用相同的ID号,您必须仔细编写查询,以确保每当您创建新节点时都会发生增量(使用CREATE
,CREATE UNIQUE
,或MERGE
)。