我刚开始使用neo4j来评估它是否是推荐引擎的一个很好的底层数据库。我想知道是否有任何关于在读写操作期间在实体上获得的锁的文档。
E.g。如果节点N分别通过关系R1和R2与节点N1和N2相关,如果正在创建或修改关系R1,那么使用N,N1,N2或R2(可能是关系创建/修改或遍历)的任何操作都会遇到块?直觉上,我猜不会,因为它只是被写入的R1,而且这是唯一应该被锁定的实体。但是,我想这也取决于底层实现,特别是因为为每个关系提供了双向遍历(可能N和N1会被锁定?)。如果有人能指出我的一些官方文件,那就太好了。
如果确实发生了这种锁定,我可以想到解决问题的一种方法是将每个节点解析为每个关系目的的子节点,每个节点都连接到根实体。 (例如,用户是社交用户,用户 产品用户等。)
我想这会允许每个节点的关系数量减少,根节点的分辨率会变得很重,读取重的子节点,并允许快速检索某些子图。我能看到的唯一缺点是节点和关系的总数增加了n倍(我的db大小相对较小,n = 4,所以我没有问题)。对这些结论是否正确的任何意见,如果有的话,如果它们有助于提高性能和减少锁的数量,将不胜感激。
答案 0 :(得分:0)
在您创建R1(在N和N1之间)的第一个场景中,N和N1将被写锁定锁定,这意味着对N或N1的其他写入将阻塞,但不会读取(如果没有读锁定在阅读前手动发出。)
在以某种方式更改R1(属性集)的情况下,只有R1被锁定。
如果您观察到真正的争用问题,那么通过将实体拆分为多个特定目的子节点,您的解决方案是一个相当不错的解决方案。在大多数情况下,我已经看到这种情况使用它已经是关系类型的分裂......可能通过计划的功能来解决这个问题,以便更好地处理密集连接的节点。此功能可能会产生与此类似的效果。