最近,我正在试验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,但他的机制似乎有些奇怪。如何退回符合查询插入顺序的项目?我曾考虑为每个节点创建一个timestamp属性,但我认为这不是最佳选择
答案 0 :(得分:0)
Neo4j的ID在内部维护,您的业务代码不应该依赖它。
通常它是自动递增的,但是如果有delete operation
,则可以根据Neo4j Server的Reuse Policy
重用已删除的ID。
答案 1 :(得分: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