【发布时间】:2012-12-11 12:19:57
【问题描述】:
为了了解使用 Neo4J 建立朋友关系的优势,我在 MySQL 数据库上为 Persons 创建了一个表(“Persons”,20900 个数据集):
id | name
--------------
1 | Peter
2 | Max
3 | Sam
... | ...
20900 | Rudi
和一张关系表(“友谊”,每个人有 50 到 100 个朋友):
personen_id_1 | personen_id_2
-------------------------
1 | 2
1 | 3
2 | 56
... | ...
20900 | 201
所以,大约有 120 万个关系。
现在我想现在是 id=1 的 Person 的friends-of-friends-of-friends-of-friends,所以我制作了这样的查询:
select distinct P.name
from Friendships f
join Friendships f2 ON f.personen_id_2 = f2.personen_id_1
join Friendships f3 ON f2.personen_id_2 = f3.personen_id_1
join Friendships f4 ON f3.personen_id_2 = f4.personen_id_1
join Persons P ON f4.personen_id_2 = P.id
where f.personen_id_1 = 1
user-id 1 的查询花费了大约 30 秒
在 Neo4J 中,我为每个人创建了一个具有一个名称属性的节点(20900 个节点)。所有节点都与 MySQL 中的 Friendships-table 连接,因此有 120 万个关系。
为了在此处获得相同的 finedset,我输入了 gremlin:
gremlin> g.v(1).outE.inV.loop(2){ it.loops <= 4 }.name.dedup.map()
这花了大约 1 分钟。我根本没想到会这样!
所以我的比较正确吗?如果是,如何修改此示例以显示使用 neo4j 完成此任务的优势?
【问题讨论】:
-
您使用了什么 JVM 设置?你的硬件是什么? JVM 的默认内存设置对于数据库来说太小了。如果这是第一次运行,它只会测量您的磁盘速度以提取数据。
-
我使用 oracle jvm 1.6,堆大小设置为
java -Xms 1G -Xmx 1G