Java 8 JGraphT:如何使用JSONImporter导入带标记边的DirectedMultigraph

Java 8 JGraphT:如何使用JSONImporter导入带标记边的DirectedMultigraph,java-8,jgrapht,Java 8,Jgrapht,我已经创建了一个自定义边缘类。我所做的唯一更改是一个无参数构造函数,以便运行下面的导入代码。我已经通过该类成功生成了DirectedMultigraph,现在希望获取导出的JSON并通过该类重新导入它 由于我对如何构建JSONImporter构造函数所需的EdgeProvider的理解有限,因此我在执行此操作和保留边缘标签方面遇到了困难 这是我尝试导入的JSON: { "edges": [ { "id": "{shipmentNumber:12345}", "

我已经创建了一个自定义边缘类。我所做的唯一更改是一个无参数构造函数,以便运行下面的导入代码。我已经通过该类成功生成了DirectedMultigraph,现在希望获取导出的JSON并通过该类重新导入它

由于我对如何构建JSONImporter构造函数所需的EdgeProvider的理解有限,因此我在执行此操作和保留边缘标签方面遇到了困难

这是我尝试导入的JSON:

{
  "edges": [
    {
      "id": "{shipmentNumber:12345}",
      "source": "DEHAM",
      "target": "USNYC"
    }
  ],
  "nodes": [
    {
      "id": "DEHAM"
    },
    {
      "id": "USNYC"
    }
  ],
  "creator": "JGraphT JSON Exporter",
  "version": "1"
}
这是我目前掌握的代码:

Graph<String, RelationshipEdge> graph = new DirectedMultigraph<>(SupplierUtil.createStringSupplier(), SupplierUtil.createSupplier(RelationshipEdge.class), false);

VertexProvider<String> vertexProvider = (label, attributes) -> label;

EdgeProvider<String, RelationshipEdge> edgeProvider =
              (from, to, label, attributes) -> graph.getEdgeSupplier().get();

JSONImporter<String, RelationshipEdge> importer = new JSONImporter<>(vertexProvider, edgeProvider);

importer.importGraph(graph, new StringReader([inputJSON]);
导出以下JSON时缺少标签/id:

{
  "creator": "JGraphT JSON Exporter",
  "version": "1",
  "nodes": [
    {
      "id": "DEHAM"
    },
    {
      "id": "USNYC"
    }
  ],
  "edges": [
    {
      "source": "DEHAM",
      "target": "USNYC"
    }
  ]
}

由于图形使用的是SupplierUtil工厂方法,因此图形导入器在访问/解析json文件、迭代文件中的所有节点/边并为其创建实例时将不使用arg构造函数。为了在导入期间设置节点/边属性,需要向导入器提供适当的顶点/边属性使用者。此外,节点/边缘类需要方法来访问/修改其属性:

JSONImporter<String, RelationshipEdge> importer = new JSONImporter<>(vertexProvider, edgeProvider);
importer.addEdgeAttributeConsumer((edgeField, value) -> {
  // edgeField: Pair<Edge, String> / Edge instance, field name
  // value: instance of org.jgrapht.nio.Attribute / getValue(); getType();
  RelationshipEdge = edgeField.getFirst();
  e.setLabel(value.getValue());  // Note that since you only have one field I am not finding the
                                 // correct setter. I don't like reflection so I would probably
                                 // add a 'setField(name, value)' method to my edge/node implementation.
    });
要持久化图形,想法是相同的。但在这种情况下,您需要添加顶点/边属性Providers,但它们始终返回空贴图:

GraphExporter<String, RelationshipEdge> jsonExporter = new JSONExporter<>();
exporter.setEdgeAttributeProvider(e -> {
            Map<String, Attribute> attribs = new HashMap<>();
            attribs.put("label", new DefaultAttribute<String>(e.getLabel(), AttributeType.STRING));
            return attribs;
        });
GraphExporter<String, RelationshipEdge> jsonExporter = new JSONExporter<>();
exporter.setEdgeAttributeProvider(e -> {
            Map<String, Attribute> attribs = new HashMap<>();
            attribs.put("label", new DefaultAttribute<String>(e.getLabel(), AttributeType.STRING));
            return attribs;
        });