代码之家  ›  专栏  ›  技术社区  ›  mastisa

NEO4J的短增量uinque id

  •  1
  • mastisa  · 技术社区  · 7 年前

    我使用django和neo4j作为数据库。我需要在我的RESTAPI中使用基于节点ID的短URL。在NEO4J中,数据库中使用的ID didn't recommended 要在应用程序中使用,还有一种方法可以使用UUID,它对于我的短URL来说太长了。所以我添加了我的uid生成器:

    def uid_generator():
        last_id = db.cypher_query("MATCH (n) RETURN count(*) AS lastId")[0][0][0]
        if last_id is None:
            last_id = 0
        last_id = str(last_id)
        hash = sha256()
        hash.update(str(time.time()).encode())
        return hash.hexdigest()[0:(max(2, len(last_id)))] + str(uuid.uuid4()).replace('-', '')[0:(max(2, len(last_id)))]
    

    我有两个问题,首先我读了 this question 堆栈溢出,但仍不确定 MATCH (n) RETURN count(*) AS lastId O(1) 没有提到这个!这个答案有参考资料吗?第二,在ID唯一性和速度方面有更好的方法吗?

    3 回复  |  直到 7 年前
        1
  •  1
  •   Tezra    7 年前

    首先,您应该对id属性设置一个唯一的约束,以确保不存在由并行create语句创建的冲突。这需要使用一个标签,但是如果您计划对这些数据做任何严重的事情,就需要这个故障保护。但是这样,您可以为不同的标签设置滚动ID。(所有索引标签都将有一个计数表。唯一约束还创建索引)

    MATCH (n:Node) WITH count(*) AS lastId
    CREATE (:Node{id:lastId})
    

    这将最小化生成和提交之间的时间,减少冲突的可能性。(请记住,对唯一违规的失败尝试重试)

    您还可以将当前索引计数存储在节点中,如下所述 here

        2
  •  0
  •   logisima    7 年前

    您的方法不好,因为它是基于数据库中节点的数量。

    另一方面,NEO4J的ID确保您在整个数据库中都有一个唯一的ID,但不会及时。默认情况下,NEO4J回收未使用的ID(删除节点时释放一个ID)。

    HERE )以下内容: dbms.ids.reuse.types.override=RELATIONSHIP

        3
  •  -1
  •   David A Stumpf    7 年前

    为什么不创建自己的标识符?您可以获取最后一个标识符的最大值(让我们称之为记录编号的rn)。

    max是密码中的几个数值函数之一。