首页 > 解决方案 > 如何使用CSVImporter和创建顶点供应商

问题描述

我找不到任何有关如何使用 CSVImporter (1.5.0) 的文档。我有一个非常简单的 csv 文件,其中包含我正在尝试使用以下代码导入的整数:

Graph<String, DefaultEdge> wpCategories = new DirectedMultigraph(DefaultEdge.class);
CSVImporter<String, DefaultEdge> importer = new CSVImporter(CSVFormat.EDGE_LIST);
importer.importGraph(wpCategories, new File("hypernymGraphWithEntities_WP1-small.csv"));

我只是得到一个“图表不包含顶点供应商”异常。如何创建顶点供应商?

标签: jgrapht

解决方案


JGraphT 图由顶点和边对象组成。从文本文件中导入图形时,导入器必须以某种方式为它在文本文件中遇到的每个顶点创建顶点对象。这些对象必须与您在图中定义的类型相同。为了生成这些对象,JGraphT 使用顶点供应商。

可以在相应的测试类CSVImporterTest中找到如何使用 CSV 导入器的各种示例。

有两种不同的方法可以使用顶点供应商创建图形。要么使用GraphTypeBuilder,要么使用图形构造函数之一。这是有向图的示例。

//Builder
Graph<String,DefaultEdge> g1 = GraphTypeBuilder.directed().allowingMultipleEdges(false).allowingSelfLoops(false).weighted(false).edgeClass(DefaultEdge.class).vertexSupplier(SupplierUtil.createStringSupplier(1)).buildGraph();

//Constructor
Graph<String,DefaultEdge> g2 = new DefaultDirectedGraph(SupplierUtil.createStringSupplier(1),SupplierUtil.DEFAULT_EDGE_SUPPLIER,false);

因此,应用于您的示例,这将给出:

Graph<String, DefaultEdge> wpCategories = new DirectedMultigraph(SupplierUtil.createStringSupplier(1),SupplierUtil.DEFAULT_EDGE_SUPPLIER,false);
CSVImporter<String, DefaultEdge> importer = new CSVImporter(CSVFormat.EDGE_LIST);
importer.importGraph(wpCategories, new File("hypernymGraphWithEntities_WP1-small.csv"));

请注意,作为顶点供应商的替代方案,您还可以setVertexFactory在类中使用该函数CSVImporter。同样,使用您的代码:

Graph<String, DefaultEdge> wpCategories = new DirectedMultigraph(DefaultEdge.class);
CSVImporter<String, DefaultEdge> importer = new CSVImporter(CSVFormat.EDGE_LIST);
Function<String, String> vertexFactory = x -> x;
importer.setVertexFactory(vertexFactory);
importer.importGraph(wpCategories, new File("hypernymGraphWithEntities_WP1-small.csv"));

免责声明:在没有数据的情况下,上述代码未经测试。


推荐阅读