Neo4j OGM如何可靠地处理节点/关系?

时间:2016-07-24 15:11:46

标签: neo4j language-agnostic

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碰撞的概率相同),以免引起关注?

1 个答案:

答案 0 :(得分:0)

我主要知道两个OGM:

  • neo4j-ogm for Java
  • neo4j Ruby gem(我是其中的维护者之一)

我无法代表Java库,但在Ruby方面,我们使用Ruby SecureRandom.uuid在所有节点上生成uuid属性。这就是我们唯一识别节点的方式。用户也可以选择拥有自己的" natural"密钥(如美国社会安全号码)。只要它可以有一个Neo4j UNIQUE约束,就可以使用它。

在当前稳定版本的gem(7.1)中,约束是自动创建的。在即将推出的主要版本(8.0)中,用户需要自己创建这些约束(还有一个新的迁移系统可以帮助解决这个问题),但如果对于ID属性没有约束,gem会引发错误。模特。

此外,由于Neo4j / Neo Tech鼓励从节点而非关系的角度浏览Neo4j图表,因此我们不会在关系中存储唯一的ID。