Data structures 操作大型(不适合内存)图形的有效方法

Data structures 操作大型(不适合内存)图形的有效方法,data-structures,graph,neo4j,social-networking,graph-databases,Data Structures,Graph,Neo4j,Social Networking,Graph Databases,我需要维护一个大的有向图G,可能有数百万个节点和边。它可能不适合内存 我需要在此图表上执行的一些常见操作包括: 每个节点/边将具有与之关联的用户定义属性,例如访问计数、权重等 对于每个节点(顶点),我需要根据属性值执行有效的查询。例如,查找X值大于v1但小于v2的节点。这可能需要在某些字段上建立索引 我需要找到给定节点的所有传入边和传出边,并更新边的权重 我需要从给定节点执行本地(基于DFS)遍历,并返回满足某个用户定义谓词的所有路径(该谓词可能使用路径中节点/边的属性值) 我需要高效地添加/删

我需要维护一个大的有向图G,可能有数百万个节点和边。它可能不适合内存

我需要在此图表上执行的一些常见操作包括:

  • 每个节点/边将具有与之关联的用户定义属性,例如访问计数、权重等

  • 对于每个节点(顶点),我需要根据属性值执行有效的查询。例如,查找X值大于v1但小于v2的节点。这可能需要在某些字段上建立索引

  • 我需要找到给定节点的所有传入边和传出边,并更新边的权重

  • 我需要从给定节点执行本地(基于DFS)遍历,并返回满足某个用户定义谓词的所有路径(该谓词可能使用路径中节点/边的属性值)

  • 我需要高效地添加/删除节点/边。但这并不像操作1、2、3那样频繁地执行

  • 图中可能有一些热点,它们比其他部分更容易被访问,我想将这些热点缓存在内存中

    以最少的实施努力实现这一目标的有效方法是什么

    我正在研究一些基于磁盘的图形数据库,例如Neo4j/InfiniteGraph/DEX。尽管它们支持上述所有操作,但这似乎有些过分,因为我不需要它们提供的很多功能,例如一致性/并发控制或基于群集的复制。另外,它们中有很多是基于Java的,我更喜欢有C/C++接口的


    基本上,我只需要一个磁盘上的图形库,它可以有效地处理持久性、节点查询和本地遍历。你对我可以使用的现有(开源)项目有什么建议吗?如果没有,那么实现这样一个功能的最佳方式是什么?

    我看到了一些包含数百万个节点的大型图。我建议你找到一个点,你应该做一个加权压缩。因此,您将使用平均值和权重,将N个节点压缩为N/M个节点。。。。然后重建图形

    您可以选择每隔这么多个节点重新压缩一次。原因是,当一切都变得巨大时,从某种意义上说,你将能够随着时间的推移使其正常化

    你有一个有向图。当你在大型节点上传递更大的数据时,你可以说,如果A>B>(E&D)>H,你可以说:A>H


    它确实允许您根据节点之间的最短跳跃来确定节点之间的公共路由。如果它不在压缩列表中,它至少会指向某个区域,并且可以,这取决于。。。从某种意义上讲,已解压缩。

    使用带有一些您不需要的选项的工具有什么不对?您确实需要的操作也可能在Neo4j之类的设备上更有效。