1. 测试目的
本次基准测试内容为嬴图数据库系统数据处理能力的性能测试。包含对系统安装、运维、监控、功能、稳定性、高可用性、伸缩性、并发能力、数据导入、图查询与分析、图算法、结果准确性、时效性、跨硬件平台兼容性等多个维度的性能指标进行综合评估。
同时,为了方便读者了解目前国际范围内其它图数据库系统的性能,本测试中也对标了Neo4j、TigerGraph、JanusGraph以及ArangoDB系统。
2. 测试环境
2.1. 硬件环境
测试集群由3个节点云主机虚拟化实例组成,硬件配置如下表所示:
| 服务器 | 配置 | 
| CPU | 虚拟化X86-64位、Arm64架构32 vCPU(32线程) 主频2.0 GHz | 
| 内存 | 256GB | 
| 硬盘 | 1TB HDD(基于机械硬盘的云盘*) | 
| 网卡 | 5Gbps | 
2.2. 软件环境
| 软件名称 | 描述 | 
| 操作系统 | Linux (Centos 7.x、RedHat7/8 或Ubuntu 18.x) | 
| 容器环境 | Docker 19.x | 
| 图数据库 | 嬴图 v4.0 Neo4j v4.0.7 Enterprise Edition TigerGraph v3.1 JanusGraph v0.6.1 ArangoDB v3.7 | 
注:多系统间性能对标测试结果在3.2.3 性能测试细项部分。
2.3. 数据集
| 数据集 | 描述 | 
| Twitter-2010 | |
| 数据集信息 | Twitter_rv.tar.gz 点:4160万,边:14.7亿 | 
| 数据建模 | 对数据集进行扩展,使得点和边都具有属性。例如,当运行PageRank、LPA和Louvain图算法时,结果可以被写入点属性,也可以不时地进行更新。 | 
注:多系统间性能对标测试结果在3.2.3 性能测试细项部分。
3. 功能测试
3.1. 功能测试结果汇总
| 测试项目 | 测试标准 | 嬴图测试结果 | 
| 系统安装 | 在“测试结果”列中记录本次安装时间 | ~30min | 
| 可扩展性 | 支持分布式数据架构,支持数据分片,支持水平和垂直扩展 | 支持HTAP分布式架构,支持垂直与水平扩展 | 
| 图数据更新 | 支持无需暂停查询服务就可对图模型进行更新,包括对顶点和边的增删改 | 支持在线更新点和边,并可查询变化后结果,运行算法亦可得到变化后结果 | 
| 数据加载 | 支持批量数据导入和流式数据导入,支持Delimited Text(包括csv)、json格式的导入,支持断点续传 | 支持csv导入,支持断点续传 | 
| 图谱更新 | 支持实时图谱更新 | 支持实时图谱更新 | 
| 语言表达力 | 图数据库查询语言能力验证 | 支持完备的UQL图操作语言,易学易用,易于扩展,同时面向业务与技术人员 | 
| 高并发小查询 | 支持单个顶点多跳邻居的高并发查询,并能实时反馈查询结果 | 支持高并发查询 | 
| 影响力分析 | 支持LPA、PageRank算法 | 支持 | 
| 社区发现 | 支持弱联通分量、强联通分量、标签传播、鲁汶算法 | 支持 | 
| 图谱交互 | 支持点、边、属性展示,支持图谱下钻,支持按条件高亮显示顶点或边 | 支持 | 
| 运维监控 | 支持系统运行监控,如CPU、内存、磁盘情况 | 支持 | 
| 日志管理 | 有详尽的日志输出 | 支持 | 
| 数据访问控制 | 支持多图功能,支持多图共享顶点和边 | 支持 | 
| 权限管理 | 具备用户权限管理能力 | 支持 | 
| 备份和恢复 | 支持在线备份,支持系统恢复功能 | 支持 | 
| 高可用 | 支持高可用 | 支持 | 
| 支持灾备 | 异地灾备 | 支持 | 
3.2. 性能测试
3.2.1. 性能测试结果汇总
| 测试项目 | 测试标准 | 嬴图测试结果 | 
| 数据加载 | 数据加载准确无误,并记录加载时间 | 2700秒 | 
| 数据存储空间 | 入库后存储空间与原始数据的大小的比率 | 1.3 | 
| 一度邻居查询 | 给定一个顶点,查询获得所有一度邻居并打印数量。基于种子文件的10个顶点,执行以上查询,统计平均执行时间 | 0.00062秒(平均) | 
| 二度邻居查询 | 给定一个顶点,查询获得所有二度邻居并打印数量。基于种子文件的10个顶点,执行以上查询,统计平均执行时间 | 0.027秒(平均) | 
| 三度邻居查询 | 给定一个顶点,查询获得所有三度邻居并打印数量。基于种子文件的10个顶点,执行以上查询,统计平均执行时间 | 0.52秒(平均) | 
| 六度邻居查询 | 给定一个顶点,查询获得所有六度邻居并打印数量。基于种子文件的10个顶点,执行以上查询,统计平均执行时间 | 1.408秒(平均) | 
| 二十三度邻居查询 | 给定一个顶点,查询获得所有二十三度邻居并打印数量。基于种子文件的10个顶点,执行以上查询,统计平均执行时间 | 1.295秒(平均) | 
| 最短路径 | 给定任意两个顶点,统计最短路径数量,记录计算时间 | 0.18秒(平均) | 
| 更新图集前后查询结果对比 | 改变图的拓扑结构前后进行实时查询,观察是否能实时得到对应的结果变化(K邻查询: 多层邻居计算) | 实时 | 
| 相似度计算 | 给定节点accard相似度Top10计算,记录平均执行计算时间 | 4.99秒 | 
| PageRank | 运行PageRank算法耗时 | 23秒 | 
| 社区发现(标签传播) | 运行标签传播算法耗时 | 80秒 
 | 
| 社区发现(鲁汶) | 运行鲁汶社区识别算法耗时 | 210秒 | 
注:23跳的时间可以短于6跳的时间是因为这些不同的顶点的K-Hop邻居在图上拓扑空间的分配密度不同所致。
3.2.2. 性能测试细项
3.2.2.1. 数据加载
测试目的:将整个数据集加载到图数据库中并开始提供服务。此测试可以显示图系统加载大量数据的速度。
嬴图系统测试内容结果:
| 测试项目 | 测试标准 | 顶点数量 | 边数量 | 加载时间 | 
| 数据加载 | 数据加载准确无误,并记录加载时间 | 41652330 | 1468365182 | 2700秒 | 
各家系统对标结果如下:
| 数据集 | Twitter(2010) | ||||
| 图系统 | 嬴图 | TigerGraph | Neo4j | JanusGraph | ArangoDB | 
| 导入时间 (秒) | 2700 | 1550 | 3120 | 20800 | 32200 | 
| 相对时间 | 1.7 | 1 | 2 | 13.4 | 20.8 | 
| 存储空间 | 30GB | 12GB* | 55GB | 56GB | 128GB | 
| 相对空间 | 2.5 | 1 | 4.58 | 4.67 | 10.67 | 
3.2.2.2 K邻查询
测试目的:K邻查询是任何图系统的基本查询类型。它能帮助用户快速识别实体(目标节点)的影响范围。K邻必须使用BFS(广度优先搜索)地方法实现,并且有一些注意事项:
- 通常有两种定义K邻的方法,它们的结果不同。一种方法是从第1跳到第K跳的所有邻居,另一种方式是所有距离起始节点正好是K跳的所有邻居。
- 如果节点出现在特定节点的第N跳上,则不会显示在其他距离的结果中。在执行算法时,跨不同距离对节点执行重复数据消除至关重要,否则结果将是错误的。
- 节点的直接邻居的数量与边的数量不同,因为一对相连的节点可能有2条双向连接它们的边。
嬴图系统测试内容结果:
注:下表中的N度邻居数指第N度邻居,即与源点最短路径长度(步数)为N步的全部不重复的顶点数量。考虑到其它系统可能使用了1-N度邻居查询,最后的对标测试结果统一可改为(1-N度邻居计算,此种方式去重计算复杂度会降低)。
| 测试项目 | 测试标准 | 给定顶点号 | 第N度邻居数量 | 执行时间 (毫秒) | 平均执行时间 (毫秒) | 
| 一度邻居查询 | 给定多个顶点,查询获得每个顶点的所有一度邻居并打印数量,并记录执行时间 | 20727483 | 973 | 0.509ms | 0.62ms | 
| 50329304 | 4746 | 0.815 | |||
| 26199460 | 19954 | 0.868 | |||
| 1177521 | 4272 | 0.777 | |||
| 27960125 | 7 | 0.484 | |||
| 30440025 | 3386 | 0.733 | |||
| 15833920 | 2181 | 0.505 | |||
| 15015183 | 2279 | 0.492 | |||
| 33153097 | 116 | 0.491 | |||
| 21250581 | 37 | 0.536 | |||
| 二度邻居查询 | 给定多个顶点,查询获得每个顶点所有二度邻居并打印数量,并记录执行时间 | 20727483 | 2874132 | 5.823ms | 27.33ms | 
| 50329304 | 2714697 | 5.606 | |||
| 26199460 | 7818213 | 69.953 | |||
| 1177521 | 19318826 | 70.281 | |||
| 27960125 | 533108 | 1.983 | |||
| 30440025 | 11294131 | 21.967 | |||
| 15833920 | 7858255 | 22.746 | |||
| 15015183 | 5933114 | 27.222 | |||
| 33153097 | 12181518 | 25.157 | |||
| 21250581 | 11063971 | 22.537 | |||
| 三度邻居查询 | 给定一个顶点,查询获得所有三度邻居并打印数量,并记录执行时间 | 20727483 | 27206363 | 400.011ms | 520ms | 
| 50329304 | 29939223 | 407.992 | |||
| 26199460 | 31324330 | 526.919 | |||
| 1177521 | 17139727 | 741.438 | |||
| 27960125 | 20280156 | 101.114 | |||
| 30440025 | 23120607 | 748.711 | |||
| 15833920 | 26263805 | 649.454 | |||
| 15015183 | 27727527 | 475.516 | |||
| 33153097 | 20512136 | 507.208 | |||
| 21250581 | 20804932 | 641.811 | |||
| 六度邻居查询 | 给定多个顶点,查询获得其中每个顶点所有六度邻居并打印数量,并记录执行时间 | 20727483 | 10028 | 1213.226ms | 1408ms | 
| 50329304 | 9052 | 1410.373 | |||
| 26199460 | 3022 | 1372.880 | |||
| 1177521 | 3101 | 1220.169 | |||
| 27960125 | 25838 | 1576.181 | |||
| 30440025 | 5437 | 1659.473 | |||
| 15833920 | 5618 | 1210.724 | |||
| 15015183 | 6197 | 1320.371 | |||
| 33153097 | 6033 | 1229.563 | |||
| 21250581 | 6738 | 1769.825 | |||
| 二十三度邻居查询 | 给定一个顶点,查询获得所有二十三度邻居并打印数量,并记录执行时间 | 15738828 | 3 | 1203.212ms | 1295ms | 
| 9358362 | 1 | 1279.99 | |||
| 9358352 | 1 | 1529.716 | |||
| 17571568 | 1 | 1167.854 | 
| 嬴图执行代码: | 
各家系统对标结果如下:
| 数据集 | Twitter(2010) | ||||
| 图系统 | 嬴图 | TigerGraph | Neo4j | JanusGraph | ArangoDB | 
| 1度邻居(秒) | 0.00062 | 0.024 | 0.2 | 0.39 | 1.667 | 
| 2度邻居(秒) | 0.027 | 0.46 | 18.3 | 27.7 | 28.9 | 
| 3度邻居(秒) | 0.52 | 6.6 | 290 | 4300 | 3888 | 
| 6度邻居(秒) | 1.408 | 62.5 | N/A | N/A | N/A | 
| 23度邻居(秒) | 1.295 | N/A | N/A | N/A | N/A | 
.png)
3.2.2.3. 最短路径
测试目的:测试常用的最短路径算法的正确性和性能。
测试内容结果:需要找到6步以内任意两个顶点间的全部最短路径数量,统计平均运行时间。
| 测试项目 | 测试标准 | 起点 | 终点 | 最短路径数量 | 查询时间 | 平均时间(秒) | 
| 随机10对点的最短路径 | 给定两个顶点,查询它们之间的最短路径的数量。记录执行以上查询的时间。 | 50329304 | 21613682 | 25389 | 0.145s | 0.18s | 
| 49449489 | 15645246 | 2080710 | 1.512s | |||
| 39687658 | 47978366 | 46 | 0.052s | |||
| 15489748 | 38548456 | 8 | 0.003s | |||
| 17524616 | 29884615 | 5 | 0.058s | |||
| 33033471 | 37029346 | 273 | 0.007s | |||
| 37048837 | 17555248 | 1114 | 0.008s | |||
| 26895497 | 37893465 | 2 | 0.002s | |||
| 26468497 | 37164965 | 6 | 0.002s | |||
| 54151557 | 37190965 | 30837 | 0.033s | 
| 嬴图执行代码 | 
| ab().src({_id == 起点ID}).dest({_id == 终点ID}).depth(6).shortest().boost() as paths return count(paths) | 
各系统对标结果如下:
| 源数据 | Twitter(2010),4200万顶点、14.7亿边、24.6GB | ||||
| 图系统 | 嬴图 | TigerGraph | Neo4j | JanusGraph | ArangoDB | 
| 全部最短路径(秒) | 0.18 | 9.2 注:深度≥6步的无法在10分钟内返回 | 注:深度≥3步的无法在10分钟内返回 | 注:深度≥3步的无法在10分钟内返回 | 无法正确返回 (仅能返回1条路径) | 
3.2.3.5影响力分析
测试目的:测试常用的PageRank算法的性能。
测试内容结果:PageRank必须进行全量计算,并且排序后返回Top-10
| 测试项目 | 测试标准 | 嬴图测试结果 全量计算后,返回分值最高的10个顶点及其Ranking值 | 查询时间(秒) | 
| 影响力分析 | 运行PageRank算法,其中迭代次数设为10,阻尼系数为0.8,并获取分值最高的10个顶点。记录执行以上查询的时间。 | 813286,14276.1 14224719,12240 31567254,10288.6 15131310,9860.32 16049683,8546.38 7040932,6775.97 14075928,6672.9 12687952,5345.58 5380672,5021.32 26784273,2886.91 | 16s | 
| 嬴图执行代码: | 
| algo(page_rank).params({order:’desc’,init_value:0.2,loop_num:10,damping:0.8,limit:10}).write({file:{filename:”my_pagerank_result”}}) | 
各系统对标结果如下:注,其它系统并不支持或没有对结果进行排序,如需排序则可能无法完成测试。

3.2.3.6社区发现
测试目的:测试常用的标签传播算法、Louvain社区识别算法在大数据集上运行时的性能。
测试内容结果:
| 测试项目 | 测试标准 | 社区数 | 查询时间(秒) | 
| 标签传播 | 运行标签传播算法,其中迭代次数设为10,并打印社区数。记录执行以上查询的时间。 | 116602 | 80s | 
| 鲁汶社区识别(Louvain) | 运行Louvain社区识别算法,其中迭代次数设为10,收敛精度0.01并打印社区数。记录执行以上查询的时间。 | 1207 (社区数量存在抖动,此处取中位数) | 210s | 
| 嬴图执行代码: | 
| algo(lpa).params({loop_num:10}).write()algo(louvain).params({phase_1_loop_num:10.min_modularity_increase:0.01}).write | 
各系统对标结果如下:
| 源数据 | Twitter(2010),4200万顶点、14.7亿边、24.6GB | ||||
| 图系统 | 嬴图 | TigerGraph | Neo4j | JanusGraph | ArangoDB | 
| PageRank (秒) | 23 | 258 
 | 600 | N/A 无法完成 | N/A 无法完成 | 
| LPA (秒) | 80 | 900 | N/A 无法完成 | N/A 无法完成 | N/A 无法完成 | 
| 鲁汶社区 (秒) | 210 | N/A 注:未测试 | N/A 注:无法在30分钟内完成映射 | N/A 注:未测试 | N/A 注:未测试 | 
注:以下各测试项仅在嬴图数据库系统上完成测试,其它图数据库系统因测试资源和时效性限制并未完成对标测试。
3.2.3.7 更新图集前后查询结果对比
测试目的:更新图集前后,对图集进行查询并对比更新前后的查询结果,测试计算的正确性和性能。此测试项检验的是图数据库系统是否具有实时更新并实时计算的能力(避免某些图系统通过缓存获得错误的、更新前的数据结果返回)。
测试内容结果:
| 测试项目 | 测试标准 | 新建边起点ID | 新建边终点ID | 查询深度 | 更新图集前的K邻(第K度邻居) | 更新图集后的K邻(同左) | 
| 更新图集前后查询结果对比 | 查询某起步点3步以上的k邻居,查询该点为起点的某最短路径,将最短路径首尾相连,重新查1,3,6步k邻数量,对比新插入边前后的查询结果变化 | 20727483 | 28843543 | 1 | 973 | 974 | 
| 3 | 27206363 | 27210397 | ||||
| 6 | 10028 | 10027 | ||||
| 50329304 | 21378173 | 1 | 4746 | 4747 | ||
| 3 | 29939223 | 29939314 | ||||
| 6 | 9052 | 9052 | ||||
| 26199460 | 32278263 | 1 | 19954 | 19955 | ||
| 3 | 31324330 | 31324333 | ||||
| 6 | 3022 | 3022 | ||||
| 1177521 | 6676222 | 1 | 4272 | 4273 | ||
| 3 | 17139727 | 17139725 | ||||
| 6 | 3101 | 3101 | ||||
| 27960125 | 48271231 | 1 | 7 | 8 | ||
| 3 | 20280156 | 20283107 | ||||
| 6 | 25838 | 25836 | ||||
| 30440025 | 38232241 | 1 | 3386 | 3387 | ||
| 3 | 23120607 | 23121930 | ||||
| 6 | 5437 | 5431 | 
3.2.3.8 相似度计算
| 测试项目 | 测试标准 | 给定顶点(公司名或人物ID) | 执行时间 | 平均执行时间(秒) | 
| 相似度计算 | 给定一个顶点,查询与其最相似的10个顶点 (Jaccard相似度, Top-10) | 20727483 | 1.586s | 4.99s | 
| 50329304 | 2.003s | |||
| 26199460 | 10.573s | |||
| 1177521 | 10.52s | |||
| 27960125 | 0.359s | |||
| 30440025 | 2.865s | |||
| 15833920 | 5.042s | |||
| 15015183 | 5.283s | |||
| 33153097 | 5.201s | |||
| 21250581 | 4.525s | 
| 嬴图执行代码: | 
| find().nodes({_id == 给定ID}) as n with n algo(similarity).params({uuids:[n],top_limit:10,type:"jaccard"}) as r return r | 
 
        
        
