【问题标题】:Auto increment property in Neo4jNeo4j 中的自动增量属性
【发布时间】:2015-04-03 14:24:33
【问题描述】:

据我了解,Neo4j (ID(node)) 给出的 ID 是不稳定的,其行为有点像 SQL 中的行号。由于 ID 主要用于 SQL 中的关系,并且这些在 Neo4j 中很容易建模,因此 ID 似乎没有太多用处,但是您如何解决特定节点的检索?拥有一个应该为每个节点提供唯一路由的 REST API(例如/api/concept/23)对于 Web 应用程序来说似乎是一个非常标准的案例。 但是尽管它是如此基本,但我发现的唯一可行的方法是通过

  • 语言特定框架
  • 作为保持增量的未连接节点:
// get unique id
MERGE (id:UniqueId{name:'Person'})
ON CREATE SET id.count = 1
ON MATCH SET id.count = id.count + 1
WITH id.count AS uid
// create Person node
CREATE (p:Person{id:uid,firstName:'Gabriel',lastName:'Smith'})
RETURN p AS person

来源:http://www.neo4j.org/graphgist?8012859

真的没有更简单的方法吗?如果没有,有什么特别的原因吗?在 Neo4j 的背景下,我的方法是一种反模式吗?

【问题讨论】:

    标签: neo4j language-agnostic


    【解决方案1】:

    Neo4j 内部 id 比 sql 行 id 更稳定,因为它们在事务期间永远不会改变,例如

    确实不建议将它们暴露给外部使用。我知道 Neo 内部有一些意图来实现这样的功能。

    基本上人们倾向于使用两种解决方案:

    1. 在应用程序级别使用 UUID 生成器,例如 PHP:https://packagist.org/packages/rhumsaa/uuid,并在所有节点上添加标签/uuid 唯一约束。

    2. 1234563对象

    【讨论】:

    • 这没有回答问题。自动递增 id 可用于按创建顺序对对象进行排序,而 uuid 无法做到这一点
    • 我相信向随机唯一字符串添加 unix 时间戳或某种日期时间前缀可以解决排序问题。
    • @PavelNiedoba 为什么不通过添加时间戳为添加时间的属性进行排序并使用 uuid 选项?
    • Java 中的时间戳具有毫秒分辨率,取决于时间设置,并且此解决方案增加了严重的数据过度杀伤力,此时可以使用单个 INT 和 Neodb.getCounter("my-numbering").next()
    • UUID 版本 1,基于时间戳,也具有可排序的优点。
    【解决方案2】:

    我同意 Pavel Niedoba 的观点。

    我想出了这个没有唯一 ID 节点的方法:

    MATCH (a:Person)
    WITH a ORDER BY a.id DESC LIMIT 1
    CREATE (n:Person {id: a.id+1})
    RETURN n
    

    不过,它需要一个带有 id 字段的第一个节点。

    【讨论】:

    猜你喜欢
    • 2015-06-12
    • 1970-01-01
    • 2015-07-11
    • 1970-01-01
    • 2021-12-24
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多