Neo4j 中的自动递增 属性

Auto increment property in Neo4j

据我了解,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 内部 ID 比 sql 行 ID 更稳定一些,因为它们在交易期间永远不会改变,例如

并且确实不建议将它们公开供外部使用。我知道 Neo 内部有一些意图来实现这样的功能。

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

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

  2. 使用像 https://github.com/graphaware/neo4j-uuid 这样的极少数 Neo4j 插件,它可以动态添加 uuid 属性,因此它可以减轻您在应用程序级别处理它的负担,并且更易于管理节点对象的持久化状态

我同意 Pavel Niedoba 的观点。

我想出了这个没有和 UniqueID 节点:

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

虽然它需要第一个带有 id 字段的节点。