繁体   English   中英

为什么图 DB 比 RDB 更快进行图遍历?

[英]Why are graph DBs faster then RDBs for graph traversals?


我读过几篇文章(像这样)指出,由于无索引邻接,在运行图遍历算法时,图 DB 本质上比 RDB 快。 但是,我无法理解其理论依据。 在我看来,如果你构造一个散列索引的邻接表,你应该达到相同的复杂度性能。

例如,使用具有 2 个表的 RDB 查找一个人的朋友(给定人 id):人和朋友

1) 定位朋友:O(m) - 其中 m 是朋友的数量。
2)对于每个朋友Id,在people中定位:O(1)
总计:O(m)

在图形数据库中,这应该是相同的,不是吗?

不,查询在 RDBMS 中的执行方式与在图形数据库中的执行方式不同。

  1. 您给出的示例是查找给定人的朋友,这是一个单跳查询(在图形方面)并且在两种数据库中都很容易。

    但是,如果您想执行 n 跳查询 (n > 3),在 RDBMS 中您可以使用子查询或连接,性能将取决于您的优化器。

    下面是一个例子:

    假设我们有包含字段id (PRIMARY KEY) 和name表类,包含字段id (PRIMARY KEY)、 nameclass_id

为了找到id为2的班级名称,以及对应的students,我们需要在两个表表class和student之间进行join

SELECT c.name as c_name, s.name as s_name 
  FROM class as c 
    LEFT JOIN student as s 
      ON c.id = s.class_id 
        WHERE c.id = 2;

解释查询:查询在表中解释

将扫描整个学生表以找到 class_id=2。

当然,我们可以在学生class_id列上创建索引。

索引表

它读取student_class索引以获取指向物理行的指针,然后读取记录,因为它是非聚集索引。

在图数据库中,数据被建模为节点和连接。

图数据库模型

要找到 id 为 2 的班级名称和相应的学生,只需获取班级节点并在select连接上向后遍历即可。 并避免连接索引查找性能问题。

  1. 如果你想找到最短路径和两点之间所有可能的路径(但你不知道查询有多少跳),那么使用RDBMS会很麻烦。 查询会很长。 LDBC有一些很好的案例,分别使用 SQL、GQL(Cypher)和 SparQL。 不幸的是,我还没有发现不同语言之间的运行时差异。

  2. 使用 RDBMS 很难像 LPA(标签传播算法)和 Page Rank 算法那样进行图计算。 但是在某些(大多数)图形 DBMS 中这样做会容易得多

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM