Neo4j SDN 4 模拟序列对象(不是 UUID)

Neo4j SDN 4 emulate sequence object(not UUID)

在 Neo4j 或 SDN4 中是否有可能 create/emulate 类似于 PostgreSQL 序列数据库对象的东西?

我需要这个线程安全功能,以便能够请求下一个唯一的 Long 值。我将使用此值作为我的实体的代理键。

已更新

我不想使用 UUID,因为我必须在我的 Web 应用程序 url 参数中公开这些 ID,如果是 UUID 我的 url看起来很糟糕。我想像 Whosebug 那样为 ID 使用普通的 Long 值,例如:

whosebug.com/questions/42228501/neo4j-sdn-4-emulate-sequence-objectnot-uuid

没有。据我所知,Neo4j 中没有任何与序列或自动递增标识符类似的功能。这个问题也过去

APOC project might be worth checking out for this though. There seems to be a request to add it.

这可以通过用户过程和函数来完成。例如:

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();
    }
}

这个例子的问题是,当服务器重新启动时,计数器将被设置为零。

所以有必要保留计数器的最后一个值。这可以使用这些示例来完成:

https://maxdemarzi.com/2015/03/25/triggers-in-neo4j/

https://github.com/neo4j-contrib/neo4j-apoc-procedures/blob/master/src/main/java/apoc/trigger/Trigger.java

如果您的主要兴趣在于找到一种生成唯一 ID 的方法,并且您不关心唯一 ID 是否为字符串,那么您应该考虑使用 APOC 工具来生成 UUIDs.

有一个生成 UUID 的 APOC 函数,apoc.create.uuid在旧版本的 APOC 中,这是一个必须使用 CALL 语法调用的过程。 例如,要创建和 return 单个 Foo 具有新 UUID 的节点:

CREATE (f:Foo {uuid: apoc.create.uuid()})
RETURN f;

还有一个 APOC 程序,apoc.create.uuids(count),它生成指定数量的 UUID。例如,要创建 return 5 Foo 个具有新 UUID 的节点:

CALL apoc.create.uuids(5) YIELD uuid
CREATE (f:Foo {uuid: uuid})
RETURN f;

Neo4j 中最简单的方法是禁用 id 重用并像 sequencer 一样使用节点图 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]