我有一个应用程序,它将关系信息存储在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日之后创建的,然后这些节点将不会连接).
我是图形数据库的新手,所以任何帮助/指针/提示都将受到赞赏.
现在,您只能在一个Neo4j实例中存储一个图形数据库,但是这一个graphdb可以包含任意数量的不同子图形.您只需要在执行全局操作(如索引查询)时记住这一点,但您可以执行包含带时间戳的属性的复合查询以限制结果.
这样做的一种方法是,正如您所说的那样,将时间信息添加到边缘以表示给定日期的图形结构,然后您可以遍历图形的结构.
参考节点在Neo4j中具有不同的含义.
每天使用类别节点(并链接它们并将它们聚合为更高级别的时间跨度)是分类节点而不是索引属性的更为图形化的方式.(实际上,这些是图形索引,您可以轻松地在遍历和图形查询中包含这些索引).
只要您只对不同的时间结构感兴趣,就不必复制节点.如果您的节点也不同(例如,更改属性,您可以复制它们,从而有效地创建不同的子图),或者在每个节点上创建仅包含更改的历史节点的连接列表(或根据您的要求完整快照) .
您的域听起来非常适合图形数据库.如果您有更多详细的问题,请随时加入Neo4j 邮件列表.
不是最简单的解决方案(我假设您只使用一台机器),但如果您真的想要分离图形,您只需要记住图形是一个目录.
然后,您可以创建一个动态加载器类,该类获取所需数据库的路径,将其加载到内存中以供查询,并在获得答案后将其关闭.您还可以配置代理服务器,并向您的加载器发送2个参数:您的查询(在本例中我假设是一个密码查询)和您要查询的数据库的路径.
如果你有大量的实时查询要回答,这是不够的.但如果仅仅是为了存储和对数据集进行一些分析,它可以明确地满足您的需求.