作为一种简单、通用的数据结构,图可以表示数据对象之间的复杂关系。生物信息学、计算机网络和社交媒体等领域中产生的大量数据,往往是相互连接、关系复杂且低结构化的,这类数据对传统数据库而言十分棘手,一个简单的操作都经常涉及多张表的连接,导致性能低下。对于这类数据,将其表示为图结构并存储在专用的图数据库中是最佳的处理方案。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目前支持的图查询操作的范围有限。

高性能内存图数据库RedisGraph(一)的更多相关文章

  1. 高性能内存图数据库RedisGraph(三)

    这篇文章,我将介绍截止目前,RedisGraph的最新版本(v2.4)对Cypher语言的支持情况. 1.模式(patterns) RedisGraph已支持Cypher中所有的模式. 2.类型(ty ...

  2. 高性能内存图数据库RedisGraph(二)

    这篇文章主要介绍用一下RedisGraph的历史和现状. 2018年5月,Redis Labs发布了RedisGraph的预览/测试版.6个月后,在Redis Labs和开源社区的开发者们的共同努力下 ...

  3. 图数据库项目DGraph的前世今生

    本文由云+社区发表 作者:ManishRai Jain 作者:ManishRai Jain Dgraph Labs创始人 版权声明:本文由腾讯云数据库产品团队整理,页面原始内容来自于db weekly ...

  4. Neo4j图数据库从入门到精通

    目录 第一章:介绍 Neo4j是什么 Neo4j的特点 Neo4j的优点 第二章:安装 1.环境 2.下载 3.开启远程访问 4.启动 第三章:CQL 1.CQL简介 2.Neo4j CQL命令/条款 ...

  5. Nebula 架构剖析系列(一)图数据库的存储设计

    摘要 在讨论某个数据库时,存储 ( Storage ) 和计算 ( Query Engine ) 通常是讨论的热点,也是爱好者们了解某个数据库不可或缺的部分.每个数据库都有其独有的存储.计算方式,今天 ...

  6. Neo4j图数据库从入门到精通(转)

    add by zhj: 转载时,目录没整理好,还会跳转到原文 其实RDB也可以存储多对多的关系,使用的是中间表,GDB使用的是边,RDB中的实体存储在数据表,而GDB存储在节点.两者使用的底层技术不同 ...

  7. 【图数据库】史上超全面的Neo4j使用指南

    转自:https://cloud.tencent.com/developer/article/1336299 在这篇文章中: 第一章:介绍 Neo4j是什么 Neo4j的特点 Neo4j的优点 第二章 ...

  8. 主流开源分布式图数据库 Benchmark

    本文由美团 NLP 团队高辰.赵登昌撰写 首发于 Nebula Graph 官方论坛:https://discuss.nebula-graph.com.cn/t/topic/1377 1. 前言 近年 ...

  9. 陈宏智:字节跳动自研万亿级图数据库ByteGraph及其应用与挑战

    导读: 作为一种基础的数据结构,图数据的应用场景无处不在,如社交.风控.搜广推.生物信息学中的蛋白质分析等.如何高效地对海量的图数据进行存储.查询.计算及分析,是当前业界热门的方向.本文将介绍字节跳动 ...

随机推荐

  1. postman实现参数化执行及断言处理

    一.假设需要做的测试的参数如下: 注意保存为.csv文件时一定要选择格式为UTF-8 ,避免乱码. 二.输入参数和期望结果在postman中的用法: 注意一定要通过runner的方式进行运行,选择对应 ...

  2. 编译原理-NFA转化成DFA

    1.假定NFA    M=<S,∑,f,S0,F>    对M的状态转换图进行以下改造: ①引进新的初态结点X和终态结点Y,    X,Y∈S,    从X到S0中的任意结点连一条ε箭弧, ...

  3. 【NX二次开发】Block UI 多行字符串

    属性说明 常规         类型 描述     BlockID     String 控件ID     Enable     Logical 是否可操作     Group     Logical ...

  4. 使用charles抓取https的方法

    自己整理的步骤做个记录 1.下载证书,官方地址:http://www.charlesproxy.com/ssl.zip 可直接点击链接下载:http://charlesproxy.com/getssl ...

  5. PTA4题学习总结

    前言: 这是我20多年以来第一次写博客了,还是在学校里那可(牛)爱(逼)的Java老师的安(逼)慰(迫)下,含泪写下第一篇博客,大家应该都明白这种含泪写下的佳(废)作(品)是多么的动人的. 就不开玩笑 ...

  6. Linux命令基础(二)

    一.列表显示目录内容-ls 1.显示目录中内容,包括子目录和文件相关属性信息 ls(列表的形式去显示目录内容)                    [选项](可有可无的)              ...

  7. spring赌上未来的一击:WebFlux性能实测

    最近花了一点时间系统的测试验证了在SpringBoot框架下使用SpringMVC和Spring WebFlux两种框架开发接口,对比了响应时间以及压测吞吐量的区别. WebFlux&Spri ...

  8. 从 Nginx 优秀的核心架构设计,揭秘其为何能支持高并发?

    目录: 1. Nginx的整体架构 2. Nginx的模块化设计 3. Nginx的请求方式处理 4. Nginx事件驱动模型 5. Nginx进程处理模型 写在前面 Nginx 是一个 免费的,开源 ...

  9. NOIP模拟测试15「建造城市city(插板法)·轰炸·石头剪刀布」

    建造城市 题解 先思考一个简单问题 10个$toot$ 放进5间房屋,每个房屋至少有1个$toot$,方案数 思考:插板法,$10$个$toot$有$9$个缝隙,$5$间房屋转化为$4$个挡板,放在t ...

  10. gomod使用小结

    gomod使用小结 使用方法 把工程拷贝到$GOPATH/src之外 在工程目录下执行:go mod init {module name}该命令会创建一个go.mod文件 然后在该目录下执行 go b ...