3

我想知道是否值得使用图形数据库专门处理关系。

我假装使用关系数据库来存储“用户”、“页面”、“评论”、“帖子”等实体。

但是在典型的基于社交图的工作负载的大多数情况下,我必须进行深度遍历,关系不好处理并且涉及缓慢的连接。

示例:评论-(made_in)->帖子-(made_in)->页面等...

我正在考虑做这样的事情:

例子:

用户编号:1

查询:获取user_id 1的所有关注者

  • 为 ID 为 1 的节点用户查询 Neo4j 以获取名为“follows”的所有输出边
  • 使用 id 列表在 Users 表上查询它们:

    SELECT * FROM users WHERE user_id IN (ids)

这慢吗?

我看过这个问题一起使用 MySQL 和 Neo4j 是个好主意吗?,但仍然无法理解为什么正确的答案说这不是一个好主意。

谢谢

4

3 回答 3

2

对于像您这样需要深度遍历的应用程序,使用 Neo4j 是一种很好的技术选择。它是一个不错的选择的原因有两个:一个是 Cypher 语言使此类查询非常容易。第二个是深度遍历发生得非常快,因为数据库中数据的结构方式。

为了获得这两个好处,您需要在图中同时拥有关系和人(作为节点)。然后你就可以进行朋友的朋友查询,如下所示:

开始 john=node:node_auto_index(name = 'John') MATCH john-[:friend]->()-[:friend]->fof 返回 john, fof

和朋友的朋友的朋友查询如下:

START john=node:node_auto_index(name = 'John') MATCH john-[:friend]->()-[:friend]->()->[:friend]->fofof 返回 john, fofof

...等等。(帖子和评论的想法相同,只需替换名称。)

将 Neo4j 与 MySQL 一起使用很好,但我不会以这种特殊方式这样做,因为代码会复杂得多,而且你会在 Neo4j 和 MySQL 之间浪费太多时间。

祝你好运!

菲利普

于 2013-04-05T21:07:59.350 回答
1

正如其他答案所示,最好使用 Neo4j 作为您的单一数据存储。但是,在某些情况下,如果您的产品背后已经有另一个数据库,则可能没有太多选择。我想补充一点,如果是这种情况,运行 neo4j 作为您的辅助数据库确实可以工作(我工作的产品在这种模式下运行)。您确实必须更加努力地弄清楚您期望从 neo4j 中获得什么功能,需要什么样的数据,如何保持数据同步以及遭受不总是实时结果的后果。我们的大多数用例都可以处理近乎实时的结果,所以我们很好。您的产品可能并非如此。尽管如此,对我来说,在这种模式下使用 neo4j 仍然比没有它运行更可取。因此,我们能够制作出很多非常棒的作品。

于 2013-04-06T03:03:17.587 回答
1

一般来说,您拥有的数据库/系统/层越多,整体设置和操作就越复杂。

想想所有这些任务,如同步、导出/导入、备份/存档等,如果您的数据库规模增长,这些任务将变得非常昂贵。

只有当拥有专用和专用数据库的好处超过必须处理多个数据存储的缺点时,人们才会使用多语言持久性。Fe 如果您有大量数据项(活动或事务日志 fe),每个都与一个用户相关,则可能会出现这种情况。如果您只对数据项之间的连接感兴趣,那么将所有信息存储在图形数据库中可能是没有意义的。所以你最好只存储图中的关系(节点只有一个指向另一个数据库的指针),以及 K/V 存储等中的每个项目的数据。

对于您的示例用例,我只会选择一个数据库,即 Neo4j,因为它是一个图表。

于 2013-04-05T20:58:34.187 回答