Neo4j节点/关系ID属于动态性质,从我在线阅读文档和各种文章后可以看出,它们可以重复使用。
因此,举例来说,我有一个操作O1在(x)
上运行,其ID为100.另一个操作O2可能会删除(x)
并创建(y)
(而O1例如,由于I / O操作而被阻止,并且巧合的是,(y)
也可能变为具有100的节点ID。当O1恢复执行时,并尝试修改假定为{的节点{1}}(但现在实际上是(x)
,但是O1无法告诉因为它具有相同的节点ID),我们会为该节点提供各种不良数据。
使用过一定数量的OGM(所有OGM都是用PHP编写的,虽然我怀疑OGM也适用于其他语言),我可以看到所有这些都依赖于ID,这可能经常使用如上所述,会产生危险的后果。
Neo4j OGM如何处理这些案件?或者是以上情况"很少见" (例如,两个UUID碰撞的概率相同),以免引起关注?
答案 0 :(得分:0)
我主要知道两个OGM:
我无法代表Java库,但在Ruby方面,我们使用Ruby SecureRandom.uuid在所有节点上生成uuid
属性。这就是我们唯一识别节点的方式。用户也可以选择拥有自己的" natural"密钥(如美国社会安全号码)。只要它可以有一个Neo4j UNIQUE约束,就可以使用它。
在当前稳定版本的gem(7.1)中,约束是自动创建的。在即将推出的主要版本(8.0)中,用户需要自己创建这些约束(还有一个新的迁移系统可以帮助解决这个问题),但如果对于ID属性没有约束,gem会引发错误。模特。
此外,由于Neo4j / Neo Tech鼓励从节点而非关系的角度浏览Neo4j图表,因此我们不会在关系中存储唯一的ID。