Graph 哪种技术最适合存储和查询大型只读图形?
我有一个巨大的有向图:它由160万个节点和3000万条边组成。我希望用户能够找到图形的两个节点之间的所有最短连接(包括传入和传出边)(通过web界面)。目前,我已将图形存储在PostgreSQL数据库中。但是这个解决方案不是非常高效和优雅,我基本上需要将图的所有边存储两次(参见我的问题)Graph 哪种技术最适合存储和查询大型只读图形?,graph,Graph,我有一个巨大的有向图:它由160万个节点和3000万条边组成。我希望用户能够找到图形的两个节点之间的所有最短连接(包括传入和传出边)(通过web界面)。目前,我已将图形存储在PostgreSQL数据库中。但是这个解决方案不是非常高效和优雅,我基本上需要将图的所有边存储两次(参见我的问题) 有人建议我使用像or这样的图形。然而AllegroGraph的免费版本仅限于5000万个节点,并且还有一个非常高级的API(RDF),对于我的问题来说,它似乎太强大和复杂了。另一方面,Neo4j只有一个非常低级
有人建议我使用像or这样的图形。然而AllegroGraph的免费版本仅限于5000万个节点,并且还有一个非常高级的API(RDF),对于我的问题来说,它似乎太强大和复杂了。另一方面,Neo4j只有一个非常低级的API(python接口还不成熟)。这两种方法似乎更适合于节点和边频繁添加或删除到图形中的问题。对于图形上的简单搜索,这些GraphDB似乎太复杂了 我的一个想法是“误用”一个搜索引擎,因为我基本上只是在图表中搜索连接 另一个想法是,使用服务器进程,将整个图形(500MB到1GB)存储在内存中。然后,客户机可以查询服务器进程,并且可以非常快速地遍历图,因为图存储在内存中。使用一些现有的框架编写这样的服务器(最好是Python)是否很容易
您将使用哪种技术来存储和查询如此巨大的只读图形?必须管理一个相当大的图形。了解他们的架构可能会有所启发。请特别注意它们是如何将整个图形缓存在内存中的。我有一个有向图,我(mis)使用了Lucene 每个边都存储为一个文档,节点作为文档的字段,我可以搜索这些字段 它的性能已经足够好了,使用它作为基于web的工具的用户可以接受从节点获取入站和出站链接的查询时间。但是对于计算密集型的批处理计算,我正在做许多100000次的查询,我对得到的查询时间不满意。我感觉到我肯定误用了Lucene,所以我正在研究第二个基于Berkeley DB的实现,这样我就可以对两者进行并排比较。如果我有机会在这里发布结果,我会这样做
但是,我的数据需求比您的数据需求大得多,超过了可用内存的容量。因此,我使用的Lucene索引是在磁盘上的,但对于Lucene,您可以使用“RAMDirectory”索引,在这种情况下,整个内容将存储在内存中,这可能很适合您的需要。如果我错了,请纠正我,但由于每个节点都是链接节点的列表,因此在我看来,具有模式的DB更多的是负担而不是优势。 听起来谷歌应用程序引擎也很适合你:
- 它是为阅读而优化的——如果你想更快的阅读,它还可以使用memcached
- 它是分布式的,因此大小不会影响效率
select from Account where friends traverse (1,7) (address.city.country.name = 'New Zealand')
返回至少一位居住在新西兰的朋友的所有帐户。对于friend,这意味着递归到第7级深度。因此,您有一个图形作为数据,并希望执行一个经典的图形操作。我看不出还有什么技术比图形数据库更适合使用。创造性的解决方案,但边的关系数据库不也可以吗?或者我错过了一些你从使用lucene中获得的免费功能?是的,可能会。我使用Lucene只是因为当时我已经在使用它了,我想要一个独立的、可移植的解决方案,可以完全在我的应用程序(如bdb)的过程中运行。“对于简单的图形搜索,这些GraphDB似乎太复杂了。”我不确定这意味着什么。将图形存储在除图形以外的任何对象中都会带来更大的复杂性。