在Neo4J中存储多个图形

时间:2011-05-11 00:26:25

标签: graph neo4j graph-databases

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

但现在我需要生成以下统计数据:'2011年1月强度为3或更高的双向连接总数是多少'或(假设每个联系人都是一个群组的一部分)'哪个群组拥有最多与其他组的连接数等。

我很快发现用于生成这些统计数据的SQL变得非常笨拙。

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

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

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

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

所以,我可以:

  • 在Neo4J中存储多个图表并分别与它们进行重新交互/交互?然后我会为每个日期创建和存储单独的社交图。

  • 在每个边缘添加有效的时间戳和有效的过滤图:所以如果我想要一个“5月1日”的图形,我只会跟随在“5月1日”之前创建的两个noeds之间的最新边缘(如果所有边缘都是在5月1日之后创建的,然后这些节点将无法连接。)

我是图形数据库的新手,所以任何帮助/指针/提示都会受到赞赏。

3 个答案:

答案 0 :(得分:15)

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

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

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

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

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

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

答案 1 :(得分:5)

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

然后,您可以创建一个动态加载程序类,该类获取所需数据库的路径,将其加载到内存中以供查询,并在获得答案后将其关闭。您还可以配置代理服务器,并向您的加载器发送2个参数:您的查询(在本例中我认为是一个密码查询)和您要查询的数据库的路径。

如果你有大量的实时查询要回答,这还不够。但如果仅仅是为了存储和对数据集进行一些分析,它可以明确地满足您的需求。

答案 2 :(得分:0)

这是一个老问题,但从 Neo4j 4.x 开始,multi-tenancy is supported 并且您可以在同一个 Neo4j 服务器 (with distinct RBAC permissions) 中拥有不同的数据库。