是否可以在Neo4j或SDN4中创建/模拟类似于PostgreSQL序列数据库对象的东西?
我需要这个线程安全功能,以便能够询问下一个独特的Long值。我将使用此值作为我的实体的代理键。
已更新
我不想使用UUID
,因为我必须在我的网络应用程序网址参数中公开这些ID,如果UUID
我的网址看起来很糟糕。我想使用像StackOverflow那样的ID的Long
值,例如:
stackoverflow.com/questions/42228501/neo4j-sdn-4-emulate-sequence-objectnot-uuid
答案 0 :(得分:2)
这可以通过用户程序和功能来完成。举个例子:
package sequence;
import org.neo4j.procedure.*;
import java.util.concurrent.atomic.AtomicInteger;
public class Next {
private static AtomicInteger sequence = new AtomicInteger(0);
@UserFunction
public synchronized Number next() {
return sequence.incrementAndGet();
}
}
此示例的问题是,当重新启动服务器时,计数器将设置为零。
因此有必要保留计数器的最后一个值。这可以使用以下示例来完成:
答案 1 :(得分:1)
没有。据我所知,Neo4j中的序列或自动增量标识符没有任何类似的功能。这个问题在过去也是asked a few times。
答案 2 :(得分:1)
如果您的主要兴趣是如何生成唯一ID,并且您不关心唯一ID是否为字符串,那么您应该考虑使用APOC工具生成UUIDs。
有一个APOC函数可以生成UUID apoc.create.uuid
。 在旧版本的APOC中,这是必须使用CALL
语法调用的过程。例如,要使用新的UUID创建并返回单个Foo
节点:
CREATE (f:Foo {uuid: apoc.create.uuid()})
RETURN f;
还有一个APOC过程apoc.create.uuids(count)
,它生成指定数量的UUID。例如,要使用新的UUID创建并返回5个Foo
节点:
CALL apoc.create.uuids(5) YIELD uuid
CREATE (f:Foo {uuid: uuid})
RETURN f;
答案 3 :(得分:0)
Neo4j中最简单的方法是禁用ID重用并使用节点图ID,如音序器。
https://neo4j.com/docs/operations-manual/current/reference/configuration-settings/
Table A.83. dbms.ids.reuse.types.override
Description: Specified names of id types (comma separated) that should be reused. Currently only 'node' and 'relationship' types are supported.
Valid values: dbms.ids.reuse.types.override is a list separated by "," where items are one of NODE, RELATIONSHIP
Default value: [RELATIONSHIP, NODE]