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 |

