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();
}
}
这个例子的问题是,当服务器重新启动时,计数器将被设置为零。
所以有必要保留计数器的最后一个值。这可以使用这些示例来完成:
如果您的主要兴趣在于找到一种生成唯一 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]
在 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();
}
}
这个例子的问题是,当服务器重新启动时,计数器将被设置为零。
所以有必要保留计数器的最后一个值。这可以使用这些示例来完成:
如果您的主要兴趣在于找到一种生成唯一 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]