高性能内存图数据库RedisGraph(一)

     作为一种简单、通用的数据结构,图可以表示数据对象之间的复杂关系。生物信息学、计算机网络和社交媒体等领域中产生的大量数据,往往是相互连接、关系复杂且低结构化的,这类数据对传统数据库而言十分棘手,一个简单的操作都经常涉及多张表的连接,导致性能低下。对于这类数据,将其表示为图结构并存储在专用的图数据库中是最佳的处理方案。RedisGraph是高性能内存数据库Redis的图模块,它由Redis实验室开发,用于向Redis添加图形数据库功能。RedisGraph创新地将图数据表示为稀疏矩阵并利用GraphBLAS将图形操作转换为对矩阵的操作,同时还保留了Redis的单线程运行和完全基于内存的特点,这些特别之处为RedisGraph带来了独特的性能优势。

      由于RedisGraph发布时间较晚,目前的资料不够完善,使用者较少,社区也不够活跃。我因毕设需要,对RedisGraph进行了积极的探索,并基于其在性能上的优势以及其对多种图算法的支持,在Linux环境下用C语言编程实现了三个实用接口的封装。此外,我还实现了增删图数据等基本操作的封装,并使用GTK+编写了完整的图形界面,对图数据及查询结果进行了可视化处理。我搜集了网上现有的几乎所有关于RedisGraph的文档、博客,最终完成了我的毕设。这期间,最痛苦的阶段就是搜集资料,因为现在RedisGraph还是太新,太冷门了,中文资料几乎是没有的,有个问题我甚至是向RedisGraph的开发者提问才搞明白。但是RedisGraph的确是个十分出色的小型内存图数据库,在很多场景下都有着独特的性能优势。如果有人有需要的话,请在下方评论或者点个赞,我会在接下来把我已有的经验记录在这里,帮助他人的同时,也避免我这几个月的努力付诸东流。

      首先,先介绍一下RedisGraph。RedisGraph是Redis实验室开发的一个Redis模块,用于将图形数据库功能添加到Redis数据库中。RedisGraph使用邻接矩阵的形式表示相互连接的数据,通过将数据表示为稀疏矩阵,并且利用GraphBLAS的功能,RedisGraph提供了一种快速且高效的存储、管理和处理图的方式。

      那么什么是GraphBLAS呢?GraphBLAS是一个用于稀疏矩阵操作的高度优化的库,其开发者致力于将基于矩阵的图算法的潜力带给尽可能广泛的受众。从数学上讲,GraphBLAS定义了一组基于矩阵的核心图形操作,这些操作可用于在广泛的编程背景中实现广泛的图形算法类。图由顶点与边的连接构成,使用邻接矩阵或关联矩阵表示十分广泛的图。邻接矩阵通常更容易分析,而关联矩阵通常更适合表示数据。幸运的是,这两种矩阵都可以通过矩阵的乘法十分方便地连接起来。矩阵数学的一个关键特征是,非常少量的矩阵运算就可以操作非常广泛的图形。这种少量运算的可组合性是GraphBLAS的基础。GraphBLAS利用矩阵和图之间的对偶性,通过提供少量高度优化的操作,使大范围的图分析成为可能。这些数学运算已经被开发成一个C标准库,并在SuiteSparse GraphBLAS库中实现。

     基于GraphBLAS这一高性能线性代数库,RedisGraph实现了增强的矩阵遍历方法,利用稀疏邻接矩阵的形式表示相关联的数据,并利用GraphBLAS.org上的标准化引擎,实用线性代数和压缩矩阵表示法来克服性能和规模方面的挑战。RedisGraph简化了对高度关联的可变数据的遍历,以应对复杂的问题并提供相关的见解。其利用高度关联的图数据中复杂的动态关系,在各种不同的用例中提供新的见解和情报,包括实时推荐引擎、个性化、欺诈识别、网络安全、社交网络、360度客户视角等等。

     研究过图数据库的朋友应该都听过Neo4j,玩过Neo4j的应该都知道Cypher。Cypher语言是由图形数据库Neo4j推出的查询语言[29],相比于TigerGraph的GSQL查询语言,Cypher对于SQL语言的用户来说不是那么友好。但是由于Neo4j在图数据库中遥遥领先的流行度,以及Cypher本身并不复杂的语法,RedisGraph的开发者决定,不再在查询语言上造轮子,而是直接选用Cypher作为RedisGraph所支持的查询语言。RedisGraph提供了一个使用图形查询语言Cypher的应用程序接口,供开发者和用户使用Cypher语言对RedisGraph中的图数据进行操作。但为了提高适配性,将用户提供的Cypher查询语句转换为对矩阵的操作,Redis Labs自行编写了专用的解释器。他们使用Lex作为标记器,使用Lemon生成C目标解析器。该解释器可将来自Cypher的查询转换为a.o.图遍历的查询执行计划,然后将a.o.图遍历转换为利用GraphBLAS实现的在稀疏矩阵上进行的线性代数运算。也就是说,只需要几步简单的矩阵运算,就可以实现很复杂的图查询操作,速度提升了不止一个数量级。目前RedisGraph仅支持Cypher语言的一个子集,随着开发的进行,支持的范围在不断扩大。你可以在Redis Labs维护的教程页面中查看最新的支持情况,后续我也会专门开一篇来从头介绍Cypher的常用语句(在RedisGraph已经支持的范围内)。

     提到了Neo4j,下面我就介绍一下图数据库市场的情况。近些年,主流数据库中OriendDB、Neo4j、ArangoDB等数据库都得到广泛使用。并且许多新型图数据库也陆续被开发与推出,例如TigerGraph、SeQuery、Graphflow、RedisGraph等。它们往往都采用了不同的解决方案,从而对不同的实际应用场景进行处理。

     Neo4j公司开发的Neo4j,是一个基于磁盘(而非内存)的、嵌入式的、具备完全事务特性的Java持久化引擎。Neo4j是目前“DB-Engines Ranking”榜上流行度排名第一的图数据库,它有开源社区免费版与商业版可供选择。Neo4j使用Java进行开发,并且支持其他编程语言以Cypher查询语言为媒介调用Neo4j进行操作。在通信协议方面,用户可以使用通用的HTTP协议或是Neo4j公司自创的二进制Bolt协议发送对Neo4j的操作请求。

    JanusGraph图数据库是一款开源分布式图数据库,它受管于非盈利组织Linux基金会。JanusGraph图数据库的开发背后还有许多公司的支持,例如Google与IBM。因此在使用图数据库与其他项目进行协作时,JanusGraph的使用十分灵活。用户可以自由选择JanusGraph的底层支持引擎,且可以分属于不同公司,如Cassandra、Apache基金会的Hbase、Oracle公司的BerkeleyDB、Google公司的云端BigTable等等。

    TigerGraph相对较新,但它凭借高伸缩性的特点与高性能的优势,迅速抢占了可观的市场份额。使用TigerGraph,用户可以根据自己对数据库速度与容量的需求对图数据库进行缩放。TigerGraph支持导入大型数据集,且导入速度远超Neo4j等主流图数据库。而且它对大型数据集的支持性也很好,使用TigerGraph的遍历查询速度可以达到单机每秒上亿条。另外,TigerGraph使用的图查询语言GSQL也使得它更受欢迎。因为相较于Neo4j所自创的Cypher查询语言,GSQL与关系型数据库通用的查询语言SQL更为类似。对于SQL用户来说,GQL的学习成本更低、使用体验更友好。

     RedisGraph图数据库是Redis Labs开发的Redis模块,用于向高性能非关系型数据库Redis添加图形数据库的功能。RedisGraph不仅保留了Redis数据库所特有的完全单线程运行与完全基于内存的特点,而且还创新地把图数据表示成稀疏矩阵并且利用GraphBLAS(一种用于对稀疏矩阵进行操作的高度优化库)将图操作转换为对内部稀疏矩阵的操作。这样的特点为RedisGraph带来了极其明显的性能优势,但与此同时,对高性能的追求也给RedisGraph带来了一些弊端。首先,由于RedisGraph完全基于内存,因此随着数据集的增大,其对设备的配置要求较高,增大内存支持所带来的成本提升也很大,因此RedisGraph不适合用于处理大规模数据集。其次,由于其采用了全新的方式存储、处理图数据,对于不同的查询操作,都需要对底层进行设计,且RedisGraph是2018年才发布初代版本,因此RedisGraph目前支持的图查询操作的范围有限。

posted @ 2021-07-16 15:17  买菜不买挂  阅读(3001)  评论(1编辑  收藏  举报