据我所知,Neo4j(ID(node)
)给出的ID不稳定,其行为有点像SQL中的行号。由于ID主要用于SQL中的关系,并且这些ID很容易在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的背景下,我的方法是反模式吗?
答案 0 :(得分:6)
Neo4j内部ID比sql行id更稳定,因为它们在交易期间永远不会改变,例如。
确实不建议将它们暴露在外部使用。我知道Neo内部有一些意图来实现这样的功能。
基本上人们倾向于使用两种解决方案:
在PHP应用程序级别使用UUID生成器:https://packagist.org/packages/rhumsaa/uuid并在所有节点上添加标签/ uuid唯一约束。
使用像https://github.com/graphaware/neo4j-uuid这样非常少的Neo4j插件,可以动态添加uuid属性,因此它可以减轻您在应用程序级别处理它的负担,并且更容易管理持久性状态您的节点对象