我需要维护一个大的有向图G,可能有数百万个节点和边。可能它可能不适合记忆。
我需要在此图表上执行的一些常见操作包括:
每个节点/边缘都有与之关联的用户定义属性,例如访问次数,权重等。
对于每个节点(顶点),我需要根据属性值执行高效查询。例如,找到X值大于v1但小于v2的节点。这可能需要在某些字段上构建索引。
我需要查找给定节点的所有传入边和传出边,并更新边的权重。
我需要从给定节点进行本地(基于DFS)遍历,并返回满足某个用户定义谓词的所有路径(此谓词可以使用路径中节点/边的属性值)
我需要有效地添加/删除节点/边缘。但是,这并不像操作1,2,3那样频繁地执行。
图中可能存在一些比其他部分更频繁访问的热点,我想将这些热点缓存在内存中。
以最少的实施努力实现这一目标的有效方法是什么?
我正在研究一些基于磁盘的图形数据库,例如Neo4j / InfiniteGraph / DEX。尽管它们支持上述所有操作,但由于我不需要它们提供的许多功能,例如一致性/并发控制或基于群集的复制,因此它似乎是一种矫枉过正。此外,它们中的很多都基于Java,我更喜欢使用C / C ++接口。
基本上我只需要一个磁盘上的图形库,它可以有效地处理持久性,节点查询和本地遍历。您对我可以使用的现有(开源)项目有什么建议吗?如果没有,实施这样的事情的最佳方式是什么?
答案 0 :(得分:1)
由于您“喜欢使用C / C ++界面”,您可能需要尝试GraphChi。
“通过使用一种新颖的算法从磁盘(SSD或硬盘驱动器)处理图形,GraphChi可以在一台机器上运行非常大的图形计算。”
GraphChi for C ++的源代码和文档可在Google Code project pages获得。
Example Apps包括PageRank,社区检测和连接组件等算法。您可以修改这些以满足您的需求。
答案 1 :(得分:1)
另一个选项可能是e4Graph,这是一个简单的C ++图形持久性库。我自己没试过,但看起来很有希望。
答案 2 :(得分:1)
我见过一些拥有数百万个节点的大型图表。我推荐的是你找到一个点,你应该做加权压缩。因此,您将使用N个节点,使用平均值和权重压缩到N / M节点....然后重建图形。
您可以在自己选择的每个节点之后重新压缩。理由是,一切都变得巨大,从某种意义上说,你将能够随着时间的推移将其标准化。
你有一个有向图。当您在大型节点上传递更大的节目时,您可以说,如果A> B>(E& D)> H,您可以说出类似于:A> H的内容。
它允许您根据节点之间的最短跳转来确定节点之间的公共路由。如果它不在压缩列表中,它至少会朝向某个区域,并且可以依赖...在某种意义上解压缩。
答案 3 :(得分:1)
如果您寻找C ++解决方案,GraphLab可能是一个不错的选择。但它是一种分布式计算解决方案。因为你处理数百万个节点/边缘。这可能是一个很好的选择。本文列出了一些其他图形库: