如何坚持番石榴图

Ger*_*see 4 java graph guava

我使用的是common.graph21.0版本的谷歌番石榴.它非常适合我的用例而没有一个方面:持久性.该图似乎只在内存中.图表类没有实现Serializable,在本期帖子中有解释.

Google描述了三种存储拓扑的模型.第三种选择是:

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

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

感谢您的支持!

Jos*_*ain 6

简要回顾一下Guava的common.graph类不是这样的原因Serializable:Java序列化很脆弱,因为它依赖于实现的细节,并且可以随时改变,因此我们不支持它的图形类型.

在短期内,您建议的解决方法可能是您最好的选择,尽管您需要小心存储边缘对象边缘的端点(源和目标),以便您能够将图形重建为你形容.事实上,如果您拥有一个您满意的数据库并且您不需要担心与其他任何人进行互操作,那么从长远来看这也可能对您有用.

正如我在GitHub问题中提到的,另一个选择是将图形保持为某种文件格式.(Guava本身并没有提供这样做的机制,但是一旦我可以获得3.0 ,JUNG就会用于common.graph图表,我还在努力.)请注意大多数图形文件格式(至少是我熟悉的格式) with)对存储节点和边缘元数据的支持相当有限,因此您可能需要自己的文件格式(例如,基于协议缓冲区的内容).


Mar*_*ari 6

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

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

这会产生类似的东西

strict digraph G {
    node_A;
    node_B;
    node_A -> node_B;
}
Run Code Online (Sandbox Code Playgroud)

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

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