2011-05-11 24 views
15

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

但现在我需要生成如下统计信息:“2011年1月强度3或更好的双向连接总数是多少”或者(假设每个联系人都是团队的一部分)'哪个团队拥有与其他组的连接数最多“等。

我很快发现用于生成这些统计信息的SQL实际上变得很笨重。

所以我写了一个脚本,对于任何给定的日期,它会在内存中生成一个图形。然后,我可以运行任何我想要的图表。除了生成图表部分之外,更容易理解并且通常还有更高性能。

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

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

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

所以,我可以:在Neo4j的和rertrieve

  • 店多图/与他们单独交流?然后,我会为每个日期创建并存储单独的社交图。

  • ,并从时间戳添加有效的每个边缘和适当过滤图:所以如果我想一个图表,“五一”,我只会遵循两个noeds之间的最新边缘在“5月1日”之前创建(如果所有边都是在5月1日之后创建的,那么这些节点将不会连接)。

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

+1

做了一些阅读后,我想知道如果参考节点是关键?我可以创建一个参考节点为每一天,然后建立当天的图离开它的参考节点... – emh 2011-05-11 02:22:35

+0

您好,我认为使用exntry节点的图形,也许索引它们与一些属性,所以你可以找到它们不仅关闭参考节点,但通过索引查找可以在这里帮助。索引子图条目节点的某些“元数据”属性会为您提供正确的起点吗? – 2011-05-11 11:30:39

回答

14

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

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

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

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

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

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

+0

邮件列表链接已经死了 – keyser 2015-02-12 16:00:15

5

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

然后,您可以创建一个动态加载器类,它将所需数据库的路径加载到内存中以供查询,并在获得答案后关闭它。您也可以配置一个代理服务器,并向您的加载器发送2个参数:您的查询(在这种情况下,我认为这是一个密码查询)以及您要查询的数据库的路径。

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

+2

你能否介绍一下如何在密码查询中动态引用图数据库路径。提前致谢... – 2014-10-20 06:13:04