我有一个应用程序,它将关系信息存储在MySQL表中(contact_id,other_contact_id,strength,recorded_at)。如果我需要做的只是显示联系人的关系,甚至生成两个联系人的共同联系人列表,这很好。
但现在我需要生成以下统计数据:'2011年1月强度为3或更高的双向连接总数是多少'或(假设每个联系人都是一个群组的一部分)'哪个群组拥有最多与其他组的连接数等。
我很快发现用于生成这些统计数据的SQL变得非常笨拙。
所以我写了一个脚本,对于任何给定的日期,它将在内存中生成一个图形。然后,我可以根据该图表运行我想要的任何统计数据。更容易理解,总的来说,性能更高 - 除了生成图形部分。
我的下一个想法是缓存这些图表,这样我就可以在需要运行新统计数据时调用它们(或生成后面的图表:例如,对于今天的图表,我采用昨天的图表并应用自昨天以来发生的任何更改)。我尝试了memcached,它工作得很好,直到图表增长> 1 MB。
所以现在我正在考虑使用像Neo4J这样的图形数据库。
唯一的问题是,我没有一张图。或者我这样做,但它随着时间的推移而变化,我需要能够以不同的参考时间查询它。
所以,我可以:
或
我是图形数据库的新手,所以任何帮助/指针/提示都会受到赞赏。
答案 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) 中拥有不同的数据库。