美文网首页
【工作】RedisGraph简单调研

【工作】RedisGraph简单调研

作者: 苏柏亚的星空 | 来源:发表于2020-05-13 16:42 被阅读0次

    目前业界图数据库主要以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核机器

    image.png image.png 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(图数据库相关)

    image.png

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

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

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

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

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

    image.png

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


    image.png

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

    相关文章

      网友评论

          本文标题:【工作】RedisGraph简单调研

          本文链接:https://www.haomeiwen.com/subject/szunnhtx.html