/** * Test if the import and creation of a logical graph works correct. In this case * the file do not contain a header row. For this the user set a list with * the column names. * * @throws Exception on failure */ @Test public void testImportLogicalGraphWithoutHeader() throws Exception { String csvPath = MinimalCSVImporterTest.class .getResource("/csv/inputWithoutHeader.csv").getPath(); String gdlPath = MinimalCSVImporterTest.class.getResource("/csv/expected.gdl").getPath(); FlinkAsciiGraphLoader loader = getLoaderFromFile(gdlPath); List<String> columnNames = Arrays.asList("name", "value1", "value2", "value3"); DataSource importVertexImporter = new MinimalCSVImporter(csvPath, DELIMITER, getConfig(), columnNames, false); LogicalGraph resultGraph = importVertexImporter.getLogicalGraph(); LogicalGraph expectedGraph = loader.getLogicalGraphByVariable("expected"); collectAndAssertTrue(expectedGraph.equalsByElementData(resultGraph)); }
/** * Test if an empty line in the csv file will be skipped. * * @throws Exception on failure */ @Test public void testEmptyLines() throws Exception { String csvPath = MinimalCSVImporterTest.class .getResource("/csv/inputEmptyLines.csv").getPath(); String gdlPath = MinimalCSVImporterTest.class.getResource("/csv/expected.gdl").getPath(); FlinkAsciiGraphLoader loader = getLoaderFromFile(gdlPath); DataSource importer = new MinimalCSVImporter(csvPath, DELIMITER, getConfig(), true); LogicalGraph result = importer.getLogicalGraph(); LogicalGraph expected = loader.getLogicalGraphByVariable("expected"); collectAndAssertTrue(expected.equalsByElementData(result)); }
/** * Test if the import and creation of a logical graph works correct. Set the first line * of the file as the column property names. * * @throws Exception on failure */ @Test public void testImportLogicalGraphWithHeader() throws Exception { String csvPath = MinimalCSVImporterTest.class.getResource("/csv/input.csv").getPath(); String gdlPath = MinimalCSVImporterTest.class.getResource("/csv/expected.gdl").getPath(); FlinkAsciiGraphLoader loader = getLoaderFromFile(gdlPath); DataSource importVertexImporter = new MinimalCSVImporter(csvPath, DELIMITER, getConfig(), true); LogicalGraph resultGraph = importVertexImporter.getLogicalGraph(); LogicalGraph expectedGraph = loader.getLogicalGraphByVariable("expected"); collectAndAssertTrue(expectedGraph.equalsByElementData(resultGraph)); }
protected void checkExpectationsEqualResults(FlinkAsciiGraphLoader loader, UnaryCollectionToGraphOperator operator) throws Exception { // overlap GraphCollection col13 = loader.getGraphCollectionByVariables("g1", "g3"); LogicalGraph exp13 = loader.getLogicalGraphByVariable("exp13"); // no overlap GraphCollection col12 = loader.getGraphCollectionByVariables("g1", "g2"); LogicalGraph exp12 = loader.getLogicalGraphByVariable("exp12"); // full overlap GraphCollection col14 = loader.getGraphCollectionByVariables("g1", "g4"); LogicalGraph exp14 = loader.getLogicalGraphByVariable("exp14"); assertTrue("partial overlap failed", operator.execute(col13).equalsByElementData(exp13).collect().get(0)); assertTrue("without overlap failed", operator.execute(col12).equalsByElementData(exp12).collect().get(0)); assertTrue("with full overlap failed", operator.execute(col14).equalsByElementData(exp14).collect().get(0)); } }
@Test public void testVertexInducedSubgraph() throws Exception { FlinkAsciiGraphLoader loader = getSocialNetworkLoader(); loader.appendToDatabaseFromString("expected[" + "(databases)<-[ghtd]-(gdbs)-[ghtg1]->(graphs)" + "(graphs)<-[ghtg2]-(gps)-[ghth]->(hadoop)" + "]"); LogicalGraph input = loader.getLogicalGraph(); LogicalGraph expected = loader.getLogicalGraphByVariable("expected"); LogicalGraph output = input.vertexInducedSubgraph( v -> v.getLabel().equals("Forum") || v.getLabel().equals("Tag")); collectAndAssertTrue(output.equalsByElementData(expected)); }
/** * Extracts a subgraph which is empty. * * @throws Exception */ @Test public void testEmptySubgraph() throws Exception { FlinkAsciiGraphLoader loader = getSocialNetworkLoader(); loader.appendToDatabaseFromString("expected[]"); LogicalGraph input = loader.getLogicalGraph(); LogicalGraph expected = loader.getLogicalGraphByVariable("expected"); LogicalGraph output = input.subgraph( v -> v.getLabel().equals("User"), e -> e.getLabel().equals("friendOf")); collectAndAssertTrue(output.equalsByElementData(expected)); }
@Test public void testEdgeInducedSubgraphProjectFirst() throws Exception { FlinkAsciiGraphLoader loader = getSocialNetworkLoader(); loader.appendToDatabaseFromString("expected[" + "(databases)<-[ghtd]-(gdbs)-[ghtg1]->(graphs)" + "(graphs)<-[ghtg2]-(gps)-[ghth]->(hadoop)" + "]"); LogicalGraph input = loader.getLogicalGraph(); LogicalGraph expected = loader.getLogicalGraphByVariable("expected"); LogicalGraph output = input.subgraph(null, e -> e.getLabel().equals("hasTag"), Subgraph.Strategy.EDGE_INDUCED_PROJECT_FIRST); collectAndAssertTrue(output.equalsByElementData(expected)); }
@Test public void testEdgeInducedSubgraph() throws Exception { FlinkAsciiGraphLoader loader = getSocialNetworkLoader(); loader.appendToDatabaseFromString("expected[" + "(databases)<-[ghtd]-(gdbs)-[ghtg1]->(graphs)" + "(graphs)<-[ghtg2]-(gps)-[ghth]->(hadoop)" + "]"); LogicalGraph input = loader.getLogicalGraph(); LogicalGraph expected = loader.getLogicalGraphByVariable("expected"); LogicalGraph output = input.edgeInducedSubgraph( e -> e.getLabel().equals("hasTag")); collectAndAssertTrue(output.equalsByElementData(expected)); }
/** * Extracts a subgraph where only vertices fulfill the filter function. */ @Test public void testPartialSubgraph() throws Exception { FlinkAsciiGraphLoader loader = getSocialNetworkLoader(); loader.appendToDatabaseFromString("expected[" + "(alice),(bob),(carol),(dave),(eve),(frank)" + "]"); LogicalGraph input = loader.getLogicalGraph(); LogicalGraph expected = loader.getLogicalGraphByVariable("expected"); LogicalGraph output = input .subgraph( v -> v.getLabel().equals("Person"), e -> e.getLabel().equals("friendOf")); collectAndAssertTrue(output.equalsByElementData(expected)); }
/** * Test getting a logical graph by variable from the loader * * @throws Exception on failure */ @Test public void testGetLogicalGraphByVariable() throws Exception { FlinkAsciiGraphLoader loader = getSocialNetworkLoader(); String graphVariable = "g1"; GradoopId graphId = loader.getGraphHeadByVariable(graphVariable).getId(); LogicalGraph graphFromLoader = loader.getLogicalGraphByVariable(graphVariable); LogicalGraph graphFromCollection = loader.getGraphCollection().getGraph(graphId); collectAndAssertTrue(graphFromLoader.equalsByElementData(graphFromCollection)); }
@Test public void testRead() throws Exception { String edgeListFile = getFilePath("/data/edgelist/vertexlabeled/input"); String gdlFile = getFilePath("/data/edgelist/vertexlabeled/expected.gdl"); DataSource dataSource = new VertexLabeledEdgeListDataSource(edgeListFile, " ", "lan", getConfig()); LogicalGraph result = dataSource.getLogicalGraph(); FlinkAsciiGraphLoader loader = getLoaderFromFile(gdlFile); LogicalGraph expected = loader.getLogicalGraphByVariable("expected"); collectAndAssertTrue(expected.equalsByElementData(result)); } }
/** * Test reading a logical graph from csv files with properties * that are supported by csv source and sink * * @throws Exception on failure */ @Test public void testReadExtendedProperties() throws Exception { LogicalGraph expected = getExtendedLogicalGraph(); String csvPath = getFilePath("/data/csv/input_extended_properties"); DataSource dataSource = new CSVDataSource(csvPath, getConfig()); LogicalGraph sourceLogicalGraph = dataSource.getLogicalGraph(); collectAndAssertTrue(sourceLogicalGraph.equalsByElementData(expected)); dataSource.getLogicalGraph().getEdges().collect() .forEach(this::checkProperties); dataSource.getLogicalGraph().getVertices().collect() .forEach(this::checkProperties); } }
@Test public void testRead() throws Exception { String edgeListFile = getFilePath("/data/edgelist/basic/input"); String gdlFile = getFilePath("/data/edgelist/basic/expected.gdl"); DataSource dataSource = new EdgeListDataSource(edgeListFile, ",", getConfig()); LogicalGraph result = dataSource.getLogicalGraph(); FlinkAsciiGraphLoader loader = getLoaderFromFile(gdlFile); LogicalGraph expected = loader.getLogicalGraphByVariable("expected"); collectAndAssertTrue(expected.equalsByElementData(result)); } }
@Test public void minimalHITSTest() throws Exception { String inputString = "input[(v0:A)-[:e]->(v1:B)<-[:e]-(v2:C)]"; // Values are normalized sqrt(0.5) = .7071067811865475d String expectedResultString = "input[" + "(v0:A {aScore: 0.0d, hScore: .7071067811865475d})-[:e]->" + "(v1:B {aScore: 1.0d, hScore: 0.0d})<-[:e]-" + "(v2:C {aScore: 0.0d, hScore: .7071067811865475d})]"; LogicalGraph input = getLoaderFromString(inputString) .getLogicalGraphByVariable("input"); LogicalGraph expectedResult = getLoaderFromString(expectedResultString) .getLogicalGraphByVariable("input"); LogicalGraph result = input.callForGraph(new HITS("aScore", "hScore", 1)); collectAndAssertTrue(result.equalsByElementData(expectedResult)); } }
/** * Test reading a single logical indexed csv graph. * * @throws Exception on failure */ @Test public void testReadSingleGraph() throws Exception { String csvPath = getFilePath("/data/csv/input_indexed"); String gdlPath = getFilePath("/data/csv/expected/expected_graph_collection.gdl"); DataSource dataSource = new IndexedCSVDataSource(csvPath, getConfig()); LogicalGraph input = dataSource.getLogicalGraph(); GraphCollection graphCollection = getLoaderFromFile(gdlPath) .getGraphCollectionByVariables("expected1", "expected2"); LogicalGraph expected = graphCollection.reduce(new ReduceCombination()); collectAndAssertTrue(input.equalsByElementData(expected)); }
/** * Test writing and reading a graph with a existing metadata file instead of aggregating * new metadata from the graph. * * @throws Exception if the execution or IO fails. */ @Test public void testWriteWithExistingMetaData() throws Exception { String tmpPath = temporaryFolder.getRoot().getPath(); String csvPath = getFilePath("/data/csv/input_graph_collection"); String gdlPath = getFilePath("/data/csv/expected/expected_graph_collection.gdl"); LogicalGraph input = getLoaderFromFile(gdlPath).getLogicalGraphByVariable("expected"); DataSink csvDataSink = new CSVDataSink(tmpPath, csvPath + "/metadata.csv", getConfig()); csvDataSink.write(input, true); getExecutionEnvironment().execute(); DataSource csvDataSource = new CSVDataSource(tmpPath, getConfig()); LogicalGraph output = csvDataSource.getLogicalGraph(); collectAndAssertTrue(input.equalsByElementData(output)); }
/** * Test reading from a directory containing multiple parts. * * @throws Exception when the execution in Flink fails. */ @Test public void testReadDir() throws Exception { DataSource dataImport = new MinimalJSONImporter(dirPath, getConfig()); LogicalGraph read = dataImport.getLogicalGraph(); LogicalGraph expected = loader.getLogicalGraph(); GraphCollection expectedCollection = getConfig().getGraphCollectionFactory().fromGraph(expected); collectAndAssertTrue(expected.equalsByElementData(read)); collectAndAssertTrue(dataImport.getGraphCollection() .equalsByGraphElementData(expectedCollection)); }
/** * Test reading a single file. * * @throws Exception when the execution in Flink fails. */ @Test public void testReadFile() throws Exception { DataSource dataImport = new MinimalJSONImporter(filePath, getConfig()); LogicalGraph read = dataImport.getLogicalGraph(); LogicalGraph expected = loader.getLogicalGraphByVariable("expected2"); GraphCollection expectedCollection = getConfig().getGraphCollectionFactory().fromGraph(expected); collectAndAssertTrue(expected.equalsByElementData(read)); collectAndAssertTrue(dataImport.getGraphCollection() .equalsByGraphElementData(expectedCollection)); } }
@Test public void testReadWithLabel() throws Exception { ExecutionEnvironment env = getExecutionEnvironment(); DataSet<ImportVertex<Long>> importVertices = env.fromElements( new ImportVertex<>(0L, "A"), new ImportVertex<>(1L, "B")); DataSet<ImportEdge<Long>> importEdges = env.fromElements( new ImportEdge<>(0L, 0L, 1L, "a")); LogicalGraph expected = getLoaderFromString("expected[(:A)-[:a]->(:B)]") .getLogicalGraphByVariable("expected"); GraphDataSource<Long> dataSource = new GraphDataSource<>( importVertices, importEdges, getConfig()); LogicalGraph output = dataSource.getLogicalGraph(); collectAndAssertTrue(output.equalsByElementData(expected)); }
@Test public void testReadStructureOnly() throws Exception { ExecutionEnvironment env = getExecutionEnvironment(); DataSet<ImportVertex<Long>> importVertices = env.fromElements( new ImportVertex<>(0L), new ImportVertex<>(1L)); DataSet<ImportEdge<Long>> importEdges = env.fromElements( new ImportEdge<>(0L, 0L, 1L)); LogicalGraph expected = getLoaderFromString("expected[()-->()]") .getLogicalGraphByVariable("expected"); GraphDataSource<Long> dataSource = new GraphDataSource<>( importVertices, importEdges, getConfig()); LogicalGraph output = dataSource.getLogicalGraph(); collectAndAssertTrue(output.equalsByElementData(expected)); }