Gre*_*ber 15 language-agnostic neo4j
据我所知,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
Run Code Online (Sandbox Code Playgroud)
资料来源: http ://www.neo4j.org/graphgist?8012859
真的没有更简单的方法,如果没有,是否有一个特殊的原因呢?在Neo4j的背景下,我的方法是反模式吗?
Neo4j内部ID比sql行id更稳定,因为它们在例如事务期间永远不会改变
确实不建议将它们暴露在外部使用.我知道Neo内部有一些意图来实现这样的功能.
基本上人们倾向于使用两种解决方案:
在应用程序级别使用UUID生成器,如PHP:https://packagist.org/packages/rhumsaa/uuid,并在所有节点上添加标签/ uuid唯一约束.
使用非常少的Neo4j插件,如https://github.com/graphaware/neo4j-uuid,可以动态添加uuid属性,因此它可以减轻您在应用程序级别处理它的负担,并且更容易管理持久性节点对象的状态