PandaDB vs Neo4j 单机图查询性能对比测试报告

PandaDB

本测试报告由PandaDB开发团队提供
时间: 2021年3月31日

1.测试简介

PandaDB是以属性图为基础实现的大规模异构数据的融合管理。为指导后续研发,我们以目前最为成熟、应用最广泛、单机图查询的性能标杆图数据库——Neo4j为参照,实测了PandaDB和Neo4j在单机图查询上的性能差异。

本次测试,我们采用了图数据库的国际通行基准测试LDBC的测试数据集和部分测试负载。

2.测试环境

表 1:测试环境

环境 配置
硬件环境 单台测试物理机,配置:
双路至强可扩展金牌6230R CPU
384GB DDR4内存
220 TB Raid 5 HDD
软件环境 操作系统版本:CentOS 7.8 (64 bit)
JDK版本:1.8
测试使用软件版本 PandaDB版本:v0.3.0.210331
Neo4j版本:v3.5.6 Community

3.测试负载

基于基准测试LDBC的测试数据和测试负载。其中测试数据中有170亿边,25亿节点。

首先git clone https://github.com/ldbc/ldbc_snb_datagen,然后生成测试数据并导入PandaDB。

(1)测试数据的生成

编辑ldbc_snb_datagen根目录下的params.ini文件,将generator.scaleFactor设置为1000。然后执行命令:
tools/run.py --cores 24 --memory 100g ./target/ldbc_snb_datagen-0.4.0-SNAPSHOT-jar-with-dependencies.jar params.ini
生成的数据量在1.3TB左右。

(2)测试数据的导入

将测试数据分别导入Neo4j、PandaDB,导入语句见附录1。
Neo4j导入耗时:1d 5h 40m 49s 176ms。
PandaDB导入耗时:21h 19m 13s 107ms。

(3) 数据索引

:person("id")
:post("id")
:comment("id")
:person("firstName")

(4) 数据量

PandaDB磁盘占用为2.4 TB,Neo4j 1.8 TB。

4.测试语句

表 2 : 本测试报告所用测试负载(Cypher语句)

编号 查询语句 对应的LDBC测试语句 测试语义
C1 MATCH (n:person{firstName:"%s"})
RETURN n
根据非唯一属性过滤节点
C2 MATCH (m:comment {id: "%s"})
RETURN m.creationDate AS messageCreationDate,
m.content as content
interactive-short4 根据唯一属性过滤节点
C3 MATCH (n:person {id:"%s"})-[r:knows]-(friend:person{lastName:"Sharma"})
RETURN id(friend)
interactive-short3 一度关系,返回id
C4 MATCH (n:person{id:"%s"})-[r:knows]-(friend)
RETURN friend.id AS personId,
friend.firstName AS firstName,
friend.lastName AS lastName,
r.creationDate AS friendshipCreationDate
interactive-short3 一度关系,返回节点数据
C5 MATCH (n:person {id:"%s"})-[:isLocatedIn]->(p:place)
RETURN n.firstName AS firstName,
n.lastName AS lastName,
n.birthday AS birthday,
n.locationIP AS locationIP,
n.browserUsed AS browserUsed,
p.id AS cityId, n.gender AS gender,
n.creationDate AS creationDate
interactive-short1 一度关系,返回节点数据
C6 MATCH (m:comment{id:"%s"})-[:hasCreator]->(p:person)
RETURN p.id AS personId,
p.firstName AS firstName,
p.lastName AS lastName
nteractive-short5 一度关系,返回节点数据
C7 MATCH (n:person {id:"%s"})-[:knows]-> () -[:knows]->(m:person{gender:"male"})
RETURN id(m)
二度关系,首尾节点加属性过滤
C8 MATCH (n:person {id:"%s"})-[:knows]-> () -[:knows]->(m:person)
RETURN m.firstName AS firstName,
m.lastName AS lastName,
m.birthday AS birthday,
m.locationIP AS locationIP,
m.browserUsed AS browserUsed
二度关系,返回属性
C9 MATCH (:person {id:"%s"})<-[:hasCreator]-(m)-[:replyOf]->(p:post)-[:hasCreator]->(c)
RETURN m.id AS messageId,
m.creationDate AS messageCreationDate,
p.id AS originalPostId,
c.id AS originalPostAuthorId,
c.firstName AS originalPostAuthorFirstName,
c.lastName AS originalPostAuthorLastName
interactive-short2 三度关系
C10 MATCH (m:comment{id:"%s"})-[:replyOf]->(p:post)<-[:containerOf]-(f:forum)-[:hasModerator]->(mod:person)
RETURN f.id AS forumId,
f.title AS forumTitle,
mod.id AS moderatorId,
mod.firstName AS moderatorFirstName,
mod.lastName AS moderatorLastName
interactive-short6 三度关系
C11 MATCH (m:post{id:"%s"})<-[:replyOf]-(c:comment)-[:hasCreator]->(p:person)
RETURN c.id AS commentId,
c.content AS commentContent,
c.creationDate AS commentCreationDate,
p.id AS replyAuthorId,
p.firstName AS replyAuthorFirstName,
p.lastName AS replyAuthorLastName
interactive-short7(前半部分) 两度关系
C12 MATCH (m:post{id:"%s"})-[:hasCreator]->(a:person)-[r:knows]-(p)
RETURN m.id AS postId,
m.language as postLanguage,
p.id AS replyAuthorId,
p.firstName AS replyAuthorFirstName,
p.lastName AS replyAuthorLastName
interactive-short7(后半部分) 两度关系

5. 测试结果

表3:测试结果(ms)

查询语句 Neo4j
查询耗时
PandaDB
查询耗时
加速比[1]
(PandaDB相对于Neo4j)
C1 998 1,125 0.89
C2 154 54 2.85
C3 7,381 1,197 6.17
C4 1,261 473 2.67
C5 68 109 0.62
C6 139 126 1.10
C7 2,218 486 4.56
C8 3,275 2,447 1.34
C9 37,793 27,743 1.36
C10 164 169 0.97
C11 117 107 1.09
C12 2,232 212 10.53
图1:查询语句的响应时间对比
图2:查询语句的响应时间对比(%)

附录:测试数据导入语句

导入语句如下所示。其中<data-dir>修改为数据实际存储路径。
(1)Neo4j数据导入命令
nohup neo4j-community-3.5.6/bin/neo4j-admin import --database graph1000.db --nodes=<data-dir>/ldbc/ldbc-out/ldbc-1000/nodes/tag-output.csv --nodes=<data-dir>/ldbc/ldbc-out/ldbc-1000/nodes/comment-output.csv --nodes=<data-dir>/ldbc/ldbc-out/ldbc-1000/nodes/tagclass-output.csv --nodes=<data-dir>/ldbc/ldbc-out/ldbc-1000/nodes/person-output.csv --nodes=<data-dir>/ldbc/ldbc-out/ldbc-1000/nodes/forum-output.csv --nodes=<data-dir>/ldbc/ldbc-out/ldbc-1000/nodes/post-output.csv --nodes=<data-dir>/ldbc/ldbc-out/ldbc-1000/nodes/organisation-output.csv --nodes=<data-dir>/ldbc/ldbc-out/ldbc-1000/nodes/place-output.csv  --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/organisation_isLocatedIn_place-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/person_knows_person-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/post_hasCreator_person-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/tagclass_isSubclassOf_tagclass-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/person_studyAt_organisation-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/forum_hasTag_tag-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/comment_replyOf_comment-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/person_likes_comment-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/forum_hasMember_person-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/person_workAt_organisation-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/comment_hasCreator_person-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/person_likes_post-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/place_isPartOf_place-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/post_hasTag_tag-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/comment_isLocatedIn_place-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/comment_hasTag_tag-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/tag_hasType_tagclass-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/forum_hasModerator_person-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/comment_replyOf_post-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/person_isLocatedIn_place-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/post_isLocatedIn_place-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/forum_containerOf_post-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/person_hasInterest_tag-output.csv  --delimiter "|" --array-delimiter ";" > neo4j-import-0303.log 2>&1 &
(2)PandaDB数据导入命令
nohup java -jar pandadb-importer-v0.3.jar --db-path=<data-dir>/panda-server/ldbc-1000.0302.db --nodes=<data-dir>/ldbc/ldbc-out/ldbc-1000/nodes/tag-output.csv --nodes=<data-dir>/ldbc/ldbc-out/ldbc-1000/nodes/comment-output.csv --nodes=<data-dir>/ldbc/ldbc-out/ldbc-1000/nodes/tagclass-output.csv --nodes=<data-dir>/ldbc/ldbc-out/ldbc-1000/nodes/person-output.csv --nodes=<data-dir>/ldbc/ldbc-out/ldbc-1000/nodes/forum-output.csv --nodes=<data-dir>/ldbc/ldbc-out/ldbc-1000/nodes/post-output.csv --nodes=<data-dir>/ldbc/ldbc-out/ldbc-1000/nodes/organisation-output.csv --nodes=<data-dir>/ldbc/ldbc-out/ldbc-1000/nodes/place-output.csv  --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/organisation_isLocatedIn_place-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/person_knows_person-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/post_hasCreator_person-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/tagclass_isSubclassOf_tagclass-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/person_studyAt_organisation-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/forum_hasTag_tag-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/comment_replyOf_comment-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/person_likes_comment-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/forum_hasMember_person-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/person_workAt_organisation-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/comment_hasCreator_person-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/person_likes_post-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/place_isPartOf_place-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/post_hasTag_tag-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/comment_isLocatedIn_place-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/comment_hasTag_tag-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/tag_hasType_tagclass-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/forum_hasModerator_person-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/comment_replyOf_post-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/person_isLocatedIn_place-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/post_isLocatedIn_place-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/forum_containerOf_post-output.csv --relationships=<data-dir>/ldbc/ldbc-out/ldbc-1000/relations/person_hasInterest_tag-output.csv  --delimeter="|" --array-delimeter=";" > 1000-0302.log 2>&1 &

[1] 注:加速比计算公式:Neo4j查询时间/PandaDB查询时间。此值越大表示pandadb性能优势越明显,为1表示查询性能相同

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容

  • neo4j使用使用Cypher查询图形数据,Cypher是描述性的图形查询语言,语法简单,功能强大。 和SQL很相...
    8a590e918db0阅读 4,243评论 0 0
  • 0.Neo4j安装 为了方便快速学习,采用docker 方式安装 下载镜像 docker pull neo4j 创...
    Sachin猿人阅读 143评论 0 0
  • 1. 什么是Neo4j? Neo4j是一个高性能的NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是...
    Whoami令狐冲阅读 492评论 0 3
  • Neo4j基础教程 Neo4j 第一篇:在Windows环境中安装Neo4j 一.安装Neo4j前,需要安装JDK...
    ZhongSir_2425阅读 761评论 0 2
  • Neo4j 一、什么是neo4j? Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不...
    会飞的蜗牛66666阅读 2,181评论 0 4