@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)); }
@Test public void testSameGraph() throws Exception { FlinkAsciiGraphLoader loader = getSocialNetworkLoader(); loader.appendToDatabaseFromString("expected[]"); LogicalGraph g0 = loader.getLogicalGraphByVariable("g0"); LogicalGraph expected = loader.getLogicalGraphByVariable("expected"); assertTrue("exclusion of same graph failed", expected.equalsByElementIds(g0.exclude(g0)).collect().get(0)); }
/** * 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 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)); }
@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)); }
/** * 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 public void testNonOverlappingGraphs() throws Exception { FlinkAsciiGraphLoader loader = getSocialNetworkLoader(); loader.appendToDatabaseFromString("expected[]"); LogicalGraph g0 = loader.getLogicalGraphByVariable("g0"); LogicalGraph g1 = loader.getLogicalGraphByVariable("g1"); LogicalGraph expected = loader.getLogicalGraphByVariable("expected"); assertTrue("overlap non overlapping graphs failed", expected.equalsByElementIds(g0.overlap(g1)).collect().get(0)); assertTrue("overlap switched non overlapping graphs failed", expected.equalsByElementIds(g1.overlap(g0)).collect().get(0)); }
@Test public void testOverlappingGraphs() throws Exception { FlinkAsciiGraphLoader loader = getSocialNetworkLoader(); loader.appendToDatabaseFromString( "expected[(alice)-[akb]->(bob)-[bka]->(alice)]" ); LogicalGraph g0 = loader.getLogicalGraphByVariable("g0"); LogicalGraph g2 = loader.getLogicalGraphByVariable("g2"); LogicalGraph expected = loader.getLogicalGraphByVariable("expected"); assertTrue("combining overlapping graphs failed", expected.equalsByElementIds(g0.overlap(g2)).collect().get(0)); assertTrue("combining switched overlapping graphs failed", expected.equalsByElementIds(g2.overlap(g0)).collect().get(0)); }
@Test public void testGraphElementIdEquality() throws Exception { FlinkAsciiGraphLoader loader = getLoaderFromString(dataGraph); // initialize with data graph LogicalGraph db = loader.getLogicalGraphByVariable(TestData.DATA_GRAPH_VARIABLE); // append the expected result loader.appendToDatabaseFromString(expectedCollection); // execute and validate GraphCollection result = getImplementation(queryGraph, false).execute(db); GraphCollection expected = loader.getGraphCollectionByVariables(expectedGraphVariables); collectAndAssertTrue(result.equalsByGraphElementIds(expected)); }
@Test public void testGraphElementEquality() throws Exception { FlinkAsciiGraphLoader loader = getLoaderFromString(dataGraph); // initialize with data graph LogicalGraph db = loader.getLogicalGraphByVariable(TestData.DATA_GRAPH_VARIABLE); // append the expected result loader.appendToDatabaseFromString(expectedCollection); // execute and validate GraphCollection result = getImplementation(queryGraph, true).execute(db); GraphCollection expected = loader.getGraphCollectionByVariables(expectedGraphVariables); collectAndAssertTrue(result.equalsByGraphElementData(expected)); } }
@Test public void testOverlappingGraphs() throws Exception { FlinkAsciiGraphLoader loader = getSocialNetworkLoader(); loader.appendToDatabaseFromString("" + "expected1[(eve)]" + "expected2[(carol)-[ckd]->(dave)-[dkc]->(carol)]"); LogicalGraph g0 = loader.getLogicalGraphByVariable("g0"); LogicalGraph g2 = loader.getLogicalGraphByVariable("g2"); LogicalGraph expected1 = loader.getLogicalGraphByVariable("expected1"); LogicalGraph expected2 = loader.getLogicalGraphByVariable("expected2"); assertTrue("excluding overlapping graphs failed", expected1.equalsByElementIds(g0.exclude(g2)).collect().get(0)); assertTrue("excluding switched overlapping graphs failed", expected2.equalsByElementIds(g2.exclude(g0)).collect().get(0)); }
@Test public void testEdgeConstructionExtendedPattern() throws Exception { FlinkAsciiGraphLoader loader = getSocialNetworkLoader(); LogicalGraph dbGraph = loader.getLogicalGraph(); loader.appendToDatabaseFromString("expected0[" + "(alice)-[:possible_friend]->(:possible_person)-[:possible_friend]->(carol)" + "]," + "expected1[" + "(bob)-[:possible_friend]->(:possible_person)-[:possible_friend]->(dave)" + "]"); GraphCollection result = dbGraph.query( "MATCH (a:Person)-[:knows]->(b:Person)-[:knows]->(c:Person) " + "WHERE a.city = 'Leipzig' AND a <> c", "(a)-[e_new:possible_friend]->(v_new:possible_person)-[e_new2:possible_friend]->(c)"); GraphCollection expectedCollection = loader .getGraphCollectionByVariables("expected0", "expected1"); collectAndAssertTrue(result.equalsByGraphElementData(expectedCollection)); } }
@Test public void testDerivedOverlappingGraphs() throws Exception { FlinkAsciiGraphLoader loader = getLoaderFromString("g[(a)]"); LogicalGraph baseGraph = loader.getLogicalGraphByVariable("g"); LogicalGraph derivedGraph1 = baseGraph.vertexInducedSubgraph(v -> true); LogicalGraph derivedGraph2 = baseGraph.vertexInducedSubgraph(v -> true); loader.appendToDatabaseFromString("expected[(a)]"); LogicalGraph expected = loader.getLogicalGraphByVariable("expected"); collectAndAssertTrue(derivedGraph1.overlap(derivedGraph2).equalsByElementIds(expected)); }
@Test public void testVariableMappingExists() throws Exception { FlinkAsciiGraphLoader loader = getLoaderFromString(this.dataGraph); // initialize with data graph LogicalGraph db = loader.getLogicalGraphByVariable(TestData.DATA_GRAPH_VARIABLE); // append the expected result loader.appendToDatabaseFromString(expectedCollection); // execute and validate List<GraphHead> graphHeads = getImplementation(queryGraph, false).execute(db). getGraphHeads().collect(); for (GraphHead graphHead : graphHeads) { assertTrue(graphHead.hasProperty(PatternMatching.VARIABLE_MAPPING_KEY)); } }
@Test public void testDerivedNonOverlappingGraphs() throws Exception { FlinkAsciiGraphLoader loader = getLoaderFromString("g[(a {x: true}),(b {x: false})]"); LogicalGraph baseGraph = loader.getLogicalGraphByVariable("g"); LogicalGraph derivedGraph1 = baseGraph.vertexInducedSubgraph(v -> v.getPropertyValue("x").getBoolean()); LogicalGraph derivedGraph2 = baseGraph.vertexInducedSubgraph(v -> !v.getPropertyValue("x").getBoolean()); loader.appendToDatabaseFromString("expected[]"); LogicalGraph expected = loader.getLogicalGraphByVariable("expected"); collectAndAssertTrue(derivedGraph1.overlap(derivedGraph2).equalsByElementIds(expected)); }
@Test public void testDerivedNonOverlappingGraphs() throws Exception { FlinkAsciiGraphLoader loader = getLoaderFromString("g[(a {x: true}), (b {x: false})]"); LogicalGraph baseGraph = loader.getLogicalGraphByVariable("g"); LogicalGraph derivedGraph1 = baseGraph.vertexInducedSubgraph(v -> v.getPropertyValue("x").getBoolean()); LogicalGraph derivedGraph2 = baseGraph.vertexInducedSubgraph(v -> !v.getPropertyValue("x").getBoolean()); loader.appendToDatabaseFromString("expected[(a),(b)]"); LogicalGraph expected = loader.getLogicalGraphByVariable("expected"); collectAndAssertTrue(derivedGraph1.combine(derivedGraph2).equalsByElementIds(expected)); }
@Test public void testDerivedOverlappingGraphs() throws Exception { FlinkAsciiGraphLoader loader = getLoaderFromString("g[(a {x: true, y: true}), (b {x: true, y: false})]"); LogicalGraph baseGraph = loader.getLogicalGraphByVariable("g"); LogicalGraph derivedGraph1 = baseGraph.vertexInducedSubgraph(v -> v.getPropertyValue("x").getBoolean()); LogicalGraph derivedGraph2 = baseGraph.vertexInducedSubgraph(v -> !v.getPropertyValue("y").getBoolean()); loader.appendToDatabaseFromString("expected[(a),(b)]"); LogicalGraph expected = loader.getLogicalGraphByVariable("expected"); collectAndAssertTrue(derivedGraph1.combine(derivedGraph2).equalsByElementIds(expected)); }
@Test public void testDerivedOverlappingGraphs() throws Exception { FlinkAsciiGraphLoader loader = getLoaderFromString("g[(a {x: true, y: true}),(b {x:true, y: false})]"); LogicalGraph baseGraph = loader.getLogicalGraphByVariable("g"); LogicalGraph derivedGraph1 = baseGraph.vertexInducedSubgraph(v -> v.getPropertyValue("x").getBoolean()); LogicalGraph derivedGraph2 = baseGraph.vertexInducedSubgraph(v -> !v.getPropertyValue("y").getBoolean()); loader.appendToDatabaseFromString("expected[(a)]"); LogicalGraph expected = loader.getLogicalGraphByVariable("expected"); collectAndAssertTrue(derivedGraph1.exclude(derivedGraph2).equalsByElementIds(expected)); }
@Test public void testDerivedNonOverlappingGraphs() throws Exception { FlinkAsciiGraphLoader loader = getLoaderFromString("g[(a {x: true}),(b {x: false})]"); LogicalGraph baseGraph = loader.getLogicalGraphByVariable("g"); LogicalGraph derivedGraph1 = baseGraph.vertexInducedSubgraph(v -> v.getPropertyValue("x").getBoolean()); LogicalGraph derivedGraph2 = baseGraph.vertexInducedSubgraph(v -> !v.getPropertyValue("x").getBoolean()); loader.appendToDatabaseFromString("expected[(a)]"); LogicalGraph expected = loader.getLogicalGraphByVariable("expected"); collectAndAssertTrue(derivedGraph1.exclude(derivedGraph2).equalsByElementIds(expected)); }
@Test public void testWithSubsetGraphContainment() throws Exception { FlinkAsciiGraphLoader loader = getSocialNetworkLoader(); loader.appendToDatabaseFromString("g1[(eve)]"); GraphCollection originalCollection = loader.getGraphCollectionByVariables("g1"); DataSet<GraphTransaction> transactions = originalCollection.getGraphTransactions(); GraphCollection restoredCollection = getConfig().getGraphCollectionFactory() .fromTransactions(transactions, new First<>(), new First<>()); collectAndAssertTrue( originalCollection.equalsByGraphIds(restoredCollection)); collectAndAssertTrue( originalCollection.equalsByGraphElementIds(restoredCollection)); collectAndAssertTrue( originalCollection.equalsByGraphData(restoredCollection)); } }