【问题标题】:AgensGraph-Btree VS Neo4j-IndexFreeAgensGraph-Btree VS Neo4j-IndexFree
【发布时间】:2017-06-17 15:38:12
【问题描述】:

为了高效处理数据,Neo4j 表示他们以“无索引邻接”的方式搜索图数据。但是,我知道AgensGraph使用PostgreSQL的“Btree”方式进行查询

与“无索引邻接”相比,使用 PostgreSQL 的“Btree”有什么好处?

【问题讨论】:

    标签: postgresql neo4j b-tree agens-graph


    【解决方案1】:

    免责声明:我领导 AgnsGraph 的开发

    Neo4j 使用固定大小的数组来存储有关节点和关系的信息。该结构提供的好处之一是它可以通过计算 ID 的乘积和元素的固定大小来找到文件中具有其内部 ID 的节点或关系的位置。所以 Neo4j 不需要 Btree 结构(在 RDBMS 中很流行),他们坚持 Neo4j 为图形数据提供“无索引邻接”。

    相反,AgensGraph 用于查找顶点(节点)或边(关系)。所以大家可能会觉得 AgensGraph 的方法没有 Neo4j 快,因为与 Neo4j 的 O(1) 相比,渐近复杂度是 O(log n)。

    理论上,这是真的。但实际上,有几点需要考虑。首先,在 RDBMS 中,日志的基础非常大。所以 Btree 的高度 (log n) 非常小(大多数情况

    而且更重要的是,实际上在处理图遍历时考虑到真正的磁盘 I/O 并不是那么简单。

    当查询找到与某个顶点(其 ID 为 v1)相邻的边时,在 AgnsGraph 中搜索 Btree,它可以通过 Btree 的一次循环检索所有相邻边的 ID,并依次读取 Btree 的叶子条目.边缘聚集在 Btree 的叶子条目中,因此可以快速检索相邻边缘。虽然有多个相邻边,但 AgnsGraph 需要查找 Btree。但在 Neo4j 中,关系可以存储在固定大小数组的不同页面中。相邻关系使用双向链表链接。因此,如果它们分散在文件中,则需要更多随机 I/O。

    实际上,我们发现 AgensGraph 比 Neo4j 更快,并且即使在多客户端会话中更新效率也更高,因为 Btree 也针对这些并发访问进行了优化。

    【讨论】:

    • 值得注意的是,BTree是一个树结构,因此也是一个图,所以AgensGraph使用图算法来寻找相邻边。
    【解决方案2】:

    据我了解,“无索引邻接”意味着 Neo4j 可以在恒定时间 O(1) 内获取节点的相邻元素。

    我不知道 AgnsGraph 具体是如何工作的,但是在 BTree 中获取元素是 O(log n)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 2011-04-02
      • 1970-01-01
      • 2014-12-29
      • 1970-01-01
      • 2011-07-02
      • 2017-04-24
      相关资源
      最近更新 更多