16

我有一个将关系信息存储在 MySQL 表中的应用程序(contact_id、other_contact_id、strength、recorded_at)。如果我需要做的只是显示联系人的关系是谁,甚至生成两个联系人的相互联系人列表,这很好。

但现在我需要生成如下统计数据:“2011 年 1 月,强度为 3 或更高的双向连接的总数是多少”或(假设每个联系人都是一个组的一部分)“哪个组的连接数最多到其他团体等

我很快发现生成这些统计信息的 SQL 很快就变得笨拙了。

所以我写了一个脚本,对于任何给定的日期,它都会在内存中生成一个图表。然后我可以针对该图表运行我想要的任何统计数据。更容易理解,一般来说,性能也更高——除了生成图形部分。

我的下一个想法是缓存这些图表,以便在需要运行新统计数据时调用它们(或生成以后的图表:例如,对于今天的图表,我采用昨天的图表并应用自昨天以来发生的任何更改)。我尝试了 memcached,它在图表增长 > 1 MB 之前效果很好。

所以现在我正在考虑使用像 Neo4J 这样的图形数据库。

唯一的问题是,我没有一张图表。或者我会,但它会随着时间的推移而变化,我需要能够用不同的参考时间来查询它。

那么,我可以:

  • 在 Neo4J 中存储多个图形并分别重新检索/交互它们?然后,我将为每个日期创建并存储单独的社交图。

或者

  • 为每条边添加有效的时间戳并适当地过滤图形:因此,如果我想要“5 月 1 日”的图形,我只会遵循“5 月 1 日”之前创建的两个节点之间的最新边(如果所有边是在 5 月 1 日之后创建的,那么这些节点将不会连接)。

我对图形数据库很陌生,所以任何帮助/指针/提示都将不胜感激。

4

3 回答 3

15

现在你可以在一个 Neo4j 实例中只存储一个图形数据库,但是这个图形数据库可以包含任意数量的不同子图。您只需要在执行全局操作(如索引查询)时记住这一点,但您可以执行包含时间戳属性的复合查询以限制结果。

一种方法是,正如您所说,将时间信息添加到边以表示给定日期的图形结构,然后您可以遍历当时的图形结构。

参考节点在 Neo4j 中有不同的含义。

每天使用类别节点(并链接它们并聚合它们以获得更高级别的时间跨度)是对节点进行分类而不是索引属性的更多图形方式。(实际上,这些是图内索引,您可以轻松地将其包含在遍历和图查询中)。

只要您只对不同的时间结构感兴趣,就不必复制节点。如果您的节点也不同(例如更改属性,您可以复制它们,从而有效地创建不同的子图)或在每个节点上创建仅包含更改的历史节点的连接列表(或根据您的要求的完整快照) .

您的域听起来非常适合图形数据库。如果您有更多详细的问题,请随时加入 Neo4j邮件列表

于 2011-05-11T11:43:51.770 回答
5

不是最简单的解决方案(我假设你只使用一台机器),但如果你真的想分离你的图表,你只需要记住一个图表是一个目录。

然后,您可以创建一个动态加载器类,该类采用您想要的数据库路径,将其加载到内存中以进行查询,并在得到答案后关闭它。您还可以配置代理服务器,并将 2 个参数发送到您的加载程序:您的查询(我认为在这种情况下是密码查询)和您要查询的数据库的路径。

如果您有大量的实时查询要回答,这还不够。但如果它只是用于存储和对数据集进行一些分析,它肯定可以满足您的需求。

于 2013-03-13T13:42:44.373 回答
0

这是一个老问题,但从 Neo4j 4.x 开始,支持多租户,您可以在同一个 Neo4j 服务器中拥有不同的数据库(具有不同的 RBAC 权限)。

于 2021-01-18T10:21:24.660 回答