为了高效处理数据,Neo4j 表示他们以“无索引邻接”的方式搜索图数据。但是,我知道 AgensGraph 使用 PostgreSQL 的“Btree”方式进行查询
与“无索引邻接”相比,使用 PostgreSQL 的“Btree”有什么好处?
最佳答案
免责声明:我领导了 AgensGraph 的开发
Neo4j 使用固定大小的数组来存储有关节点和关系的信息。该结构提供的好处之一是,它可以通过计算 ID 和元素的固定大小的乘积,使用其内部 ID 在文件中找到节点或关系的位置。所以 Neo4j 不需要 Btree 结构(这在 RDBMS 中很流行)并且他们坚持认为 Neo4j 为图数据提供了“无索引邻接”。
相反,AgensGraph 用于查找顶点(节点)或边(关系)。所以人们可能会觉得 AgensGraph 的方法没有 Neo4j 快,因为与 Neo4j 的 O(1) 相比,渐近复杂度是 O(log n)。
从理论上讲,这是正确的。但实际上,有几点需要考虑。首先,在 RDBMS 中,日志的基数非常大。所以Btree的高度(log n)很小(大多数情况
更重要的是,实际上考虑到在处理图遍历时需要真正的磁盘 I/O 并不是那么简单。
当查询发现与顶点(其 ID 为 v1)相邻的边时,在 AgensGraph 中搜索 Btree,它可以通过 Btree 的一个循环检索所有相邻边的 ID,并顺序读取 Btree 的叶条目。边聚集在 Btree 的叶条目中,因此可以快速检索相邻边。尽管有几个相邻的边,但 AgensGraph 需要对 Btree 进行一次查找。但是在 Neo4j 中,关系可以存储在固定大小数组的不同页面中。相邻关系使用双向链表链接。因此,如果它们分散在整个文件中,则需要更多的随机 I/O。
实际上,我们发现 AgensGraph 比 Neo4j 更快,并且即使在多客户端 session 中更新也更有效,因为 Btree 也被开发为针对这些并发访问进行了优化。
关于postgresql - AgensGraph-Btree VS Neo4j-IndexFree,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41970487/