2020 年 3 月 4 日更新:
如果您使用的是 1.4.1 SNAPSHOT 版本(或更高版本),有一种更简单的方法可以获得所需的结果:只需使用importer.setVertexFactory(id->id);
仅在用户提供(例如工厂)的情况下,才会使用文件中的顶点标识符来调用它。从文件中给出顶点标识符的方法应该返回实际的图顶点。用户返回的顶点直接添加到图中,而不使用顶点提供者。
如果没有提供这样的工厂,则默认行为是从图顶点供应商获取新顶点,并将文件中的原始标识符关联为新顶点的属性。
将其应用到上面的例子中,我们得到:
String input="strict digraph G {\n" +
" <assembly-raw-file>;\n" +
" <dataset-processing>;\n" +
" <feature-processing-1>;\n" +
" <feature-processing-2>;\n" +
" <mh.permute-variables-and-hyper-params>;\n" +
" <mh.finish>;\n" +
" <assembly-raw-file> -> <dataset-processing>;\n" +
" <dataset-processing> -> <feature-processing-1>;\n" +
" <dataset-processing> -> <feature-processing-2>;\n" +
" <dataset-processing> -> <mh.permute-variables-and-hyper-params>;\n" +
" <feature-processing-1> -> <mh.permute-variables-and-hyper-params>;\n" +
" <feature-processing-2> -> <mh.permute-variables-and-hyper-params>;\n" +
" <mh.permute-variables-and-hyper-params> -> <mh.finish>;\n" +
"}";
Graph<String, DefaultEdge> graph = new SimpleDirectedGraph<>(DefaultEdge.class);
DOTImporter<String, DefaultEdge> importer = new DOTImporter<>();
importer.setVertexFactory(id->id);
importer.importGraph(graph, new StringReader(input));
System.out.println(graph);
原答案:
这是一种方法。此方法使用 2 个步骤。第一步,我像您一样阅读了图表。顶点名称可以存储在属性映射中。在第二步中,我创建一个新图,它使用第一个图的结构,但重命名了顶点。
String input="strict digraph G {\n" +
" <assembly-raw-file>;\n" +
" <dataset-processing>;\n" +
" <feature-processing-1>;\n" +
" <feature-processing-2>;\n" +
" <mh.permute-variables-and-hyper-params>;\n" +
" <mh.finish>;\n" +
" <assembly-raw-file> -> <dataset-processing>;\n" +
" <dataset-processing> -> <feature-processing-1>;\n" +
" <dataset-processing> -> <feature-processing-2>;\n" +
" <dataset-processing> -> <mh.permute-variables-and-hyper-params>;\n" +
" <feature-processing-1> -> <mh.permute-variables-and-hyper-params>;\n" +
" <feature-processing-2> -> <mh.permute-variables-and-hyper-params>;\n" +
" <mh.permute-variables-and-hyper-params> -> <mh.finish>;\n" +
"}";
Graph<String, DefaultEdge> graph = new SimpleDirectedGraph<>(SupplierUtil.createStringSupplier(), SupplierUtil.DEFAULT_EDGE_SUPPLIER, false);
//Import the graph; the vertex names are stored as 'ID' in the attribute map
DOTImporter<String, DefaultEdge> importer = new DOTImporter<>();
Map<String, Map<String, Attribute>> attrs = new HashMap<>();
importer.addVertexAttributeConsumer((p, a) -> {
Map<String, Attribute> map = attrs.computeIfAbsent(p.getFirst(), k -> new HashMap<>());
map.put(p.getSecond(), a);
});
importer.importGraph(graph, new StringReader(input));
//Create a new graph, thereby creating String vertices equal to the ID attribute values
Graph<String,DefaultEdge> labeledGraph=new SimpleDirectedGraph<>(DefaultEdge.class);
for(String v : graph.vertexSet())
labeledGraph.addVertex(attrs.get(v).get("ID").getValue());
for(DefaultEdge e : graph.edgeSet()){
String source = graph.getEdgeSource(e);
String target = graph.getEdgeTarget(e);
String sourceID=attrs.get(source).get("ID").getValue();
String targetID=attrs.get(target).get("ID").getValue();
labeledGraph.addEdge(sourceID, targetID);
}
System.out.println(labeledGraph);