Neo4j 与 RDBMS 执行时间的比较是否正确?

数据挖掘 数据库 nosql 新4j
2021-10-07 06:48:10

背景:以下来自Graph Databases一书,其中涵盖了Neo4j in Action一书中提到的性能测试

图中的关系自然形成路径。查询或遍历图形涉及以下路径。由于数据模型从根本上面向路径的性质,大多数基于路径的图形数据库操作与数据的布局方式高度一致,因此非常高效。在他们的《Neo4j in Action》一书中,Partner 和 Vukotic 使用关系存储和 Neo4j 进行了实验。

比较表明,对于连接数据,图形数据库比关系存储要快得多。Partner 和 Vukotic 的实验试图在社交网络中找到朋友的朋友,最大深度为 5。给定随机选择的任意两个人,是否有一条连接他们的路径最多有五个关系长?对于一个包含 1,000,000 人的社交网络,每个人大约有 50 个朋友,结果强烈表明图形数据库是连接数据的最佳选择,如表 2-1 所示。

表 2-1。在关系数据库中查找扩展朋友与在 Neo4j 中高效查找

Depth   RDBMS Execution time (s)    Neo4j Execution time (s)     Records returned
2       0.016                       0.01                         ~2500    
3       30.267                      0.168                        ~110,000 
4       1543.505                    1.359                        ~600,000 
5       Unfinished                  2.132                        ~800,000

在深度 2(朋友的朋友)中,关系数据库和图形数据库的表现都足够好,我们可以考虑在在线系统中使用它们。虽然 Neo4j 查询的运行时间是关系查询的三分之二,但最终用户几乎不会注意到两者之间的毫秒差异。然而,当我们到达深度三(friend-of-friend-of-friend)时,很明显关系数据库无法再在合理的时间范围内处理查询:完成所需的 30 秒将是完全不可接受的对于在线系统。相比之下,Neo4j 的响应时间保持相对平稳:执行查询只需几分之一秒——对于在线系统来说绝对足够快。

在深度 4,关系数据库表现出严重的延迟,使其对在线系统几乎毫无用处。Neo4j 的时序也有所恶化,但这里的延迟对于响应式在线系统来说是可以接受的。最后,在深度 5 中,关系数据库完成查询所需的时间太长。相比之下,Neo4j 在大约两秒内返回结果。在深度 5 中,几乎整个网络都是我们的朋友:对于许多现实世界的用例,我们可能会调整结果和时间。

问题是:

  • 这是一个合理的测试来模仿除了在社交网络中找到的东西吗?(意思是真正的社交网络通常有大约 50 个朋友的节点;似乎“富变得更富有”的模型对于社交网络来说更自然,尽管可能是错误的。)
  • 不管仿真的自然性如何,是否有理由相信结果是错误的或不可重现的?
2个回答

查看这份名为Anatomy of Facebook 的文档,我注意到中位数为 100。查看累积函数图,我敢打赌,平均值更高,接近 200。所以 50 似乎不是这里最好的数字。但是我认为这不是这里的主要问题。

主要问题是缺乏关于如何使用数据库的信息。

专为图结构设计的数据存储比传统的 RDBM 更高效似乎是合理的。然而,即使 RDBM 不是作为数据存储选择的最新趋势,这些系统也在与数据集维度的竞争中不断发展。有各种可能的设计,各种索引数据的方式,与并发相关的改进等等。

总而言之,我认为关于可重复性,该研究缺乏对数据库模式设计方式的正确描述。我不希望数据库在这样的审讯之王中占主导地位,但是我希望通过精心调整的设计,差异不会那么大。

在 RDBMS 中建模图有好/快的方法,也有笨/慢的方法。

  • 有些人使用智能索引和存储过程,交易 CPU 负载和调整 RAM 磁盘上的临时表,以获得更快的图形检索速度。

  • 有些使用预先计算的图路径(这在社交网络场景中可能不太可行,但在大多数节点是叶节点的树中,这是一个很好的空间换时间折衷

  • 有些只是循环计算,使用未调整的索引临时表。从文章中抛出的#s,这闻起来就像他们所做的(30 秒——在相当小的数据集上的表现)

    例如,我有自己的树计算。

    • 它被封装在一个高度调优的存储过程中

    • 虽然它在企业级硬件 Sybase ASE15 数据服务器中运行,但该服务器与来自所有其他企业应用程序的数 TB 数据共享,其中一些数据比我的要多得多;并且不仅仅致力于执行我的查询。

    • 无法访问主要的加速工具,即 RAM 磁盘上的临时表。

    • 我正在检索的一组似乎与他们的数据有些匹配的代表性数据是从 250 万个节点的完整森林数据集中获得一个 150,000 个节点的子树(树的无限深度,在 5 到 15 之间变化,但给定节点的平均数量小于实验中列出的 50 个朋友)

    • 我将其调整到此查询约 30-45 秒。它肯定不会表现出问题中的数字似乎表明其 RDBMS 性能的指数放缓,鉴于结果集中没有指数增长(对我来说,这在我看来是未调整的索引在一个个人经验的临时表)。

因此,这种比较很可能是不正确的,并且基于糟糕的 RDBMS 端设计,尽管正如前面的答案所指出的,如果没有他们开源 100% 的代码和表定义,就不可能确定。