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 内部有一些意图来实现这样的功能。
基本上人们倾向于为此使用两种解决方案:
在应用程序级别使用 UUID 生成器,例如 PHP : https://packagist.org/packages/rhumsaa/uuid 并在所有节点上添加 label/uuid 唯一约束。
使用像 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 字段的节点。
据我了解,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 内部有一些意图来实现这样的功能。
基本上人们倾向于为此使用两种解决方案:
在应用程序级别使用 UUID 生成器,例如 PHP : https://packagist.org/packages/rhumsaa/uuid 并在所有节点上添加 label/uuid 唯一约束。
使用像 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 字段的节点。