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

时间:2017-02-14 14:18:34

标签: neo4j cypher spring-data-neo4j-4 neo4j-ogm

是否可以在Neo4j或SDN4中创建/模拟类似于PostgreSQL序列数据库对象的东西?

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

已更新

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

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

4 个答案:

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

此示例的问题是,当重新启动服务器时,计数器将设置为零。

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

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

答案 1 :(得分:1)

没有。据我所知,Neo4j中的序列或自动增量标识符没有任何类似的功能。这个问题在过去也是asked a few times

APOC项目可能值得一试。似乎有add it的请求。

答案 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]