高性能内存图数据库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及其应用与挑战
导读: 作为一种基础的数据结构,图数据的应用场景无处不在,如社交.风控.搜广推.生物信息学中的蛋白质分析等.如何高效地对海量的图数据进行存储.查询.计算及分析,是当前业界热门的方向.本文将介绍字节跳动 ...
随机推荐
- 如何在TVM上集成Codegen(上)
如何在TVM上集成Codegen(上) 许多常用的深度学习内核,或者提供DNNL或TensorRT等框架和图形引擎,让用户以某种方式描述他们的模型,从而获得高性能.此外,新兴的深度学习加速器也有自己的 ...
- 适用于Windows和Linux的Yolo-v3和Yolo-v2(下)
适用于Windows和Linux的Yolo-v3和Yolo-v2(下) 如何训练(检测自定义对象): (培养老YOLO V2 yolov2-voc.cfg,yolov2-tiny-voc.cfg,yo ...
- 使用Nucleus SE实时操作系统
使用Nucleus SE实时操作系统 Using the Nucleus SE real-time operating system 到目前为止,在本系列文章中,我们详细介绍了Nucleus SE提供 ...
- 使用multus实现管理网和业务网分离——calico和flannel共存
多个网络层面的需求 一开始为k8s集群搭建了calico网络,所有的容器都用calico对应的网卡进行通信.为了实现网络监控的清爽,想把管理组件,例如日志.统计.监控等组件挪到另外一个网络.于是产生一 ...
- 为什么有些公司的IT很乱?
--别问,问就是赛马,问就是KPI驱动 为什么很多公司甚至是闻名遐迩的资深IT公司,都被吐槽IT技术建设很烂呢?按惯例,问为什么之前,先问是不是. ▒壹·鹅厂▒ 2018年一个名为"当下腾讯 ...
- 关于Maven repository中pom.xml的jar包依赖
https://mvnrepository.com 该mvn网站可以找到个个版本的依赖jar包 http://doc.canglaoshi.org 该网站为达内的开发文档服务器,可以找到很多开发中需 ...
- HTTP请求方法及响应状态码详解
HTTP请求方法和响应状态详解 HTTP请求方法 HTTP1.0/1.1支持的所有请求方法如下所示: GET 用来请求访问已被URI识别的资源.指定的资源经服务器解析后返回响应内容. POST POS ...
- CosId 通用、灵活、高性能的分布式 ID 生成器
CosId 通用.灵活.高性能的分布式 ID 生成器 介绍 CosId 旨在提供通用.灵活.高性能的分布式系统 ID 生成器. 目前提供了俩大类 ID 生成器:SnowflakeId (单机 TPS ...
- MySQL数据库复制技术应用实战(阶段二)
MySQL数据库复制技术应用实战(阶段二)文档 作者 刘畅 时间 2020-9-27 服务器版本:CentOS Linux release 7.5.1804 主机名 ip地址 服务器配置 安装软件 密 ...
- mapboxgl 互联网地图纠偏插件(二)
前段时间写的mapboxgl 互联网地图纠偏插件(一)存在地图旋转时瓦片错位的问题. 这次没有再跟 mapboxgl 的变换矩阵较劲,而是另辟蹊径使用 mapboxgl 的自定义图层,重新写了一套加载 ...