【问题标题】:Neo4j SDN 4 emulate sequence object(not UUID)Neo4j SDN 4 模拟序列对象(不是 UUID)
【发布时间】:2017-07-02 21:09:23
【问题描述】:

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

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

更新

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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

      【讨论】:

      • 如果在初创公司之间使用,这并没有真正增加任何额外的好处。如果它只在服务器运行时使用,那么内部的 Neo4j ID 无论如何都会更好。
      • @digx1 Neo4j id 不是递增序列。
      • FWIW Neo4j id 大部分是按顺序分配的。关键是这个解决方案对于试图在重新启动时为每个标签创建一个序列的人来说不是很有用。这个解决方案要么需要一个命名空间来复制 postgres 序列所做的事情,要么实际上应该构建 APOC 过程:github.com/neo4j-contrib/neo4j-apoc-procedures/issues/225 会这样做。
      【解决方案3】:

      如果您的主要兴趣是生成唯一 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。例如,创建并返回 5 个具有新 UUID 的 Foo 节点:

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

      【讨论】:

      • 谢谢,但我不想使用 UUID,因为我必须在我的 Web 应用程序 url 参数中公开这些 ID,如果是 UUID,我的 url 看起来很糟糕。我想为 ID 使用一个普通的 Long 值。
      【解决方案4】:

      Neo4j 中最简单的方法是禁用 ids 重用并使用节点 Graph ID 类似 sequencer。

      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]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-24
        • 1970-01-01
        • 1970-01-01
        • 2015-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多