高性能内存图数据库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目前支持的图查询操作的范围有限。
高性能内存图数据库RedisGraph(一)的更多相关文章
- 高性能内存图数据库RedisGraph(三)
这篇文章,我将介绍截止目前,RedisGraph的最新版本(v2.4)对Cypher语言的支持情况. 1.模式(patterns) RedisGraph已支持Cypher中所有的模式. 2.类型(ty ...
- 高性能内存图数据库RedisGraph(二)
这篇文章主要介绍用一下RedisGraph的历史和现状. 2018年5月,Redis Labs发布了RedisGraph的预览/测试版.6个月后,在Redis Labs和开源社区的开发者们的共同努力下 ...
- 图数据库项目DGraph的前世今生
本文由云+社区发表 作者:ManishRai Jain 作者:ManishRai Jain Dgraph Labs创始人 版权声明:本文由腾讯云数据库产品团队整理,页面原始内容来自于db weekly ...
- Neo4j图数据库从入门到精通
目录 第一章:介绍 Neo4j是什么 Neo4j的特点 Neo4j的优点 第二章:安装 1.环境 2.下载 3.开启远程访问 4.启动 第三章:CQL 1.CQL简介 2.Neo4j CQL命令/条款 ...
- Nebula 架构剖析系列(一)图数据库的存储设计
摘要 在讨论某个数据库时,存储 ( Storage ) 和计算 ( Query Engine ) 通常是讨论的热点,也是爱好者们了解某个数据库不可或缺的部分.每个数据库都有其独有的存储.计算方式,今天 ...
- Neo4j图数据库从入门到精通(转)
add by zhj: 转载时,目录没整理好,还会跳转到原文 其实RDB也可以存储多对多的关系,使用的是中间表,GDB使用的是边,RDB中的实体存储在数据表,而GDB存储在节点.两者使用的底层技术不同 ...
- 【图数据库】史上超全面的Neo4j使用指南
转自:https://cloud.tencent.com/developer/article/1336299 在这篇文章中: 第一章:介绍 Neo4j是什么 Neo4j的特点 Neo4j的优点 第二章 ...
- 主流开源分布式图数据库 Benchmark
本文由美团 NLP 团队高辰.赵登昌撰写 首发于 Nebula Graph 官方论坛:https://discuss.nebula-graph.com.cn/t/topic/1377 1. 前言 近年 ...
- 陈宏智:字节跳动自研万亿级图数据库ByteGraph及其应用与挑战
导读: 作为一种基础的数据结构,图数据的应用场景无处不在,如社交.风控.搜广推.生物信息学中的蛋白质分析等.如何高效地对海量的图数据进行存储.查询.计算及分析,是当前业界热门的方向.本文将介绍字节跳动 ...
随机推荐
- Relay外部库使用
Relay外部库使用 本文介绍如何将cuDNN或cuBLAS等外部库与Relay一起使用. Relay内部使用TVM生成目标特定的代码.例如,使用cuda后端,TVM为用户提供的网络中的所有层生成cu ...
- 结构感知图像修复:ICCV2019论文解析
结构感知图像修复:ICCV2019论文解析 StructureFlow: Image Inpainting via Structure-aware Appearance Flow 论文链接: http ...
- ARMed解决方案对DSP的战争
ARMed解决方案对DSP的战争 ARM体系结构简化了数字信号处理 ARM与数字信号处理(DSP)有什么关系? ARM似乎在处理领域处于领先地位.该处理器已将其视为其最大的细分市场之一,这主要是由于该 ...
- 【Android编程】Java利用apktool编写Metasploit恶意后门注入工具
/声明:本文作者Kali_MG1937 csdn博客id:ALDYS4 QQ:3496925334 未经许可禁止转载!/ 注意,本文为作者从CSDN搬迁至此的文章 注意!此文章虽然 未被 作者标记到 ...
- 【Azure 机器人】微软Azure Bot 编辑器系列(2) : 机器人/用户提问回答模式,机器人从API获取响应并组织答案 (The Bot Framework Composer tutorials)
欢迎来到微软机器人编辑器使用教程,从这里开始,创建一个简单的机器人. 在该系列文章中,每一篇都将通过添加更多的功能来构建机器人.当完成教程中的全部内容后,你将成功的创建一个天气机器人(Weather ...
- centos 7 增加一块硬盘的步骤
1) 增加一块硬盘 1G [到设置中添加一块硬盘即可] 2) 重启一下服务器 lsblk -f 查看硬盘 3) 给 sdb 硬盘分区 fdisk /dev/sdb n,p,enter,enter,w ...
- Reactive 理解 SpringBoot 响应式的核心-Reactor
Reactive 理解 SpringBoot 响应式的核心-Reactor bestcoding 2020-02-23 17:26:43 一.前言 关于 响应式 Reactive,前面的两篇文章谈了不 ...
- 为什么Mongodb索引用B树,而Mysql用B+树?
引言 好久没写文章了,今天回来重操旧业. 今天讲的这个主题,是<面试官:谈谈你对mysql索引的认识>,里头提到的一个坑. 也就是说,如果面试官问的是,为什么Mysql中Innodb的索引 ...
- Ruby升级的最新方法/CocoaPods安装
今天安装cocoapods时候出现了下面的提示 Error installing pods:active support requires Ruby version >= 2.2.0//这个需求 ...
- Golang写文件的坑
Golang写文件一般使用os.OpenFile返回文件指针的Write方法或者WriteString或者WriteAt方法,但是在使用这三个方法时候经常会遇到写入的内容和实际内容有出入,因为这几个函 ...