2012-12-23 129 views
3

我刚刚开始与neo4j评估它是否会成为推荐引擎的良好底层数据库。我想知道在读写操作期间是否有关于实体获得的锁的文档。neo4j锁定交易

E.g.如果节点N分别通过关系R1和R2与节点N1和N2相关,如果正在创建或修改关系R1,那么使用N,N1,N2或R2(可能是关系创建/修改或遍历)的任何操作遇到块?直觉上,我猜测不是,因为它只有R1被写入,并且这是唯一应该被锁定的实体。不过,我想这也取决于底层的实现,特别是因为为每一个关系都提供了双向遍历(也许N和N1会被锁定?)。如果有人能够指出我的一些官方文档,这将是非常棒的。

如果确实发生了这种锁定,我可以想到解决问题的一种方法是将每个节点解析为每个关系目的的子节点,每个节点都连接到根实体。 (说用户社交用户,用户产品用户等)

我想这将允许更小数目每个节点的关系,根节点的分辨率为重写入和读取重的孩子,并允许快速检索某些子图。我可以看到的唯一缺点是节点和关系的总数增加n次(我的db大小相对较小,n = 4,所以我没有这个问题)。任何关于这些结论是否正确的意见,如果有的话,如果它们有助于提高性能并减少锁的数量,将不胜感激。

+1

我不太确定起始和结束节点是否被锁定,但似乎不应该,请参阅http://docs.neo4j.org/chunked/snapshot/transactions-locking.html –

+1

感谢您的链接..我看到我在寻找点没有。 3在那个页面上。 – user1925093

+0

不错,很高兴能够提供帮助。随意博客关于您的设置! –

回答

0

在第一种情况下,在R1(在N和N1之间)正在创建时N和N1将被写入锁定锁定,这意味着其他对N或N1的写入将被阻止但不会读取(如果没有读取锁定在阅读之前手动发出)。

在R1以某种方式更改(属性设置)的情况下,只有R1被锁定。

如果您观察到存在争用问题,那么通过将实体分解为若干特定用途的子节点,您的解决方案非常合适。在我见过的大多数情况下,它都是关系类型的分裂......可能会通过计划的特性来解决这个问题,以更好地处理密集连接的节点。这个功能可能会产生非常相似的效果。