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

    适用于Linux 2的Windows子系统上的CUDA Announcing CUDA on Windows Subsystem for Linux 2 为了响应大众的需求,微软在2020年5月的构建 ...

  2. 英特尔Intel® Arria® 10 FPGA加速器设计

    英特尔Intel Arria 10 FPGA加速器设计 Introducing the Intel Vision Accelerator Design with Intel Arria 10 FPGA ...

  3. C++标准模板库(STL)——queue常见用法详解

    queue的定义 queue<typename> name; queue容器内元素的访问 由于队列本身就是一种先进先出的限制性数据结构,因此在STL中只能通过front()来访问队首元素, ...

  4. Atcoder rc122-c Calculator 斐波那契

    传送门 题解 先说结论: 任意正整数可以拆分成若干个斐波那契数 斐波那契数列: 1 1 2 3 5 8 13 21 34 例 17 = 13 + 3 + 1 看上去是对的,怎么证明呢? 首先假如每一个 ...

  5. Filebrowser 安装简介

    官网地址: https://filebrowser.org https://github.com/filebrowser/filebrowser 官网安装方法: curl -fsSL https:// ...

  6. 代码生成器:IDEA 强大的 Live Templates

    前言 Java 开发过程经常需要编写有固定格式的代码,例如说声明一个私有变量,logger或者bean等等.对于这种小范围的代码生成,我们可以利用 IDEA 提供的 Live Templates功能. ...

  7. Java新一代单元测试框架JUnit5速览

    为什么学JUnit5 Java技术栈的单元测试框架有两个:JUnit和TestNG,有种说法是TestNG比JUnit更强大,学TestNG就够了,但是当我打开GitHub看到star的时候,犹豫了: ...

  8. 乘风破浪,遇见下一代操作系统Windows 11,迄今为止最美版本,原生支持安卓应用

    遇见下一代操作系统Windows 11 全新Windows体验,让您与热爱的人和事物离得更近. Windows一直是世界创新的舞台.它是全球企业的基石,助力众多蓬勃发展的初创公司变得家喻户晓.网络在W ...

  9. python之list列表(基础篇)

    特点:1.有序的 2.可以存放多个元素 3.每个元素可以是任何数据类型,4,通过下标值访问1,定义一个空列表  2,定义一个非空列表 3.访问列表中的元素(同str类型) 4,切片与步长(同str类型 ...

  10. 5.1 万 Star!不用 root 就能连接控制安卓的开源工具

    [导语]:一款在 PC 端控制安卓设备的小工具.可在 PC 和安卓设备间互通剪贴板.用电脑键盘打字.传输文件.安装程序.截图.录屏等等功能. 简介 scrcpy 可以显示并控制通过 USB (或 TC ...