在Neo4J中存储多个图形

16
我有一个应用程序,它在MySQL表中存储关系信息(contact_id、other_contact_id、strength、recorded_at)。如果我只需要显示联系人的关系或生成两个联系人的共同联系人列表,则这很好。但现在我需要生成像“2011年1月强度为3或更高的2向连接的总数”这样的统计数据,或者(假设每个联系人都是某个群组的一部分)“哪个群组与其他群组的连接最多”等等。
我很快发现生成这些统计的SQL变得非常难以管理。因此,我编写了一个脚本,针对任何给定的日期,它将在内存中生成一个图形。然后,我可以运行任何我想要的状态来针对该图形运行。更容易理解,并且通常性能更好-除了生成图形部分外。
我的下一个想法是缓存那些图形,这样我就可以在需要运行新状态(或生成稍后的图形:例如对于今天的图形,我会拿昨天的图形并应用从昨天开始发生的任何更改)时调用它们。我尝试过使用Memcached,直到图形增长> 1 MB。
现在我正在考虑使用像Neo4J这样的图形数据库。唯一的问题是,我不只有一个图形。或者说,虽然只有一个图形,但它是随着时间变化而变化的,并且我需要能够使用不同的参考时间查询它。
那么,我可以:
- 在Neo4J中存储多个图形并单独检索/交互吗?然后,我将为每个日期创建和存储单独的社交图形。 - 或者,在每个边缘上添加有效的时间戳,并相应地过滤图形:因此,如果我想要一个“5月1日”的图形,则只会在“5月1日”之前创建的最新边缘之间遵循两个节点之间的边缘(如果所有边缘都是在5月1日之后创建的,则这些节点将不连接)。
我对图形数据库还比较陌生,因此任何帮助/指针/提示都将不胜感激。

1
经过一些阅读,我想知道参考节点是否是关键?我可以为每一天创建一个参考节点,然后以该节点为基础构建当天的图形... - emh
嗨,我认为在图形中使用入口节点,并可能使用某些属性对它们进行索引,以便您不仅可以通过参考节点而且还可以通过索引查找来找到它们,这可能会有所帮助。将子图入口节点的某些“元数据”属性进行索引是否能够给您提供正确的起始点呢? - Peter Neubauer
3个回答

15

目前你只能在单个Neo4j实例中存储一个图形数据库,但是这个图形数据库可以包含任意多个不同的子图。当进行全局操作(如索引查询)时需要牢记这一点,但是你可以做复合查询,其中包括时间戳属性来限制结果。

一种方法是,就像你所说的,将时间信息添加到边缘以表示给定日期的图形结构,然后可以遍历那时候的图形结构。

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

使用每天的类别节点(并将它们链接起来并聚合到更高级别的时间跨度中)比使用索引属性更适合将节点分类为图形方式。(实际上,这些是图内指标,你可以很容易地在遍历和图形查询中包含它们。)

如果你只对不同的时间结构感兴趣,则无需重复节点。如果你的节点也不同(例如,属性发生变化),则可以将其复制,从而创建不同的子图,或者在每个节点上创建一个历史节点的连接列表,这些历史节点仅包含更改(或完整的快照,具体取决于你的要求)。

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


邮件列表链接已失效。 - keyser

5
不是最简单的解决方案(我假设您只使用一台计算机),但如果您真的想要分离您的图表,您只需要记住一个图表就是一个目录。
然后,您可以创建一个动态加载器类,它接受您想要的数据库路径,在内存中加载查询,并在获取答案后关闭它。您还可以配置代理服务器,并向加载器发送2个参数:您的查询(在这种情况下我假设是cypher查询)和您要查询的数据库路径。
如果您需要回答大量实时查询,则此方法并不适当。但是如果仅用于存储和对数据集进行一些分析,则绝对可以满足您的需求。

2
你能否讲解一下如何在Cypher查询中动态引用图形数据库路径?先行致谢... - KarthikS

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接