当前位置: 首页 > 知识库问答 >
问题:

朋友的朋友的朋友的朋友的朋友。。。MySQL和Neo4J中的关系

湛功
2023-03-14

为了了解在朋友关系中使用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个节点)和一个name属性。所有节点都连接到MySQL中的Friendships表,因此有120万个关系。

为了在这里获得相同的FriedSet,我输入了gremlin:

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

这花了大约1分钟。我一点也没想到会这样!

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

共有2个答案

李安歌
2023-03-14

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

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

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

在MacBook Pro上运行,2.2 GHz英特尔酷睿i7,8 GB内存,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                     |
+----------------------------------------------+
茅星华
2023-03-14
g.v(1).out.out.out.out.name.dedup.map

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

此外,不要外出。如果你不需要的话。等价物出局了。另外,要意识到你正在做一个4步搜索,这是一个大规模的计算(组合爆炸)。这是graph数据库所不擅长的。为此,您需要查看类似Faunus的批处理分析框架--http://thinkaurelius.github.com/faunus/.要了解原因,请参见http://thinkaurelius.com/2012/04/21/loopy-lattices/

图数据库针对本地遍历进行了优化,通过4个步骤,您触及(最有可能)整个数据集,并使用“获取获取”风格的数据库访问,这是无效的。

嘿Marko

 类似资料:
  • 问题内容: 我有一个类似于myspace / facebook的社交网络。在我的代码中,您不是一个人的朋友,还是不是一个朋友,因此,我显示了您与之成为朋友的人的所有操作(在此帖子中,我将这些操作单独称为公告帖子,以使其更易于可视化。 因此,您每当有人发布公告时,都会向在那里的任何朋友显示。 在mysql中,您可以通过执行以下操作来获得个人朋友列表, 我想知道像facebook之类的网站如何显示您的

  • 问题内容: 我正在尝试从用户表中提取数据,并且需要“朋友之友”,这些人与所选用户相距两步 但未直接连接到所选用户 我尝试了以下查询: 我不知道如何拉未直接连接到所选用户的用户。我得到了当前用户的朋友的所有朋友,但是我 也 得到了当前用户的直接朋友。 问题答案: 您只需要排除既是直接朋友又是朋友的人。我已经重新排列了表别名,这样(无论如何对我来说)就更清楚了要检索的内容: 它还消除了排除要查询的用户

  • 问题内容: 我正在研究“可能的朋友”功能。在这里,我需要向不是我的朋友的所有朋友显示所有朋友,也不要发送给我或没有我的待处理请求 对于每一次友谊,我都会做两个记录。假设用户1和2成为朋友…我要在表中做一个记录,再做一个。 当第一个用户发送请求时,将状态设置为0,而当朋友接受请求时,我将两行都更新为1 如何根据朋友的朋友进行建议“可能的朋友”的sql查询? 问题答案: 在这里,您…简单加入

  • 可通过PlayStation®Network与远方的用户成为朋友,或查看朋友状态的应用程序。能在(派对)或(群信息)等应用程序中,与朋友尽情交流。在个人信息画面或游戏的交流区中亦可查看朋友的活动或撰写留言。 朋友的LiveArea™ 成为朋友 查看个人信息

  • 问题内容: 如何使用Twitter4J获取朋友或关注者的朋友列表? 使用,我只能检索已通过身份验证的当前用户的朋友/关注者列表。我想要的是获取关注者的朋友列表或经过身份验证的用户的朋友列表。 问题答案:

  • 在主画面轻触(朋友)即会显示。 A ) 动作图标 轻触图标可启动支持朋友的功能。 B ) 入口 轻触即可开启朋友的应用程序。 同时开启数个应用程序的LiveArea™时,在屏幕往左右滑碰即可游走于LiveArea™之间。 在LiveArea™按下PS键,会显示索引画面,可查看开启中的LiveArea™列表。