Java 存储用于最短路径计算的大型图形

Java 存储用于最短路径计算的大型图形,java,mysql,Java,Mysql,我试图以一种寻找最短路径的有效方式,在MySQL数据库中存储一个超过5GB的未加权有向图。 目前,它存储在一个表中,有一个列源和一个共列目标(逗号分隔),但我觉得这不是一个好办法,所以我计划将它转换为一个带顶点的表和一个带边的表 我有两个问题: 存储图形的最佳方式是什么 我应该使用什么最短路径算法 你应该有两张桌子。一个用于节点,一个用于边。在edges表中,您应该有source_node_id和dest_node_id。通过这种方式,您可以轻松地在edges表上进行查询,以获得Dijkstra

我试图以一种寻找最短路径的有效方式,在MySQL数据库中存储一个超过5GB的未加权有向图。 目前,它存储在一个表中,有一个列源和一个共列目标(逗号分隔),但我觉得这不是一个好办法,所以我计划将它转换为一个带顶点的表和一个带边的表

我有两个问题:

  • 存储图形的最佳方式是什么
  • 我应该使用什么最短路径算法

  • 你应该有两张桌子。一个用于节点,一个用于边。在edges表中,您应该有source_node_id和dest_node_id。通过这种方式,您可以轻松地在edges表上进行查询,以获得Dijkstra算法使用的所有传出节点

    有关Dijksra算法的简单说明,请参见:

    另一种存储密集图(稀疏图效率不高)的非常有效的方法是使用邻接矩阵。这里有一个链接解释了这一点-

    现在,要在MySQL数据库中存储矩阵,您必须使用rowid作为行的顶点id(假设您的顶点id为1,2,…)。列可以是普通顶点名称,也可以是顶点ID。可以保留一个将顶点名称映射到ID的表

    您将面临的一个问题是最大列数。如果矩阵太大,可能需要将列拆分为多个表。如果您有一个索引方案/哈希方案可以立即告诉您所需节点的表名,那么您的查询应该相对较快


    对于最短路径,正如其他人提到的,Dijkstra算法是最好的最短路径查找算法

    标准算法是Dijkstra,它是一种适应的BFS。如果从未加权边移动到加权边,对于非负边,Dijkstra算法仍然有效;如果出现负边权重,Bellman Ford是标准算法。呃:你考虑过使用图DB吗?哎哟,祝你好运。我会使用ApacheHama、Giraph或一些GraphDatabase,如Neo4J。使用分区并将图形的片段保留在内存中,以最小化数据库访问