/** * The actual computation. * * @param socialNetwork social network graph * @return summarized, aggregated graph */ private static LogicalGraph execute(LogicalGraph socialNetwork) { return socialNetwork .subgraph( vertex -> vertex.getLabel().equals("Person"), edge -> edge.getLabel().equals("knows")) .groupBy(Arrays.asList("gender", "city")) .aggregate(new VertexCount(), new EdgeCount()); }
LogicalGraph filteredGraph = inputGraph.subgraph(vertexFilter, edgeFilter);
@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 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)); }
/** * 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 testExistingSubgraph() throws Exception { FlinkAsciiGraphLoader loader = getSocialNetworkLoader(); loader.appendToDatabaseFromString("expected[" + "(alice)-[akb]->(bob)-[bkc]->(carol)-[ckd]->(dave)" + "(alice)<-[bka]-(bob)<-[ckb]-(carol)<-[dkc]-(dave)" + "(eve)-[eka]->(alice)" + "(eve)-[ekb]->(bob)" + "(frank)-[fkc]->(carol)" + "(frank)-[fkd]->(dave)" + "]"); LogicalGraph input = loader.getLogicalGraph(); LogicalGraph expected = loader.getLogicalGraphByVariable("expected"); LogicalGraph output = input .subgraph( v -> v.getLabel().equals("Person"), e -> e.getLabel().equals("knows")); collectAndAssertTrue(output.equalsByElementData(expected)); }
socialNetwork.subgraph(v -> v.getLabel().equals("person"), e -> e.getLabel().equals("knows"));
@Test public void testExistingSubgraphWithVerification() throws Exception { FlinkAsciiGraphLoader loader = getSocialNetworkLoader(); loader.appendToDatabaseFromString("expected[" + "(alice)-[akb]->(bob)-[bkc]->(carol)-[ckd]->(dave)" + "(alice)<-[bka]-(bob)<-[ckb]-(carol)<-[dkc]-(dave)" + "(eve)-[eka]->(alice)" + "(eve)-[ekb]->(bob)" + "(frank)-[fkc]->(carol)" + "(frank)-[fkd]->(dave)" + "]"); LogicalGraph input = loader.getLogicalGraph(); LogicalGraph expected = loader.getLogicalGraphByVariable("expected"); LogicalGraph output = input .subgraph( v -> v.getLabel().equals("Person"), e -> e.getLabel().equals("knows"), Subgraph.Strategy.BOTH_VERIFIED); collectAndAssertTrue(output.equalsByElementData(expected)); }
.subgraph( vertex -> vertex.getLabel().toLowerCase().equals(person), edge -> edge.getLabel().toLowerCase().equals(knows))
.subgraph( v -> true, e -> e.getLabel().equals("worksAt"));
@Test public void testWithGraph() throws Exception { FlinkAsciiGraphLoader loader = getSocialNetworkLoader(); loader.appendToDatabaseFromString("expected[" + // gender = 'f' and city = 'leipzig' "(alice)" + // label = 'Tag' "(databases)(graphs)(hadoop)" + "]"); LogicalGraph databaseGraph = loader.getLogicalGraph(); // Filter vertices where // (gender = 'f' AND city = 'Leipzig') OR NOT(label = 'Person' OR label = 'Forum') FilterFunction<Vertex> vertexFilterFunction = new ByProperty<Vertex>("gender", PropertyValue.create("f")) .and(new ByProperty<>("city", PropertyValue.create("Leipzig"))).or( new ByLabel<>("Person").or(new ByLabel<>("Forum")).negate()); // Filter edges where // label <> 'hasInterest' LogicalGraph subgraph = databaseGraph.subgraph(vertexFilterFunction, new ByLabel<Edge>("hasInterest").negate(), Subgraph.Strategy.BOTH); collectAndAssertTrue(subgraph.equalsByElementIds(loader.getLogicalGraphByVariable("expected"))); } }