比较MySQL和Neo4J中的朋友之间的朋友关系

时间:2012-12-11 12:19:58

标签: mysql graph neo4j gremlin

要了解使用Neo4J进行朋友关系的优势,我在MySQL数据库上创建了一个人员表(“人员”,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的朋友朋友,所以我精心设计了这样的查询:

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表相同,因此有120万个关系。

在这里得到相同的frinedset,我输入gremlin:

gremlin> g.v(1).outE.inV.loop(2){ it.loops <= 4 }.name.dedup.map()

这需要1分钟左右。我根本没想到这个!

我的比较也正确吗?如果是,如何修改此示例以显示使用neo4j执行此任务的优势?

2 个答案:

答案 0 :(得分:1)

如果您知道自己正在进行4次循环,请执行以下操作:

g.v(1).out.out.out.out.name.dedup.map

Gremlin中存在一个已知的语义错误,其中loop()将转变为广度优先查询。    https://github.com/tinkerpop/pipes/issues/25

此外,如果你不需要,不要做outE.inV。等价物已经出来了。此外,意识到你正在进行4步搜索,即大规模计算(组合爆炸)。这是图数据库不擅长的东西。您将需要查看像Faunus这样的批量分析框架 - http://thinkaurelius.github.com/faunus/。有理由,请参阅http://thinkaurelius.com/2012/04/21/loopy-lattices/

图形数据库针对本地遍历进行了优化,通过4个步骤,您触摸(最有可能)整个数据集并使用“get get get”风格的数据库访问,这样做效率不高。

HTH, 马尔科。

答案 1 :(得分:0)

我对Gremlin并不过分熟悉,但我生成了一个类似大小的数据集(下面的统计数据)并在Cypher中运行了一个等效的查询:

START person=node:user(name={name})
MATCH person-[:FRIEND]-()-[:FRIEND]-()-[:FRIEND]-()-[:FRIEND]-friend
RETURN friend.name AS name

我针对数据集运行了1000次,每次选择不同的用户作为起点。在运行测试之前我没有给缓存加热,所以这是从一开始就开始的。平均响应时间:33毫秒。

在MacBook Pro上运行,2.2 GHz Intel Core i7,8 GB RAM,4 GB堆

以下是图表统计信息:

+----------------------------------------------+
| user           | 20900                       |
+----------------------------------------------+
|                | Average |    High |     Low |
+----------------------------------------------+
| FRIEND                                       |
+----------------------------------------------+
|       OUTGOING |      74 |     100 |      48 |
|       incoming |      74 |     123 |      31 |
+----------------------------------------------+

+----------------------------------------------+
| _UNKNOWN       | 1                           |
+----------------------------------------------+
|                | Average |    High |     Low |
+----------------------------------------------+

+----------------------------------------------+
| Totals                                       |
+----------------------------------------------+
| Nodes          | 20901                       |
| Relationships  | 1565787                     |
+----------------------------------------------+
| FRIEND         | 1565787                     |
+----------------------------------------------+