[英]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 中的执行方式与在图形数据库中的执行方式不同。
您给出的示例是查找给定人的朋友,这是一个单跳查询(在图形方面)并且在两种数据库中都很容易。
但是,如果您想执行 n 跳查询 (n > 3),在 RDBMS 中您可以使用子查询或连接,性能将取决于您的优化器。
下面是一个例子:
假设我们有包含字段id
(PRIMARY KEY) 和name
表类,包含字段id
(PRIMARY KEY)、 name
和class_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
连接上向后遍历即可。 并避免连接索引查找性能问题。
如果你想找到最短路径和两点之间所有可能的路径(但你不知道查询有多少跳),那么使用RDBMS会很麻烦。 查询会很长。 LDBC有一些很好的案例,分别使用 SQL、GQL(Cypher)和 SparQL。 不幸的是,我还没有发现不同语言之间的运行时差异。
使用 RDBMS 很难像 LPA(标签传播算法)和 Page Rank 算法那样进行图计算。 但是在某些(大多数)图形 DBMS 中这样做会容易得多
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.