【问题标题】:Ways to persist Guava Graph持久化 Guava Graph 的方法
【发布时间】:2017-04-29 17:14:29
【问题描述】:

我正在使用来自Google Guava in Version 21.0common.graph。它非常适合我的用例,没有一个方面:持久性。该图似乎仅在内存中。图类没有实现Serializable,在这个issue posts 中有解释。

Google 描述了three models to store the topology。第三个选项是:

单独的数据存储库(例如,数据库)存储拓扑

但仅此而已。我没有在包中找到任何方法来应用单独的数据存储库。有没有办法做到这一点?或者是使用nodes()edges()方法获取我的节点的Set和我的边的Set的唯一方法?如果我在此类中实现Serializable 并通过调用addNode(Node)addEdge(Source, Target, Edge)(没有addAll 方法)恢复图形,我可以将它们保存在数据库中。但这似乎是一种解决方法。

感谢您的支持!

【问题讨论】:

    标签: java graph guava


    【解决方案1】:

    简单回顾一下为什么 Guava 的 common.graph 类不是 Serializable 的原因:Java 序列化是脆弱的,因为它取决于实现的细节,并且随时可能改变,所以我们不支持它对于图表类型。

    在短期内,您提出的解决方法可能是您最好的选择,尽管您需要小心地将边缘的端点(源和目标)存储在边缘对象旁边,以便您能够重建你描述的图表。事实上,从长远来看,这也可能对您有用,如果您有一个满意的数据库并且您无需担心与其他任何人的互操作性。

    正如我在GitHub issue 中提到的,另一种选择是将您的图表保存为某种文件格式。 (Guava 本身不提供执行此操作的机制,但 JUNG 将用于 common.graph 图形一旦我可以推出 3.0,我仍在努力。)请注意,大多数图形文件格式(至少我熟悉的)对存储节点和边缘元数据的支持相当有限,因此您可能需要自己的文件格式(例如,基于协议缓冲区的格式)。

    【讨论】:

    • 关于 JUNG 3 的任何更新或关于使用 Guava 持久化图表的建议?
    【解决方案2】:

    我发现存储图表的一种方法是通过DOT format,如下所示:

    public class DOTWriter<INode, IEdge> {
    
        public static String write(final Graph graph) {
            StringBuilder sb = new StringBuilder();
            sb.append("strict digraph G {\n");
    
            for(INode n : graph.nodes()) {
                sb.append("  \"" + n.getId() + "\n");
            }
    
            for(IEdge e : graph.edges()) {
                sb.append("  \"" + e.getSource().getId() + "\" -> \"" + e.getTarget().getId() + "\" " + "\n");
            }
    
            sb.append("}");
            return sb.toString();
        }
    }
    

    这会产生类似的东西

    strict digraph G {
        node_A;
        node_B;
        node_A -> node_B;
    }
    

    阅读此内容并在内存中重新构建图表非常容易。

    如果你的节点是复杂的对象,你应该单独存储它们。

    【讨论】:

      【解决方案3】:

      基于@Maria Ines Parnisari 的惊人回答,我做了一点修改?。然后用美人鱼(markdown插件)画图,在Idea中得到了这样清晰的图(>=2021.2,支持markdown更好)!

      代码

              //noinspection UnstableApiUsage
              MutableGraph<String> graph = GraphBuilder.directed()
                      .allowsSelfLoops(false)
                      .build();
      
              //noinspection UnstableApiUsage
              graph.addNode("root");
              graph.putEdge("root", "s1_1");
              graph.putEdge("root", "s1_2");
              graph.putEdge("root", "s1_3");
              graph.putEdge("s1_2", "s2");
              graph.putEdge("s2", "s3");
              graph.putEdge("s3", "s4");
              graph.putEdge("s3", "s5");
              graph.putEdge("s4", "s6");
              graph.putEdge("s5", "s6");
              graph.putEdge("s1_1", "s6");
              graph.putEdge("s1_1", "s2");
      
              // print mermaid text , then copy it
              StringBuilder sb = new StringBuilder();
              for (EndpointPair<String> edge : graph.edges()) {
                  // shoudle be `-->` to draw with mermaid
                  sb.append(edge.nodeU() + " --> " + edge.nodeV() + "\n");
              }
              System.out.println(sb);
      
      

      sorry As < 10 repution, i can't copy image directly that image will be hidden

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多