为了了解使用 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 的人的朋友的朋友朋友的朋友,所以我制作了这样的查询:
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
用户 ID 1 的查询花费了大约 30 秒
在 Neo4J 中,我为每个人创建了一个具有一个名称属性的节点(20900 个节点)。所有节点都连接到 MySQL 中的 Friendships 表,因此有 120 万个关系。
为了在此处获得相同的 friedset,我输入了 gremlin:
gremlin> g.v(1).outE.inV.loop(2){ it.loops <= 4 }.name.dedup.map()
这花了大约 1 分钟。我根本没想到会这样!
那么我的比较正确吗?如果是,如何修改此示例以显示使用 neo4j 执行此任务的优势?