【工作】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亿量级)
- 。。。
由于这个原因,希望调研下其他图数据库的可行性。基于Redis内存数据库底层的图数据库,可能性能上更与众不同?
RedisGraph github (1000+ star 看来确实很小众。。)
RedisGraph docs
另一个开源图数据库DGraph似乎也不错,但是基于RDF描述的存储结构和自定义查询QL,分片与Raft,强大的原生存储,原生索引,理解起来很费劲。。暂时看不下去
主要目标
- 与其他主流图数据库性能区别(内存图数据库能支持多大数据量、速度有多大提升)
- 使用方式简便性
- 开源,C语言实现、
- 基于属性图模型设计、
- 点和边都有label,可以携带属性(与jg一样)、
- 使用稀疏矩阵表示图(与jg的邻接表不一样)、
- 简单且快速的索引和查询、
- 在内存中存储数据、
- 使用了定制的内存高效数据结构Hexastore、
- 基于磁盘的数据持久化、
- 以数据表形式给出的结果集、
- 支持简单并广为使用的图查询语言Cypher(这是neo4j使用并开源),
- 以及数据的过滤、聚合和排序等。
- 使用稀疏矩阵存储图: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.)
- 使用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"
- 。。。
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 浪费半天 ~~
文章图片
image.png 附2 关于图数据库的基本模型
- 属性图
- 三元组RDF(资源描述框架)
cypher更偏向SQL习惯(非数据库SQL,一些更特定的语法),
至于SPARQL,理解不能,略。
附4 基于RDF三元组的Dgraph的基本思路
文章图片
image.png
每条数据是一个三元组(主S - 谓Q(关系)- 宾O)。分别对SQO建立倒排索引以支持检索。。。
索引允许附带信息(即属性),所以我附上了每个实体的类型信息(即演员,书,人等等)。
文章图片
image.png
【有点不太能理解关系posting list的的快速过滤。。这里量级很大吧?猜测是分裂?】
推荐阅读
- 《要事第一》读书笔记
- 【王兴国营养特训班】第5期第5课1组董毅
- 当我在分析数据的时候,我在分析什么()
- 不是原配有多好,而是不想离开
- 暮色·天外
- 91.单一和单纯
- 细心是一种能力
- 大四毕业到工作两年,成就小记
- 悦厚(社区电商和社区门店付费会员案例)
- 【一枝秃笔自言自语】一箱油少花了56块钱