Star

图数据库对比

图数据库在挖掘黑灰团伙以及建立安全知识图谱等安全领域有着天然的优势。为了能更好的服务业务,选择一款高效并且贴合业务发展的图数据库就变得尤为关键。本文挑选了几款业界较为流行的开源图数据库与Nebula进行了多角度的对比。

比较对象:

Neo4j: Neo4j是目前业界广泛使用的图数据库,包含社区版本和商用版本,本文中使用社区版本。

HugeGraph:HugeGraph是百度基于JanusGraph改进而来的分布式图数据库,主要应用场景是解决百度安全事业部所面对的反欺诈、威胁情报、黑产打击等业务的图数据存储和图建模分析需求。具有良好的读写性能。

测试硬件环境:

性能对比:

我们使用不同量级的图从入库时间,一度好友查询,二度好友查询,共同好友查询几个方面进行了对比,结果如下:


可以看到在导入性能上,数据量小的时候nebula的导入效率稍慢于neo4j,但在大数据量的时候Nebula Graph的导入明显优于其他两款图数据库;在3种查询场景下,nebula的效率都明显高于neo4j,与HugeGraph相比也有一定的优势。

查询语言对比:


从查询语句的角度出发,gremlin比较复杂,ngql和cypher比较简练,从可读性角度出发,ngql比较类sql化,比较符合大家的使用习惯。

可视化对比:


在可视化方面,所有的平台都还只处于可用状态,Nebula Graph的选择性扩展在团伙挖掘中是一个加分项,但是在二度结果展示流畅度,展示结果自定义展示方面还有优化空间。

在比较了多款业内主要使用的开源数据库后,我们从性能,学习成本和与业务的贴合程度多个角度考虑,最终选择了性能出众,上手简单,能大幅提高业务效率的Nebula Graph图数据库。

本次测试结果系腾讯云安全团队李航宇、邓昶博撰写

7赞

image
image
image
image

很有意思的测试

有几个问题。

  1. 数据集是什么样的,大概是什么数据分布?
  2. 延迟是在什么情况下测出来的呢,大概什么吞吐?延迟是平均延迟,还是 pct99 之类的呢。
  3. neo4j 的这个延迟感觉很令人诧异。1000w 条边,260G 内存,都可以全缓存了,为什么一度查询这么慢呢,要六秒。

1.数据集用的是我们内部脱敏的关系数据,大概分布如下图(高于50度的点分布也很少,为了方便看我们把50度以上的结果截断了):
image
2.延迟我们用的是平均延迟。
3.这块我们在测试neo4j的时候使用的是其推荐的内存大小,具体如下:
image
效果在我们经过几次测试之后,仍然稳定在6s左右:


index也是正常运作的,可能的解释是说到查询时间是指图中的37ms,我们在实验中记录的都是控制台显示结果的时间,所以记录的是6s。

如果这块测试还有什么问题的话欢迎指出哈~

1赞

你好, 非常感谢测试对比, 想补充问下几个问题:

  1. 图读写有个很重要的指标是 缓存 的使用情况, 以及命中率. 尤其是在单机测试的情况下, 测试数据最大假设<400G, 图处理压缩后可 <300G, 可全部放入内存, 那此时读内存和读盘的差异就会十分大(>100倍),
    是否考虑限制一下内存使用, 或者说给出各自使用内存 & 命中缓存(metrics中)的情况
  2. 从图 server 端, 到后端 rocksdb, 到 OS 层面可能有三级的缓存影响, 多次测试不知是否有清空或关闭缓存, 且不同的 rocskdb 配置(例如: 是否自动compaction)和分片数都会有不同的差异, 不知道目前的测试配置是一致的么
  3. 测试数据量级不同时, 不知是否是同一类数据源, 以写入测试为例, 10亿边Nebula导入30min, 但80亿边也是30min, 而且此时其他两个组件却有10倍以上的时延增长, 似乎有点费解 (而且和图表也没对上, 不知是否是笔误了)
  4. 查询测试方面, 这里有两个疑问:
    • Neo4j 测试语句应该是会同时返回点id+属性? 如果是, 此时 Nebula 的查询语句参考官方的测试, 应该也采用返回属性的写法才对. Huge的查询则应该去掉count(), 或者也让 neo4j 避免加上过滤器不显示属性
      从neo4j命令行的两个查询数值来看, 似乎从"底层查询 --> 显示渲染"似乎花了许多时间, 而其它两个图则没有这个时延, 不知道是否是这个问题导致.
    • 另外, 如果是只返回点id, Huge也提供了单独的kneighbor 查询API, 避免走 gremlin-server 带来的时延, 因为实际这种查询, 包括 "“最短路 / 全路径” 等都是单独的算法, gremlin的写法是通用组合, 效率会更低一些
  5. 可视化的部分, 选择性扩散, 和 批量查询 这两个不知是什么意思?
    • 前者是指, 查询之后, 是否可以局部再展开么? 这个似乎都是支持的 (还是说可视化filter的意思?)
    • 后者批量查询, 直接在gremlin中插入多个点/边id, 或者绑定查询语句也是可以一次查多个的.

期待您的回复 :smile:

感谢你的问题和建议,我们在根据建议逐个排查测试,有结果会及时反馈上来 :grin:

少了Dgraph,很喜欢nebula,但没有Dgraph与nebula的对比,请增加这两个的对比

图的CRUD很丰富,各个产品侧重点也完全不同。
欢迎你在自己的业务场景下评测对比。

想问下hugegraph这边用的是哪个后端? 二度三度关系查询到的数据量级大概是多少?

1赞

浙ICP备20010487号