0

为了了解使用 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 执行此任务的优势?

4

2 回答 2

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,马尔科。

于 2012-12-11T23:19:35.757 回答
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                     |
+----------------------------------------------+
于 2012-12-11T19:23:23.887 回答