【工作】RedisGraph简单调研

目前业界图数据库主要以Neo4j、tigergraph、janusgraph等为主,但是前2个并不开源,公司不太考虑使用。通过一段时间的janusgraph调研与测试,总结以下几点

  • 基于属性图模型
  • 使用gremlin框架与查询语言
  • 底层存储基本都是类k-v数据库引擎(cassandra/hbase/bigtable等) 图数据映射成以点为核心的邻接表
  • 可以对点和边的属性建立索引检索,包括复合索引(使用后端存储),混合索引(使用外部索引如ES)
  • 性能上基本等同于后端存储系统的ops 例:后端HBASE 5个regoinserver ,每个rs大概5万ops/s,则最理想批量入库情况 单独创建点的性能是 25万/s。(考虑多节点多客户端多线程并发创建点,优化regoin个数,HBASE参数)
  • 检索性能同理 精确查找关系通常在毫秒级响应(10亿量级)
  • 。。。

janusgraph最大的问题可能在于点的ID映射(节点的内部longid与节点本身的key)即创建点或边时需要判断点是否已经存在,需要拿到点的long id,在实时增量场景,性能会严重下降,可能只有1万ops/s(同上集群)

由于这个原因,希望调研下其他图数据库的可行性。基于Redis内存数据库底层的图数据库,可能性能上更与众不同?
RedisGraph github (1000+ star 看来确实很小众。。)
RedisGraph docs

另一个开源图数据库DGraph似乎也不错,但是基于RDF描述的存储结构和自定义查询QL,分片与Raft,强大的原生存储,原生索引,理解起来很费劲。。暂时看不下去

主要目标

  • 与其他主流图数据库性能区别(内存图数据库能支持多大数据量、速度有多大提升)
  • 使用方式简便性

1 简介

RedisGraph是一种基于Redis全新设计实现的图数据库。它使用了新的Redis Modules API,扩展Redis并提供了一些新的命令和功能。其主要特性包括:

  • 开源,C语言实现、
  • 基于属性图模型设计、
  • 点和边都有label,可以携带属性(与jg一样)、
  • 使用稀疏矩阵表示图(与jg的邻接表不一样)、
  • 简单且快速的索引和查询、
  • 在内存中存储数据、
  • 使用了定制的内存高效数据结构Hexastore、
  • 基于磁盘的数据持久化、
  • 以数据表形式给出的结果集、
  • 支持简单并广为使用的图查询语言Cypher(这是neo4j使用并开源),
  • 以及数据的过滤、聚合和排序等。

2 技术设计

RedisGraph: A High Performance In-Memory Graph Database

  • 使用稀疏矩阵存储图:As directed relationship connecting source node S to destination node T is recorded within an adjacency matrix M, by setting M's S,T entry to 1 (M[S,T]=1)
  • 更具体的例子:社交关系图,定义2种关系,朋友和访问,则产生3个矩阵:
    1)存储节点关系的邻接表矩阵(个人理解:横轴是节点,纵轴是关系)
    2)存储朋友关系的矩阵(个人理解:横轴是节点,纵轴也是节点)
    3)存储访问关系的矩阵(个人理解:横轴是节点,纵轴也是节点)
  • Hexastore对图的表示(稀疏矩阵技术上通常用三元组实现
Hexastore的结构由一系列三元组组成。其中,每个三元组包括如下三部分:

主语(Subject);
谓词(Predicate);
目标(Object)。
主语表示源节点,谓词表示关系,目标表示目的节点。对于图中的每条关系,Hexastore将保存源节点、关系边和目的节点间所有可能存在的六种排列。以下面这条关系为例:

(Aldis_Hodge)-[act]->(Straight_Outta_Compton)
其中, Aldis_Hodge 是源节点,act是关系,Straight_Outta_Compton是目标节点。

该关系的六种可能排列如下:

SPO:Aldis_Hodge:act:Straight_Outta_Compton
SOP:Aldis_Hodge:Straight_Outta_Compton:act
POS:act:Straight_Outta_Compton:Aldis_Hodge
PSO:act:Aldis_Hodge:Straight_Outta_Compton
OPS:Straight_Outta_Compton:act:Aldis_Hodge
OSP:Straight_Outta_Compton:Aldis_Hodge:act
一旦构建了Hexastore,我们可以轻易地实现图搜索。例如,如果要查找“Straight Outta Compton”电影中的演员,那么可以实现为搜索Hexastore中所有包含前缀OPS:Straight_Outta_Compton:act:*的字符串。

如果要查找Aldis Hodge参演的所有电影,那么可以实现为查找所有包含前缀SPO:Aldis_Hodge:act:*的字符串。

尽管Hexastore会占用大量的内存,因为每条关系表示为六个三元组,但是这样的三元组数据结构不仅支持快速搜索,而且可以高效地使用内存,因为它并不会重复地生成已有的字符串前缀。
  • 数据插入操作是O(1)的
  • 百万级每秒的入库速度。。。
    原话(RedisGraph is able to create over 1 million nodes under half a second and form 500K relations within 0.3 of a second.)

3 接口和使用

  • 使用redis-cli
  • 可以基于redis安装module并使用 也可以自行编译
  • 有java/python/go/js/php/rust等语言支持
  • reference:实现了cypher语言的子集(Cypher Coverage)
  • 大概包含常用数据类型 检索方式 聚合函数
  • MATCH
    WHERE
    RETURN
    ORDER BY
    SKIP
    LIMIT
    CREATE
    MERGE
    DELETE
    SET
    WITH
    UNION
  • 结果集表示层次很不友好。。。
"MATCH (n1)-[r]->(n2) RETURN n1, r, n2.name"
1) 1) "n1"
   2) "r"
   3) "n2.name"
2) 1) 1) 1) 1) "id"
            2) (integer) 0
         2) 1) "labels"
            2) 1) "person"
         3) 1) "properties"
            2) 1) 1) "age"
                  2) (integer) 27
               2) 1) "name"
                  2) "Pam"
      2) 1) 1) "id"
            2) (integer) 0
         2) 1) "type"
            2) "works"
         3) 1) "src_node"
            2) (integer) 0
         4) 1) "dest_node"
            2) (integer) 1
         5) 1) "properties"
            2) 1) 1) "since"
                  2) (integer) 2010
      3) "Dunder Mifflin"
3) 1) "Query internal execution time: 1.858986 milliseconds"
  • 。。。

4 一些测试对比

非自测,来自网络
4000万点,15亿边 twitter数据集
单机 250G内存 32核机器

【工作】RedisGraph简单调研_第1张图片
image.png

【工作】RedisGraph简单调研_第2张图片
image.png
【工作】RedisGraph简单调研_第3张图片
image.png

其他问题

  • 是否支持分布式 是否线性扩展?似乎只能单机?
    At the moment, RedisGraph can't distribute its data。(from github 201807)
    截止目前,简单翻了下github release log,当前2.x版本 仍不支持分布式
  • 属性似乎不能建立索引与检索?只能检索关系?
    (文档未找到)

小结

  • RedisGraph还非常小众,大概也不成熟(原话:is still a young project)?(从官网简陋的文档资料差不多就能看出来。。)
  • DB-Engines Ranking上排名都没有
  • 支持的数据量级应该不大,毕竟内存
  • 性能确实很快(平均大概是其他数据库的十倍+ ?)
  • 检索语言的复杂度和功能似乎远不如gremlin。。(不知道是不是因为这里只实现了子集的缘故?或者说gremlin很多语法其实基本也不怎么用)
  • 与gremlin完全不同的一套语法 考虑学习和迁移成本
  • 总之,pass it 浪费半天 ~~

附1 最新 DB-Engines Ranking(图数据库相关)

【工作】RedisGraph简单调研_第4张图片
image.png

附2 关于图数据库的基本模型

  • 属性图
  • 三元组RDF(资源描述框架)

附3 主要图数据库查询语言Cypher、Gremlin和SPARQL

个人理解,gremlin面向路径,表达功能很强大,
cypher更偏向SQL习惯(非数据库SQL,一些更特定的语法),
至于SPARQL,理解不能,略。

附4 基于RDF三元组的Dgraph的基本思路

【工作】RedisGraph简单调研_第5张图片
image.png

每条数据是一个三元组(主S - 谓Q(关系)- 宾O)。分别对SQO建立倒排索引以支持检索。。。
索引允许附带信息(即属性),所以我附上了每个实体的类型信息(即演员,书,人等等)。


【工作】RedisGraph简单调研_第6张图片
image.png

【有点不太能理解关系posting list的的快速过滤。。这里量级很大吧?猜测是分裂?】

你可能感兴趣的:(【工作】RedisGraph简单调研)