自动递增ID Neo4j以按插入顺序检索元素

问题描述 投票:0回答:2

最近,我正在试验Neo4j。我喜欢这个想法,但我面临的问题是我从未遇到过关系数据库。我想执行这些插入,然后完全按插入顺序返回它们。 插入元素:

create(p1:Person {name:"Marc"})
create(p2:Person {name:"John"})
create(p3:Person {name:"Paul"})
create(p4:Person {name:"Steve"})
create(p5:Person {name:"Andrew"})
create(p6:Person {name:"Alice"})
create(p7:Person {name:"Bob"})

在返回时:

match(p:Person) return p order by id(p)

我按以下顺序收到元素:

Paul
Andrew
Marc
John
Steve
Alice
Bob

我注意到这些元素不会返回到查询插入顺序(通过id函数)。

实际上我的元素的id如下: 马克:18221 约翰:18222 保罗:18208 史蒂夫:18223 安德鲁:18209 爱丽丝:18224 鲍勃:18225

Neo4j id功能如何工作?我读到它生成一个自动增量id,但它的机制似乎有点奇怪。如何返回与查询插入顺序相关的项目?我想为每个节点创建一个时间戳属性,但我不认为这是最好的选择

neo4j cypher auto-increment
2个回答
0
投票

Neo4j的ID在内部维护,您的业务代码不应该依赖于它。 通常它是自动递增的,但是如果有delete operation,你可以根据Neo4j Server的Reuse Policy重用已删除的id。


0
投票

如果您希望在Neo4j中生成序列号,那么您需要使用在您的应用程序中最有效的策略来自行管理。

在我们的中,我们在键/值对节点中维护序列号,其中Scope是给予序列号范围的应用程序名称,Value是最后使用的序列号。当我们生成给定类型的节点(例如Product)时,我们递增序列号并将其分配给新节点。

MERGE (n:Sequence {Scope: 'Product'})
SET n.Value = COALESCE(n.Value, 0) + 1
WITH n.Value AS seq
CREATE (product:Product)
SET product.UniqueId = seq

通过这种方式,您可以通过创建具有唯一范围名称的序列节点来创建所需的序列号。

有关更多示例和测试,请参阅AutoInc.Neo4j项目https://github.com/neildobson-au/AutoInc/blob/master/src/AutoInc.Neo4j/Neo4jUniqueIdGenerator.cs

© www.soinside.com 2019 - 2024. All rights reserved.