Coverage Summary for Class: TestTopologyDelete (org.umlg.sqlg.test.topology)

Class Method, % Branch, % Line, %
TestTopologyDelete 100% (42/42) 64.7% (75/116) 99.6% (796/799)
TestTopologyDelete$1 100% (1/1) 100% (4/4)
Total 100% (43/43) 64.7% (75/116) 99.6% (800/803)


 package org.umlg.sqlg.test.topology;
 
 import org.apache.commons.configuration2.builder.fluent.Configurations;
 import org.apache.commons.configuration2.ex.ConfigurationException;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.T;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.junit.*;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameter;
 import org.umlg.sqlg.structure.PropertyDefinition;
 import org.umlg.sqlg.structure.PropertyType;
 import org.umlg.sqlg.structure.SqlgGraph;
 import org.umlg.sqlg.structure.TopologyChangeAction;
 import org.umlg.sqlg.structure.topology.*;
 import org.umlg.sqlg.test.BaseTest;
 import org.umlg.sqlg.test.topology.TestTopologyChangeListener.TopologyListenerTest;
 
 import java.net.URL;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.*;
 
 import static org.junit.Assert.*;
 import static org.umlg.sqlg.structure.topology.Topology.*;
 
 /**
  * Test the deletion of topology items
  *
  * @author jpmoresmau
  */
 @RunWith(Parameterized.class)
 public class TestTopologyDelete extends BaseTest {
 
     @Parameter
     public String schema;
     @Parameter(1)
     public boolean preserve;
     @Parameter(2)
     public boolean rollback;
 
     @Parameterized.Parameters(name = "{index}: schema:{0}, preserve:{1}, rollback:{2}")
     public static Collection<Object[]> data() {
         List<Object[]> l = new ArrayList<>();
         String[] schemas = new String[]{null, "MySchema"};
         boolean[] preserve = new boolean[]{true, false};
         boolean[] rollback = new boolean[]{true, false};
 //        String[] schemas = new String[]{null};
 //        boolean[] preserve = new boolean[]{true};
 //        boolean[] rollback = new boolean[]{false};
         for (String s : schemas) {
             for (boolean p : preserve) {
                 for (boolean r : rollback) {
                     l.add(new Object[]{s, p, r});
                 }
             }
         }
         return l;
     }
 
     @SuppressWarnings("Duplicates")
     @BeforeClass
     public static void beforeClass() {
         URL sqlProperties = Thread.currentThread().getContextClassLoader().getResource("sqlg.properties");
         try {
             Configurations configs = new Configurations();
             configuration = configs.properties(sqlProperties);
             Assume.assumeTrue(isPostgres());
             configuration.addProperty(SqlgGraph.DISTRIBUTED, true);
             if (!configuration.containsKey(SqlgGraph.JDBC_URL))
                 throw new IllegalArgumentException(String.format("SqlGraph configuration requires that the %s be set", SqlgGraph.JDBC_URL));
 
         } catch (ConfigurationException e) {
             throw new IllegalStateException(e);
         }
     }
 
 
     @Before
     public void buildLoops() {
         if (schema == null) {
             schema = this.sqlgGraph.getSqlDialect().getPublicSchema();
         }
     }
 
     @Test
     public void testDeleteSchema() throws Exception {
         // we assume public schema is never deleted
         if (schema.equals(this.sqlgGraph.getSqlDialect().getPublicSchema())) {
             return;
         }
         try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
             String A = getLabel(schema, "A");
             String B = getLabel(schema, "B");
             Vertex a = this.sqlgGraph.addVertex(T.label, A, "name", "A");
             Vertex b = this.sqlgGraph.addVertex(T.label, B, "name", "B");
             a.addEdge("E", b, "attr", "value");
 
             VertexLabel lbl = this.sqlgGraph.getTopology().getVertexLabel(schema, "A").orElseThrow(IllegalStateException::new);
             lbl.ensureIndexExists(IndexType.UNIQUE, Collections.singletonList(lbl.getProperty("name").orElseThrow(IllegalStateException::new)));
 
             EdgeLabel elbl = lbl.getOutEdgeLabels().values().iterator().next();
             elbl.ensureIndexExists(IndexType.UNIQUE, Collections.singletonList(elbl.getProperty("attr").orElseThrow(IllegalStateException::new)));
 
 
             testSchemaBeforeDeletion(this.sqlgGraph, schema);
             this.sqlgGraph.tx().commit();
             testSchemaBeforeDeletion(this.sqlgGraph, schema);
             Thread.sleep(1_000);
             testSchemaBeforeDeletion(sqlgGraph1, schema);
             sqlgGraph1.tx().rollback();
 
             TopologyListenerTest tlt = new TopologyListenerTest();
             this.sqlgGraph.getTopology().registerListener(tlt);
 
             Schema sch = this.sqlgGraph.getTopology().getSchema(schema).orElseThrow(IllegalStateException::new);
             sch.remove(preserve);
             assertTrue(tlt.receivedEvent(sch, TopologyChangeAction.DELETE));
 
             testSchemaAfterDeletion(this.sqlgGraph, schema, preserve);
 
             if (rollback) {
                 this.sqlgGraph.tx().rollback();
                 testSchemaBeforeDeletion(this.sqlgGraph, schema);
 
             } else {
                 TopologyListenerTest tlt1 = new TopologyListenerTest();
                 sqlgGraph1.getTopology().registerListener(tlt1);
 
                 this.sqlgGraph.tx().commit();
                 testSchemaAfterDeletion(this.sqlgGraph, schema, preserve);
                 Thread.sleep(1_000);
                 assertTrue(tlt1.receivedEvent(sch, TopologyChangeAction.DELETE));
                 testSchemaAfterDeletion(sqlgGraph1, schema, preserve);
             }
         }
     }
 
     @Test
     public void testDeleteSchemaWithOtherEdges() throws Exception {
         // we assume public schema is never deleted
         if (schema.equals(this.sqlgGraph.getSqlDialect().getPublicSchema())) {
             return;
         }
         try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
             String otherSchema = "otherSchema";
             String A = getLabel(otherSchema, "A");
             String B = getLabel(schema, "B");
             Vertex a = this.sqlgGraph.addVertex(T.label, A, "name", "A");
             Vertex b = this.sqlgGraph.addVertex(T.label, B, "name", "B");
             a.addEdge("E", b, "attr", "value");
             testSchemaWithOtherEdges(this.sqlgGraph, schema, otherSchema);
 
             this.sqlgGraph.tx().commit();
             testSchemaWithOtherEdges(this.sqlgGraph, schema, otherSchema);
             Thread.sleep(1_000);
             testSchemaWithOtherEdges(sqlgGraph1, schema, otherSchema);
             sqlgGraph1.tx().rollback();
 
             Schema sch = this.sqlgGraph.getTopology().getSchema(schema).orElseThrow(IllegalStateException::new);
             sch.remove(preserve);
 
             testSchemaWithOtherEdgesAfterDeletion(sqlgGraph, schema, otherSchema);
 
             if (rollback) {
                 this.sqlgGraph.tx().rollback();
                 testSchemaWithOtherEdges(this.sqlgGraph, schema, otherSchema);
             } else {
                 this.sqlgGraph.tx().commit();
                 testSchemaWithOtherEdgesAfterDeletion(sqlgGraph, schema, otherSchema);
                 Thread.sleep(1_000);
                 testSchemaWithOtherEdgesAfterDeletion(sqlgGraph1, schema, otherSchema);
             }
         }
     }
 
     @Test
     public void testDeleteVertexProperty() throws Exception {
         try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
             String fullLabel = getLabel(schema, "A");
             Vertex a1 = this.sqlgGraph.addVertex(T.label, fullLabel, "name", "A", "p1", "val1", "p2", "val2");
 
             assertNotNull(a1.property("p1").value());
             assertNotNull(a1.property("p2").value());
             checkPropertyExistenceBeforeDeletion(schema);
             this.sqlgGraph.tx().commit();
 
             Object aid = a1.id();
 
             checkPropertyExistenceBeforeDeletion(schema);
             a1 = this.sqlgGraph.traversal().V(aid).next();
             assertNotNull(a1.property("p1").value());
             assertNotNull(a1.property("p2").value());
 
             TopologyListenerTest tlt = new TopologyListenerTest();
             this.sqlgGraph.getTopology().registerListener(tlt);
 
             VertexLabel lbl = this.sqlgGraph.getTopology().getVertexLabel(schema, "A").orElseThrow(IllegalStateException::new);
             PropertyColumn p1 = lbl.getProperty("p1").orElseThrow(IllegalStateException::new);
             p1.remove(false);
             PropertyColumn p2 = lbl.getProperty("p2").orElseThrow(IllegalStateException::new);
             p2.remove(true);
 
             assertTrue(tlt.receivedEvent(p1, TopologyChangeAction.DELETE));
             assertTrue(tlt.receivedEvent(p2, TopologyChangeAction.DELETE));
 
             checkPropertyExistenceAfterDeletion(this.sqlgGraph, schema);
             /* doesn't work because the topology allTableCache is only updated after commit
             a1=this.sqlgGraph.traversal().V(aid).next();
 			assertFalse(a1.property("p1").isPresent());
 			assertFalse(a1.property("p2").isPresent());
 			*/
             if (rollback) {
                 this.sqlgGraph.tx().rollback();
                 checkPropertyExistenceBeforeDeletion(schema);
             } else {
                 TopologyListenerTest tlt1 = new TopologyListenerTest();
                 sqlgGraph1.getTopology().registerListener(tlt1);
                 this.sqlgGraph.tx().commit();
                 checkPropertyExistenceAfterDeletion(this.sqlgGraph, schema);
 
                 a1 = this.sqlgGraph.traversal().V(aid).next();
                 assertFalse(a1.property("p1").isPresent());
                 assertFalse(a1.property("p2").isPresent());
 
                 Thread.sleep(1_000);
                 checkPropertyExistenceAfterDeletion(sqlgGraph1, schema);
                 assertTrue(tlt1.receivedEvent(p1, TopologyChangeAction.DELETE));
                 assertTrue(tlt1.receivedEvent(p2, TopologyChangeAction.DELETE));
             }
         }
     }
 
     @Test
     public void testDeleteVertexPropertyWithIndex() throws Exception {
         try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
             String fullLabel = getLabel(schema, "A");
             Schema _schema;
             if (!schema.equals(sqlgGraph1.getTopology().getPublicSchema().getName())) {
                 _schema = sqlgGraph.getTopology().ensureSchemaExist(schema);
             } else {
                 _schema = sqlgGraph.getTopology().getPublicSchema();
             }
             VertexLabel vertexLabel = _schema.ensureVertexLabelExist("A", new HashMap<>() {{
                 put("name", PropertyDefinition.of(PropertyType.STRING));
                 put("p1", PropertyDefinition.of(PropertyType.STRING));
                 put("p2", PropertyDefinition.of(PropertyType.STRING));
             }});
             Optional<PropertyColumn> propertyColumnOptional = vertexLabel.getProperty("p1");
             Assert.assertTrue(propertyColumnOptional.isPresent());
             Index i1 = vertexLabel.ensureIndexExists(IndexType.UNIQUE, List.of(propertyColumnOptional.get()));
 
             Vertex a1 = this.sqlgGraph.addVertex(T.label, fullLabel, "name", "A", "p1", "val1", "p2", "val2");
 
             assertNotNull(a1.property("p1").value());
             assertNotNull(a1.property("p2").value());
             checkPropertyExistenceBeforeDeletion(schema, i1);
             this.sqlgGraph.tx().commit();
 
             Object aid = a1.id();
 
             checkPropertyExistenceBeforeDeletion(schema, i1);
             a1 = this.sqlgGraph.traversal().V(aid).next();
             assertNotNull(a1.property("p1").value());
             assertNotNull(a1.property("p2").value());
 
             TopologyListenerTest tlt = new TopologyListenerTest();
             this.sqlgGraph.getTopology().registerListener(tlt);
 
             VertexLabel lbl = this.sqlgGraph.getTopology().getVertexLabel(schema, "A").orElseThrow(IllegalStateException::new);
             PropertyColumn p1 = lbl.getProperty("p1").orElseThrow(IllegalStateException::new);
             p1.remove(false);
             PropertyColumn p2 = lbl.getProperty("p2").orElseThrow(IllegalStateException::new);
             p2.remove(true);
 
             assertTrue(tlt.receivedEvent(p1, TopologyChangeAction.DELETE));
             assertTrue(tlt.receivedEvent(p2, TopologyChangeAction.DELETE));
 
             checkPropertyExistenceAfterDeletion(this.sqlgGraph, schema, i1);
             /* doesn't work because the topology allTableCache is only updated after commit
             a1=this.sqlgGraph.traversal().V(aid).next();
 			assertFalse(a1.property("p1").isPresent());
 			assertFalse(a1.property("p2").isPresent());
 			*/
             if (rollback) {
                 this.sqlgGraph.tx().rollback();
                 checkPropertyExistenceBeforeDeletion(schema, i1);
             } else {
                 TopologyListenerTest tlt1 = new TopologyListenerTest();
                 sqlgGraph1.getTopology().registerListener(tlt1);
                 this.sqlgGraph.tx().commit();
                 checkPropertyExistenceAfterDeletion(this.sqlgGraph, schema, i1);
 
                 a1 = this.sqlgGraph.traversal().V(aid).next();
                 assertFalse(a1.property("p1").isPresent());
                 assertFalse(a1.property("p2").isPresent());
 
                 Thread.sleep(1_000);
                 checkPropertyExistenceAfterDeletion(sqlgGraph1, schema, i1);
                 assertTrue(tlt1.receivedEvent(p1, TopologyChangeAction.DELETE));
                 assertTrue(tlt1.receivedEvent(p2, TopologyChangeAction.DELETE));
             }
         }
     }
 
 
     @Test
     public void testDeleteEdgeProperty() throws Exception {
         try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
             String fullLabelA = getLabel(schema, "A");
             String fullLabelB = getLabel(schema, "B");
             Vertex a1 = this.sqlgGraph.addVertex(T.label, fullLabelA, "name", "A");
             Vertex b1 = this.sqlgGraph.addVertex(T.label, fullLabelB, "name", "B");
             Edge e1 = a1.addEdge("E", b1, "p1", "val1", "p2", "val2");
 
             assertNotNull(e1.property("p1").value());
             assertNotNull(e1.property("p2").value());
             checkEdgePropertyExistenceBeforeDeletion(schema);
             sqlgGraph.tx().commit();
             Object eid = e1.id();
             checkEdgePropertyExistenceBeforeDeletion(schema);
             e1 = this.sqlgGraph.traversal().E(eid).next();
             assertNotNull(e1.property("p1").value());
             assertNotNull(e1.property("p2").value());
 
             TopologyListenerTest tlt = new TopologyListenerTest();
             this.sqlgGraph.getTopology().registerListener(tlt);
 
             EdgeLabel lbl = this.sqlgGraph.getTopology().getEdgeLabel(schema, "E").orElseThrow(IllegalStateException::new);
             PropertyColumn p1 = lbl.getProperty("p1").orElseThrow(IllegalStateException::new);
             p1.remove(false);
             PropertyColumn p2 = lbl.getProperty("p2").orElseThrow(IllegalStateException::new);
             p2.remove(true);
 
             assertTrue(tlt.receivedEvent(p1, TopologyChangeAction.DELETE));
             assertTrue(tlt.receivedEvent(p2, TopologyChangeAction.DELETE));
 
             checkEdgePropertyExistenceAfterDeletion(this.sqlgGraph, schema);
 			/* doesn't work because the topology allTableCache is only updated after commit
 			a1=this.sqlgGraph.traversal().V(aid).next();
 			assertFalse(a1.property("p1").isPresent());
 			assertFalse(a1.property("p2").isPresent());
 			*/
             if (rollback) {
                 this.sqlgGraph.tx().rollback();
                 checkEdgePropertyExistenceBeforeDeletion(schema);
             } else {
                 TopologyListenerTest tlt1 = new TopologyListenerTest();
                 sqlgGraph1.getTopology().registerListener(tlt1);
                 this.sqlgGraph.tx().commit();
                 checkEdgePropertyExistenceAfterDeletion(this.sqlgGraph, schema);
 
 
                 e1 = this.sqlgGraph.traversal().E(eid).next();
                 assertFalse(e1.property("p1").isPresent());
                 assertFalse(e1.property("p2").isPresent());
 
                 Thread.sleep(1_000);
                 checkEdgePropertyExistenceAfterDeletion(sqlgGraph1, schema);
                 assertTrue(tlt1.receivedEvent(p1, TopologyChangeAction.DELETE));
                 assertTrue(tlt1.receivedEvent(p2, TopologyChangeAction.DELETE));
             }
         }
     }
 
     @Test
     public void testDeleteVertexIndex() throws Exception {
         try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
             String fullLabel = getLabel(schema, "A");
             this.sqlgGraph.addVertex(T.label, fullLabel, "name", "A", "p1", "val1", "p2", "val2");
             VertexLabel lbl = this.sqlgGraph.getTopology().getVertexLabel(schema, "A").orElseThrow(IllegalStateException::new);
 
             Index i1 = lbl.ensureIndexExists(IndexType.UNIQUE, Collections.singletonList(lbl.getProperty("p1").orElseThrow(IllegalStateException::new)));
             Index i2 = lbl.ensureIndexExists(IndexType.UNIQUE, Collections.singletonList(lbl.getProperty("p2").orElseThrow(IllegalStateException::new)));
 
 
             checkIndexExistenceBeforeDeletion(schema, i1, i2);
             this.sqlgGraph.tx().commit();
 
             checkIndexExistenceBeforeDeletion(schema, i1, i2);
 
             TopologyListenerTest tlt = new TopologyListenerTest();
             this.sqlgGraph.getTopology().registerListener(tlt);
 
             i1.remove(false);
             i2.remove(true);
 
             assertTrue(tlt.receivedEvent(i1, TopologyChangeAction.DELETE));
             assertTrue(tlt.receivedEvent(i2, TopologyChangeAction.DELETE));
 
             checkIndexExistenceAfterDeletion(this.sqlgGraph, schema, i1, i2);
 
             if (rollback) {
                 this.sqlgGraph.tx().rollback();
                 checkIndexExistenceBeforeDeletion(schema, i1, i2);
             } else {
                 TopologyListenerTest tlt1 = new TopologyListenerTest();
                 sqlgGraph1.getTopology().registerListener(tlt1);
 
                 this.sqlgGraph.tx().commit();
                 checkIndexExistenceAfterDeletion(this.sqlgGraph, schema, i1, i2);
 
 
                 Thread.sleep(5_000);
                 checkIndexExistenceAfterDeletion(sqlgGraph1, schema, i1, i2);
                 assertTrue(tlt1.receivedEvent(i1, TopologyChangeAction.DELETE));
                 assertTrue(tlt1.receivedEvent(i2, TopologyChangeAction.DELETE));
             }
         }
     }
 
     @Test
     public void testDeleteEdgeIndex() throws Exception {
         try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
             String fullLabelA = getLabel(schema, "A");
             String fullLabelB = getLabel(schema, "B");
             Vertex a1 = this.sqlgGraph.addVertex(T.label, fullLabelA, "name", "A");
             Vertex b1 = this.sqlgGraph.addVertex(T.label, fullLabelB, "name", "B");
             a1.addEdge("E", b1, "p1", "val1", "p2", "val2");
 
             EdgeLabel lbl = this.sqlgGraph.getTopology().getEdgeLabel(schema, "E").orElseThrow(IllegalStateException::new);
             Index i1 = lbl.ensureIndexExists(IndexType.UNIQUE, Collections.singletonList(lbl.getProperty("p1").orElseThrow(IllegalStateException::new)));
             Index i2 = lbl.ensureIndexExists(IndexType.UNIQUE, Collections.singletonList(lbl.getProperty("p2").orElseThrow(IllegalStateException::new)));
 
 
             checkEdgeIndexExistenceBeforeDeletion(schema, i1, i2);
             this.sqlgGraph.tx().commit();
 
             checkEdgeIndexExistenceBeforeDeletion(schema, i1, i2);
 
             TopologyListenerTest tlt = new TopologyListenerTest();
             this.sqlgGraph.getTopology().registerListener(tlt);
 
             i1.remove(false);
             i2.remove(true);
 
             assertTrue(tlt.receivedEvent(i1, TopologyChangeAction.DELETE));
             assertTrue(tlt.receivedEvent(i2, TopologyChangeAction.DELETE));
 
             checkEdgeIndexExistenceAfterDeletion(this.sqlgGraph, schema, i1, i2);
             if (rollback) {
                 this.sqlgGraph.tx().rollback();
                 checkEdgeIndexExistenceBeforeDeletion(schema, i1, i2);
             } else {
 
                 TopologyListenerTest tlt1 = new TopologyListenerTest();
                 sqlgGraph1.getTopology().registerListener(tlt1);
 
                 this.sqlgGraph.tx().commit();
                 checkEdgeIndexExistenceAfterDeletion(this.sqlgGraph, schema, i1, i2);
 
                 Thread.sleep(1_000);
                 checkEdgeIndexExistenceAfterDeletion(sqlgGraph1, schema, i1, i2);
                 assertTrue(tlt1.receivedEvent(i1, TopologyChangeAction.DELETE));
                 assertTrue(tlt1.receivedEvent(i2, TopologyChangeAction.DELETE));
             }
         }
     }
 
     @Test
     public void testDeleteEdgeLabel() throws Exception {
         try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
             String fullLabelA = getLabel(schema, "A");
             String fullLabelB = getLabel(schema, "B");
             Vertex a1 = this.sqlgGraph.addVertex(T.label, fullLabelA, "name", "A");
             Vertex b1 = this.sqlgGraph.addVertex(T.label, fullLabelB, "name", "B1");
             Vertex b2 = this.sqlgGraph.addVertex(T.label, fullLabelB, "name", "B2");
             a1.addEdge("E1", b1);
             a1.addEdge("E2", b2);
 
 
             checkEdgeExistenceBeforeDeletion(this.sqlgGraph, schema);
             this.sqlgGraph.tx().commit();
 
             checkEdgeExistenceBeforeDeletion(this.sqlgGraph, schema);
             Thread.sleep(1_000);
             checkEdgeExistenceBeforeDeletion(this.sqlgGraph1, schema);
 
             TopologyListenerTest tlt = new TopologyListenerTest();
             this.sqlgGraph.getTopology().registerListener(tlt);
 
             EdgeLabel e1 = this.sqlgGraph.getTopology().getEdgeLabel(schema, "E1").orElseThrow(IllegalStateException::new);
             EdgeLabel e2 = this.sqlgGraph.getTopology().getEdgeLabel(schema, "E2").orElseThrow(IllegalStateException::new);
 
             e1.remove(false);
             e2.remove(true);
 
             assertTrue(tlt.receivedEvent(e1, TopologyChangeAction.DELETE));
             assertTrue(tlt.receivedEvent(e2, TopologyChangeAction.DELETE));
 
             checkEdgeExistenceAfterDeletion(this.sqlgGraph, schema);
 
             if (rollback) {
                 this.sqlgGraph.tx().rollback();
                 checkEdgeExistenceBeforeDeletion(this.sqlgGraph, schema);
             } else {
 
                 TopologyListenerTest tlt1 = new TopologyListenerTest();
                 sqlgGraph1.getTopology().registerListener(tlt1);
                 this.sqlgGraph.tx().commit();
                 checkEdgeExistenceAfterDeletion(this.sqlgGraph, schema);
 
 
                 Thread.sleep(1_000);
                 checkEdgeExistenceAfterDeletion(sqlgGraph1, schema);
                 assertTrue(tlt1.receivedEvent(e1, TopologyChangeAction.DELETE));
                 assertTrue(tlt1.receivedEvent(e2, TopologyChangeAction.DELETE));
             }
         }
     }
 
     @Test
     public void testDeleteEdgeRoleOut() throws Exception {
         testDeleteEdgeRole(schema, "MySchema2");
     }
 
     @Test
     public void testDeleteEdgeRoleIn() throws Exception {
         testDeleteEdgeRole("MySchema2", schema);
     }
 
     @Test
     public void testDeleteVertexLabel() throws Exception {
         try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
             String A = getLabel(schema, "A");
             String B = getLabel(schema, "B");
             String C = getLabel(schema, "C");
             String D = getLabel(schema, "D");
             Vertex a = this.sqlgGraph.addVertex(T.label, A, "name", "A");
             Vertex b = this.sqlgGraph.addVertex(T.label, B, "name", "B");
             Vertex c = this.sqlgGraph.addVertex(T.label, C, "name", "C", "p1", "v1");
             Vertex d = this.sqlgGraph.addVertex(T.label, D, "name", "D", "p1", "v1");
             a.addEdge("E", b);
             b.addEdge("E", c);
             c.addEdge("E", d);
             b.addEdge("E1", c);
             c.addEdge("E2", d);
 
             //checkVertexLabelBeforeDeletion(sqlgGraph,schema);
             this.sqlgGraph.tx().commit();
             checkVertexLabelBeforeDeletion(sqlgGraph, schema);
             Thread.sleep(1_000);
             checkVertexLabelBeforeDeletion(sqlgGraph1, schema);
 
             checkCount(sqlgGraph.traversal().V().hasLabel(C), 1);
             checkCount(sqlgGraph1.traversal().V().hasLabel(C), 1);
             // clear locks on the tables we're going to modify
             sqlgGraph.tx().rollback();
             sqlgGraph1.tx().rollback();
 
 
             TopologyListenerTest tlt = new TopologyListenerTest();
             this.sqlgGraph.getTopology().registerListener(tlt);
 
             Optional<EdgeLabel> oelbl1 = this.sqlgGraph.getTopology().getEdgeLabel(schema, "E1");
             assertTrue(oelbl1.isPresent());
             Optional<EdgeLabel> oelbl2 = this.sqlgGraph.getTopology().getEdgeLabel(schema, "E2");
             assertTrue(oelbl2.isPresent());
 
             VertexLabel lblc = this.sqlgGraph.getTopology().getVertexLabel(schema, "C").orElseThrow(IllegalStateException::new);
             lblc.remove(this.preserve);
             assertTrue(tlt.receivedEvent(lblc, TopologyChangeAction.DELETE));
 
             assertTrue(tlt.receivedEvent(oelbl1.get(), TopologyChangeAction.DELETE));
             assertTrue(tlt.receivedEvent(oelbl2.get(), TopologyChangeAction.DELETE));
 
             assertFalse(this.sqlgGraph.getTopology().getAllTables().containsKey(lblc.getName()));
             assertFalse(this.sqlgGraph.getTopology().getAllTables().containsKey(oelbl1.orElseThrow(IllegalStateException::new).getName()));
             assertFalse(this.sqlgGraph.getTopology().getAllTables().containsKey(oelbl2.orElseThrow(IllegalStateException::new).getName()));
 
 
             checkCount(sqlgGraph.traversal().V().hasLabel(C), 0);
 
 			/*VertexLabel lbld=this.sqlgGraph.getTopology().getVertexLabel(schema, "D").get();
 			lbld.remove(true);
 			assertTrue(tlt.receivedEvent(lbld, TopologyChangeAction.DELETE));
 			*/
             if (rollback) {
                 sqlgGraph.tx().rollback();
                 checkVertexLabelBeforeDeletion(sqlgGraph, schema);
 
                 checkCount(sqlgGraph.traversal().V().hasLabel(C), 1);
 
             } else {
                 //checkVertexLabelAfterDeletion(sqlgGraph,schema);
                 TopologyListenerTest tlt1 = new TopologyListenerTest();
                 sqlgGraph1.getTopology().registerListener(tlt1);
 
                 oelbl1 = sqlgGraph1.getTopology().getEdgeLabel(schema, "E1");
                 assertTrue(oelbl1.isPresent());
                 oelbl2 = sqlgGraph1.getTopology().getEdgeLabel(schema, "E2");
                 assertTrue(oelbl2.isPresent());
 
                 lblc = sqlgGraph1.getTopology().getVertexLabel(schema, "C").orElseThrow(IllegalStateException::new);
 
 
                 sqlgGraph.tx().commit();
                 checkVertexLabelAfterDeletion(sqlgGraph, schema);
                 checkCount(sqlgGraph.traversal().V().hasLabel(C), 0);
 
 
                 Thread.sleep(1_000);
                 checkVertexLabelAfterDeletion(sqlgGraph1, schema);
                 checkCount(sqlgGraph1.traversal().V().hasLabel(C), 0);
 
 
                 assertTrue(tlt1.receivedEvent(lblc, TopologyChangeAction.DELETE));
 
                 assertTrue(tlt1.receivedEvent(oelbl1.get(), TopologyChangeAction.DELETE));
                 assertTrue(tlt1.receivedEvent(oelbl2.get(), TopologyChangeAction.DELETE));
 
                 assertFalse(sqlgGraph1.getTopology().getAllTables().containsKey(lblc.getName()));
                 assertFalse(sqlgGraph1.getTopology().getAllTables().containsKey(oelbl1.orElseThrow(IllegalStateException::new).getName()));
                 assertFalse(sqlgGraph1.getTopology().getAllTables().containsKey(oelbl2.orElseThrow(IllegalStateException::new).getName()));
 
 
 				/*VertexLabel lblb=this.sqlgGraph.getTopology().getVertexLabel(schema, "B").get();
 				lblb.remove(true);
 				assertTrue(tlt.receivedEvent(lblb, TopologyChangeAction.DELETE));
 
 				assertFalse(sqlgGraph.getTopology().getEdgeLabel(schema, "E").isPresent());
 
 				TopologyListenerTest tlt1=new TopologyListenerTest();
 				sqlgGraph1.getTopology().registerListener(tlt1);
 
 				sqlgGraph.tx().commit();
 				assertFalse(sqlgGraph.getTopology().getEdgeLabel(schema, "E").isPresent());
 				Thread.sleep(1_000);
 				assertFalse(sqlgGraph1.getTopology().getEdgeLabel(schema, "E").isPresent());
 				assertTrue(tlt1.receivedEvent(lblb, TopologyChangeAction.DELETE));*/
             }
         }
     }
 
     private void checkEdgePropertyExistenceBeforeDeletion(String schema) throws Exception {
         Optional<EdgeLabel> olbl = this.sqlgGraph.getTopology().getEdgeLabel(schema, "E");
         assertNotNull(olbl);
         assertTrue(olbl.isPresent());
         assertTrue(olbl.get().getProperty("p1").isPresent());
         assertTrue(olbl.get().getProperty("p2").isPresent());
 
         assertEquals(1L, this.sqlgGraph.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
                 .out(SQLG_SCHEMA_OUT_EDGES_EDGE).has(SQLG_SCHEMA_EDGE_LABEL_NAME, "E")
                 .out(SQLG_SCHEMA_EDGE_PROPERTIES_EDGE).has(SQLG_SCHEMA_PROPERTY_NAME, "p1").count().next().longValue());
 
         assertEquals(1L, this.sqlgGraph.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
                 .out(SQLG_SCHEMA_OUT_EDGES_EDGE).has(SQLG_SCHEMA_EDGE_LABEL_NAME, "E")
                 .out(SQLG_SCHEMA_EDGE_PROPERTIES_EDGE).has(SQLG_SCHEMA_PROPERTY_NAME, "p2").count().next().longValue());
 
         assertTrue(columnExistsInSQL(schema, EDGE_PREFIX + "E", "p1"));
         assertTrue(columnExistsInSQL(schema, EDGE_PREFIX + "E", "p2"));
 
     }
 
     private void checkEdgePropertyExistenceAfterDeletion(SqlgGraph g, String schema) throws Exception {
         Optional<EdgeLabel> olbl = g.getTopology().getEdgeLabel(schema, "E");
         assertNotNull(olbl);
         assertTrue(olbl.isPresent());
         assertFalse(olbl.get().getProperty("p1").isPresent());
         assertFalse(olbl.get().getProperty("p2").isPresent());
 
         assertEquals(0L, g.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
                 .out(SQLG_SCHEMA_OUT_EDGES_EDGE).has(SQLG_SCHEMA_EDGE_LABEL_NAME, "E")
                 .out(SQLG_SCHEMA_EDGE_PROPERTIES_EDGE).has(SQLG_SCHEMA_PROPERTY_NAME, "p1").count().next().longValue());
 
         assertEquals(0L, g.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
                 .out(SQLG_SCHEMA_OUT_EDGES_EDGE).has(SQLG_SCHEMA_EDGE_LABEL_NAME, "E")
                 .out(SQLG_SCHEMA_EDGE_PROPERTIES_EDGE).has(SQLG_SCHEMA_PROPERTY_NAME, "p2").count().next().longValue());
 
         assertFalse(columnExistsInSQL(schema, EDGE_PREFIX + "E", "p1"));
         assertTrue(columnExistsInSQL(schema, EDGE_PREFIX + "E", "p2"));
 
     }
 
 
     private void checkIndexExistenceBeforeDeletion(String schema, Index i1, Index i2) throws Exception {
         Optional<VertexLabel> olbl = this.sqlgGraph.getTopology().getVertexLabel(schema, "A");
         assertNotNull(olbl);
         assertTrue(olbl.isPresent());
         assertTrue(olbl.get().getIndex(i1.getName()).isPresent());
         assertTrue(olbl.get().getIndex(i2.getName()).isPresent());
 
         assertEquals(1L, this.sqlgGraph.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
                 .out(SQLG_SCHEMA_VERTEX_INDEX_EDGE).has(SQLG_SCHEMA_INDEX_NAME, i1.getName()).count().next().longValue());
 
         assertEquals(1L, this.sqlgGraph.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
                 .out(SQLG_SCHEMA_VERTEX_INDEX_EDGE).has(SQLG_SCHEMA_INDEX_NAME, i2.getName()).count().next().longValue());
 
         assertTrue(indexExistsInSQL(schema, VERTEX_PREFIX + "A", i1.getName()));
         assertTrue(indexExistsInSQL(schema, VERTEX_PREFIX + "A", i2.getName()));
 
     }
 
     private void checkIndexExistenceAfterDeletion(SqlgGraph g, String schema, Index i1, Index i2) throws Exception {
         Optional<VertexLabel> olbl = g.getTopology().getVertexLabel(schema, "A");
         assertNotNull(olbl);
         assertTrue(olbl.isPresent());
         assertFalse(olbl.get().getProperty(i1.getName()).isPresent());
         assertFalse(olbl.get().getProperty(i2.getName()).isPresent());
 
         assertEquals(0L, g.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
                 .out(SQLG_SCHEMA_VERTEX_INDEX_EDGE).has(SQLG_SCHEMA_INDEX_NAME, i1.getName()).count().next().longValue());
 
         assertEquals(0L, g.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
                 .out(SQLG_SCHEMA_VERTEX_INDEX_EDGE).has(SQLG_SCHEMA_INDEX_NAME, i2.getName()).count().next().longValue());
 
         assertFalse(indexExistsInSQL(schema, VERTEX_PREFIX + "A", i1.getName()));
         assertTrue(indexExistsInSQL(schema, VERTEX_PREFIX + "A", i2.getName()));
 
     }
 
 
     private void checkEdgeIndexExistenceBeforeDeletion(String schema, Index i1, Index i2) throws Exception {
         Optional<EdgeLabel> olbl = sqlgGraph.getTopology().getEdgeLabel(schema, "E");
         assertNotNull(olbl);
         assertTrue(olbl.isPresent());
         assertTrue(olbl.get().getIndex(i1.getName()).isPresent());
         assertTrue(olbl.get().getIndex(i2.getName()).isPresent());
 
         assertEquals(1L, this.sqlgGraph.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
                 .out(SQLG_SCHEMA_OUT_EDGES_EDGE).has(SQLG_SCHEMA_EDGE_LABEL_NAME, "E")
                 .out(SQLG_SCHEMA_EDGE_INDEX_EDGE).has(SQLG_SCHEMA_INDEX_NAME, i1.getName()).count().next().longValue());
 
         assertEquals(1L, this.sqlgGraph.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
                 .out(SQLG_SCHEMA_OUT_EDGES_EDGE).has(SQLG_SCHEMA_EDGE_LABEL_NAME, "E")
                 .out(SQLG_SCHEMA_EDGE_INDEX_EDGE).has(SQLG_SCHEMA_INDEX_NAME, i2.getName()).count().next().longValue());
 
         assertTrue(indexExistsInSQL(schema, EDGE_PREFIX + "E", i1.getName()));
         assertTrue(indexExistsInSQL(schema, EDGE_PREFIX + "E", i2.getName()));
 
     }
 
     private void checkEdgeIndexExistenceAfterDeletion(SqlgGraph g, String schema, Index i1, Index i2) throws Exception {
         Optional<EdgeLabel> olbl = g.getTopology().getEdgeLabel(schema, "E");
         assertNotNull(olbl);
         assertTrue(olbl.isPresent());
         assertFalse(olbl.get().getProperty(i1.getName()).isPresent());
         assertFalse(olbl.get().getProperty(i2.getName()).isPresent());
 
         assertEquals(0L, g.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
                 .out(SQLG_SCHEMA_OUT_EDGES_EDGE).has(SQLG_SCHEMA_EDGE_LABEL_NAME, "E")
                 .out(SQLG_SCHEMA_EDGE_INDEX_EDGE).has(SQLG_SCHEMA_INDEX_NAME, i1.getName()).count().next().longValue());
 
         assertEquals(0L, g.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
                 .out(SQLG_SCHEMA_OUT_EDGES_EDGE).has(SQLG_SCHEMA_EDGE_LABEL_NAME, "E")
                 .out(SQLG_SCHEMA_EDGE_INDEX_EDGE).has(SQLG_SCHEMA_INDEX_NAME, i2.getName()).count().next().longValue());
 
         assertFalse(indexExistsInSQL(schema, EDGE_PREFIX + "E", i1.getName()));
         assertTrue(indexExistsInSQL(schema, EDGE_PREFIX + "E", i2.getName()));
 
     }
 
 
     private void checkEdgeExistenceBeforeDeletion(SqlgGraph g, String schema) throws Exception {
         Optional<EdgeLabel> olbl = g.getTopology().getEdgeLabel(schema, "E1");
         assertNotNull(olbl);
         assertTrue(olbl.isPresent());
         olbl = g.getTopology().getEdgeLabel(schema, "E2");
         assertNotNull(olbl);
         assertTrue(olbl.isPresent());
 
         VertexLabel a = g.getTopology().getVertexLabel(schema, "A").orElseThrow(IllegalStateException::new);
         assertTrue(a.getOutEdgeLabel("E1").isPresent());
         assertTrue(a.getOutEdgeLabel("E2").isPresent());
 
 
         assertEquals(1L, g.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
                 .out(SQLG_SCHEMA_OUT_EDGES_EDGE).has(SQLG_SCHEMA_EDGE_LABEL_NAME, "E1").count().next().longValue());
 
         assertEquals(1L, g.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
                 .out(SQLG_SCHEMA_OUT_EDGES_EDGE).has(SQLG_SCHEMA_EDGE_LABEL_NAME, "E2").count().next().longValue());
 
         assertTrue(tableExistsInSQL(schema, EDGE_PREFIX + "E1"));
         assertTrue(tableExistsInSQL(schema, EDGE_PREFIX + "E2"));
 
     }
 
     private void checkEdgeExistenceAfterDeletion(SqlgGraph g, String schema) throws Exception {
         Optional<EdgeLabel> olbl = g.getTopology().getEdgeLabel(schema, "E1");
         assertNotNull(olbl);
         assertFalse(olbl.isPresent());
         olbl = g.getTopology().getEdgeLabel(schema, "E2");
         assertNotNull(olbl);
         assertFalse(olbl.isPresent());
 
         VertexLabel a = g.getTopology().getVertexLabel(schema, "A").orElseThrow(IllegalStateException::new);
         assertFalse(a.getOutEdgeLabel("E1").isPresent());
         assertFalse(a.getOutEdgeLabel("E2").isPresent());
 
         assertEquals(0L, g.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
                 .out(SQLG_SCHEMA_OUT_EDGES_EDGE).has(SQLG_SCHEMA_EDGE_LABEL_NAME, "E1").count().next().longValue());
 
         assertEquals(0L, g.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
                 .out(SQLG_SCHEMA_OUT_EDGES_EDGE).has(SQLG_SCHEMA_EDGE_LABEL_NAME, "E2").count().next().longValue());
 
         assertFalse(tableExistsInSQL(schema, EDGE_PREFIX + "E1"));
         assertTrue(tableExistsInSQL(schema, EDGE_PREFIX + "E2"));
 
     }
 
 
     private void checkEdgeRoleExistenceBeforeDeletion(String schemaOut, String schemaIn) throws Exception {
         Optional<EdgeLabel> olbl = this.sqlgGraph.getTopology().getEdgeLabel(schemaOut, "E1");
         assertNotNull(olbl);
         assertTrue(olbl.isPresent());
 
         VertexLabel a = this.sqlgGraph.getTopology().getVertexLabel(schemaOut, "A").orElseThrow(IllegalStateException::new);
         VertexLabel b = this.sqlgGraph.getTopology().getVertexLabel(schemaOut, "B").orElseThrow(IllegalStateException::new);
         VertexLabel pa = this.sqlgGraph.getTopology().getVertexLabel(schemaIn, "A").orElseThrow(IllegalStateException::new);
         VertexLabel pb = this.sqlgGraph.getTopology().getVertexLabel(schemaIn, "B").orElseThrow(IllegalStateException::new);
         assertEquals(1, a.getOutEdgeLabels().size());
         assertEquals(1, b.getOutEdgeLabels().size());
         assertEquals(1, pb.getInEdgeLabels().size());
         assertEquals(1, pa.getInEdgeLabels().size());
 
         Set<VertexLabel> inLbls = olbl.get().getInVertexLabels();
         assertEquals(2, inLbls.size());
         assertTrue(inLbls.contains(pa));
         assertTrue(inLbls.contains(pb));
 
         Set<EdgeRole> inRoles = olbl.get().getInEdgeRoles();
         assertEquals(2, inRoles.size());
 
 
         Set<VertexLabel> outLbls = olbl.get().getOutVertexLabels();
         assertEquals(2, outLbls.size());
         assertTrue(outLbls.contains(a));
         assertTrue(outLbls.contains(b));
 
         Set<EdgeRole> outRoles = olbl.get().getOutEdgeRoles();
         assertEquals(2, outRoles.size());
 
 
         assertTrue(tableExistsInSQL(schemaOut, EDGE_PREFIX + "E1"));
         assertTrue(columnExistsInSQL(schemaOut, EDGE_PREFIX + "E1", schemaOut + ".A" + Topology.OUT_VERTEX_COLUMN_END));
         assertTrue(columnExistsInSQL(schemaOut, EDGE_PREFIX + "E1", schemaOut + ".B" + Topology.OUT_VERTEX_COLUMN_END));
         assertTrue(columnExistsInSQL(schemaOut, EDGE_PREFIX + "E1", schemaIn + ".A" + Topology.IN_VERTEX_COLUMN_END));
         assertTrue(columnExistsInSQL(schemaOut, EDGE_PREFIX + "E1", schemaIn + ".B" + Topology.IN_VERTEX_COLUMN_END));
     }
 
     private void checkEdgeRoleExistenceAfterRoleDeletion(SqlgGraph g, String schemaOut, String schemaIn) throws Exception {
         Optional<EdgeLabel> optionalEdgeLabel = g.getTopology().getEdgeLabel(schemaOut, "E1");
         assertNotNull(optionalEdgeLabel);
         assertTrue(optionalEdgeLabel.isPresent());
 
         VertexLabel a = g.getTopology().getVertexLabel(schemaOut, "A").orElseThrow(IllegalStateException::new);
         VertexLabel b = g.getTopology().getVertexLabel(schemaOut, "B").orElseThrow(IllegalStateException::new);
         VertexLabel pa = g.getTopology().getVertexLabel(schemaIn, "A").orElseThrow(IllegalStateException::new);
         VertexLabel pb = g.getTopology().getVertexLabel(schemaIn, "B").orElseThrow(IllegalStateException::new);
         assertEquals(1, a.getOutEdgeLabels().size());
         assertEquals(0, b.getOutEdgeLabels().size());
         assertEquals(1, pb.getInEdgeLabels().size());
         assertEquals(0, pa.getInEdgeLabels().size());
 
         Set<VertexLabel> inLbls = optionalEdgeLabel.get().getInVertexLabels();
         assertEquals(1, inLbls.size());
         assertFalse(inLbls.contains(pa));
         assertTrue(inLbls.contains(pb));
 
         Set<EdgeRole> inRoles = optionalEdgeLabel.get().getInEdgeRoles();
         assertEquals(1, inRoles.size());
         assertEquals("B", inRoles.iterator().next().getVertexLabel().getName());
 
 
         Set<VertexLabel> outLbls = optionalEdgeLabel.get().getOutVertexLabels();
         assertEquals(1, outLbls.size());
         assertTrue(outLbls.contains(a));
         assertFalse(outLbls.contains(b));
 
         Set<EdgeRole> outRoles = optionalEdgeLabel.get().getOutEdgeRoles();
         assertEquals(1, outRoles.size());
         assertEquals("A", outRoles.iterator().next().getVertexLabel().getName());
 
         assertTrue(tableExistsInSQL(schemaOut, EDGE_PREFIX + "E1"));
         assertTrue(columnExistsInSQL(schemaOut, EDGE_PREFIX + "E1", schemaOut + ".A" + Topology.OUT_VERTEX_COLUMN_END));
         assertFalse(columnExistsInSQL(schemaOut, EDGE_PREFIX + "E1", schemaOut + ".B" + Topology.OUT_VERTEX_COLUMN_END));
         assertTrue(columnExistsInSQL(schemaOut, EDGE_PREFIX + "E1", schemaIn + ".A" + Topology.IN_VERTEX_COLUMN_END));
         assertTrue(columnExistsInSQL(schemaOut, EDGE_PREFIX + "E1", schemaIn + ".B" + Topology.IN_VERTEX_COLUMN_END));
     }
 
     private void testDeleteEdgeRole(String schemaOut, String schemaIn) throws Exception {
         try (SqlgGraph sqlgGraph1 = SqlgGraph.open(configuration)) {
             String Aout = getLabel(schemaOut, "A");
             String Bout = getLabel(schemaOut, "B");
             String Ain = getLabel(schemaIn, "A");
             String Bin = getLabel(schemaIn, "B");
             Vertex a1 = this.sqlgGraph.addVertex(T.label, Aout, "name", "A1");
             Vertex a2 = this.sqlgGraph.addVertex(T.label, Ain, "name", "A2");
 
             Vertex b1 = this.sqlgGraph.addVertex(T.label, Bout, "name", "B1");
             Vertex b2 = this.sqlgGraph.addVertex(T.label, Bin, "name", "B2");
             a1.addEdge("E1", b2);
             b1.addEdge("E1", a2);
 
             //checkEdgeRoleExistenceBeforeDeletion();
             this.sqlgGraph.tx().commit();
 
             checkEdgeRoleExistenceBeforeDeletion(schemaOut, schemaIn);
 
             TopologyListenerTest tlt = new TopologyListenerTest();
             this.sqlgGraph.getTopology().registerListener(tlt);
 
 
             EdgeLabel lbl = this.sqlgGraph.getTopology().getEdgeLabel(schemaOut, "E1").get();
             for (EdgeRole er : lbl.getOutEdgeRoles()) {
                 if (er.getVertexLabel().getName().equals("B")) {
                     er.remove(false);
                     assertTrue(tlt.receivedEvent(er, TopologyChangeAction.DELETE));
 
                 }
             }
             for (EdgeRole er : lbl.getInEdgeRoles()) {
                 if (er.getVertexLabel().getName().equals("A")) {
                     er.remove(true);
                     assertTrue(tlt.receivedEvent(er, TopologyChangeAction.DELETE));
 
                 }
             }
             if (rollback) {
                 this.sqlgGraph.tx().rollback();
                 checkEdgeRoleExistenceBeforeDeletion(schemaOut, schemaIn);
 
             } else {
                 this.sqlgGraph.tx().commit();
                 checkEdgeRoleExistenceAfterRoleDeletion(this.sqlgGraph, schemaOut, schemaIn);
                 Thread.sleep(10_000);
                 checkEdgeRoleExistenceAfterRoleDeletion(sqlgGraph1, schemaOut, schemaIn);
 
                 assertFalse(b1.edges(Direction.OUT, "E1").hasNext());
                 assertTrue(a1.edges(Direction.OUT, "E1").hasNext());
 
                 lbl.getOutEdgeRoles().iterator().next().remove(false);
                 assertFalse(this.sqlgGraph.getTopology().getEdgeLabel(schemaOut, "E1").isPresent());
                 this.sqlgGraph.tx().commit();
                 assertFalse(this.sqlgGraph.getTopology().getEdgeLabel(schemaOut, "E1").isPresent());
             }
         }
     }
 
     private void checkVertexLabelBeforeDeletion(SqlgGraph g, String schema) throws Exception {
         Optional<VertexLabel> olbl = g.getTopology().getVertexLabel(schema, "A");
         assertNotNull(olbl);
         assertTrue(olbl.isPresent());
 
         olbl = g.getTopology().getVertexLabel(schema, "B");
         assertNotNull(olbl);
         assertTrue(olbl.isPresent());
 
         olbl = g.getTopology().getVertexLabel(schema, "C");
         assertNotNull(olbl);
         assertTrue(olbl.isPresent());
 
         olbl = g.getTopology().getVertexLabel(schema, "D");
         assertNotNull(olbl);
         assertTrue(olbl.isPresent());
 
         assertEquals(1L, g.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A").count().next().longValue());
 
         assertEquals(1L, g.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "B").count().next().longValue());
 
         assertEquals(1L, g.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "C").count().next().longValue());
 
         assertEquals(1L, g.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "D").count().next().longValue());
 
 
         assertTrue(tableExistsInSQL(schema, VERTEX_PREFIX + "A"));
         assertTrue(tableExistsInSQL(schema, VERTEX_PREFIX + "B"));
         assertTrue(tableExistsInSQL(schema, VERTEX_PREFIX + "C"));
         assertTrue(tableExistsInSQL(schema, VERTEX_PREFIX + "D"));
 
 
         Optional<EdgeLabel> oelbl = g.getTopology().getEdgeLabel(schema, "E");
         assertNotNull(oelbl);
         assertTrue(oelbl.isPresent());
         EdgeLabel elbl = oelbl.get();
         assertEquals(3, elbl.getInVertexLabels().size());
         assertEquals(3, elbl.getOutVertexLabels().size());
 
         oelbl = g.getTopology().getEdgeLabel(schema, "E1");
         assertNotNull(oelbl);
         assertTrue(oelbl.isPresent());
         elbl = oelbl.get();
         assertEquals(1, elbl.getInVertexLabels().size());
         assertEquals(1, elbl.getOutVertexLabels().size());
 
         oelbl = g.getTopology().getEdgeLabel(schema, "E2");
         assertNotNull(oelbl);
         assertTrue(oelbl.isPresent());
         elbl = oelbl.get();
         assertEquals(1, elbl.getInVertexLabels().size());
         assertEquals(1, elbl.getOutVertexLabels().size());
     }
 
     private void checkVertexLabelAfterDeletion(SqlgGraph g, String schema) throws Exception {
         Optional<VertexLabel> olbl = g.getTopology().getVertexLabel(schema, "A");
         assertNotNull(olbl);
         assertTrue(olbl.isPresent());
 
         olbl = g.getTopology().getVertexLabel(schema, "B");
         assertNotNull(olbl);
         assertTrue(olbl.isPresent());
 
         olbl = g.getTopology().getVertexLabel(schema, "C");
         assertNotNull(olbl);
         assertFalse(olbl.isPresent());
 
         olbl = g.getTopology().getVertexLabel(schema, "D");
         assertNotNull(olbl);
         assertTrue(olbl.isPresent());
 
         assertEquals(1L, g.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A").count().next().longValue());
 
         assertEquals(1L, g.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "B").count().next().longValue());
 
         assertEquals(0L, g.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "C").count().next().longValue());
 
         assertEquals(1L, g.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "D").count().next().longValue());
 
 
         assertTrue(tableExistsInSQL(schema, VERTEX_PREFIX + "A"));
         assertTrue(tableExistsInSQL(schema, VERTEX_PREFIX + "B"));
         if (preserve) {
             assertTrue(tableExistsInSQL(schema, VERTEX_PREFIX + "C"));
         } else {
             assertFalse(tableExistsInSQL(schema, VERTEX_PREFIX + "C"));
         }
         assertTrue(tableExistsInSQL(schema, VERTEX_PREFIX + "D"));
 
 
         Optional<EdgeLabel> oelbl = g.getTopology().getEdgeLabel(schema, "E");
         assertNotNull(oelbl);
         assertTrue(oelbl.isPresent());
         EdgeLabel elbl = oelbl.get();
         assertEquals(2, elbl.getInVertexLabels().size());
         assertEquals(2, elbl.getOutVertexLabels().size());
 
         oelbl = g.getTopology().getEdgeLabel(schema, "E1");
         assertNotNull(oelbl);
         assertFalse(oelbl.isPresent());
 
         oelbl = g.getTopology().getEdgeLabel(schema, "E2");
         assertNotNull(oelbl);
         assertFalse(oelbl.isPresent());
     }
 
     private void checkCount(GraphTraversal<?, ?> gt, long count) throws Exception {
         try {
             assertEquals(count, gt.count().next().longValue());
         } finally {
             gt.close();
         }
     }
 
     private void testSchemaBeforeDeletion(SqlgGraph g, String schema) throws Exception {
         Optional<Schema> osch = g.getTopology().getSchema(schema);
         assertNotNull(osch);
         assertTrue(osch.isPresent());
         Schema sch = osch.get();
         assertTrue(g.getTopology().getSchemas().contains(sch));
 
         assertEquals(1, g.topology().V().has(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA,
                 "name", schema).count().next().longValue());
         assertEquals(2, g.topology().V().has(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA,
                 "name", schema).out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).count().next().longValue());
         assertEquals(1, g.topology().V().has(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA,
                 "name", schema).out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has("name", "A")
                 .out(SQLG_SCHEMA_VERTEX_PROPERTIES_EDGE)
                 .count().next().longValue());
         assertEquals(1, g.topology().V().has(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA,
                 "name", schema).out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has("name", "B")
                 .out(SQLG_SCHEMA_VERTEX_PROPERTIES_EDGE)
                 .count().next().longValue());
         assertEquals(1, g.topology().V().has(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA,
                 "name", schema).out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has("name", "A")
                 .out(SQLG_SCHEMA_VERTEX_INDEX_EDGE)
                 .count().next().longValue());
         assertEquals(1, g.topology().V().has(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA,
                 "name", schema).out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has("name", "A")
                 .out(SQLG_SCHEMA_OUT_EDGES_EDGE).has("name", "E")
                 .count().next().longValue());
         assertEquals(1, g.topology().V().has(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA,
                 "name", schema).out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has("name", "A")
                 .out(SQLG_SCHEMA_OUT_EDGES_EDGE).has("name", "E")
                 .out(SQLG_SCHEMA_EDGE_INDEX_EDGE)
                 .count().next().longValue());
         assertTrue(schemaExistsInSQL(schema));
     }
 
     private void testSchemaAfterDeletion(SqlgGraph g, String schema, boolean preserveData) throws Exception {
         Optional<Schema> osch = g.getTopology().getSchema(schema);
         assertNotNull(osch);
         assertFalse(osch.isPresent());
 
         for (Schema s : g.getTopology().getSchemas()) {
             assertNotEquals(s.getName(), schema);
         }
 
         assertEquals(0, g.topology().V().has(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA,
                 "name", schema).count().next().longValue());
         assertEquals(0, g.topology().V().has(SQLG_SCHEMA + "." + SQLG_SCHEMA_VERTEX_LABEL,
                 "name", "A")
                 .out(SQLG_SCHEMA_VERTEX_PROPERTIES_EDGE)
                 .count().next().longValue());
         assertEquals(0, g.topology().V().has(SQLG_SCHEMA + "." + SQLG_SCHEMA_VERTEX_LABEL, "name", "B")
                 .out(SQLG_SCHEMA_VERTEX_PROPERTIES_EDGE)
                 .count().next().longValue());
         assertEquals(0, g.topology().V().has(SQLG_SCHEMA + "." + Topology.SQLG_SCHEMA_EDGE_LABEL,
                 "name", "E")
                 .count().next().longValue());
 
         if (preserveData) {
             assertTrue(schemaExistsInSQL(schema));
         } else {
             assertFalse(schemaExistsInSQL(schema));
         }
     }
 
 
     private void testSchemaWithOtherEdges(SqlgGraph g, String schema, String otherSchema) throws Exception {
         Optional<Schema> osch = g.getTopology().getSchema(schema);
         assertNotNull(osch);
         assertTrue(osch.isPresent());
         Optional<VertexLabel> ovl = osch.get().getVertexLabel("B");
         assertNotNull(ovl);
         assertTrue(ovl.isPresent());
 
         osch = g.getTopology().getSchema(otherSchema);
         assertNotNull(osch);
         assertTrue(osch.isPresent());
 
         Optional<EdgeLabel> oel = osch.get().getEdgeLabel("E");
         assertNotNull(oel);
         assertTrue(oel.isPresent());
 
         Set<VertexLabel> vls = oel.get().getInVertexLabels();
         assertTrue(vls.contains(ovl.get()));
 
         assertEquals(1L, g.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, otherSchema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
                 .out(SQLG_SCHEMA_OUT_EDGES_EDGE).has(SQLG_SCHEMA_EDGE_LABEL_NAME, "E").count().next().longValue());
 
         assertEquals(1L, g.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "B")
                 .out(SQLG_SCHEMA_IN_EDGES_EDGE).has(SQLG_SCHEMA_EDGE_LABEL_NAME, "E").count().next().longValue());
 
         assertTrue(tableExistsInSQL(otherSchema, EDGE_PREFIX + "E"));
 
     }
 
     private void testSchemaWithOtherEdgesAfterDeletion(SqlgGraph g, String schema, String otherSchema) throws Exception {
         Optional<Schema> osch = g.getTopology().getSchema(schema);
         assertNotNull(osch);
         assertFalse(osch.isPresent());
 
         osch = g.getTopology().getSchema(otherSchema);
         assertNotNull(osch);
         assertTrue(osch.isPresent());
 
         Optional<EdgeLabel> oel = osch.get().getEdgeLabel("E");
         assertNotNull(oel);
         assertFalse(oel.isPresent());
 
 
         assertEquals(0L, g.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, otherSchema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
                 .out(SQLG_SCHEMA_OUT_EDGES_EDGE).has(SQLG_SCHEMA_EDGE_LABEL_NAME, "E").count().next().longValue());
 
         assertEquals(0L, g.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "B")
                 .out(SQLG_SCHEMA_IN_EDGES_EDGE).has(SQLG_SCHEMA_EDGE_LABEL_NAME, "E").count().next().longValue());
 
         if (preserve) {
             assertTrue(tableExistsInSQL(otherSchema, EDGE_PREFIX + "E"));
         } else {
             assertFalse(tableExistsInSQL(otherSchema, EDGE_PREFIX + "E"));
         }
     }
 
     private String getLabel(String schema, String type) {
         return schema.equals(this.sqlgGraph.getSqlDialect().getPublicSchema()) ? type : schema + "." + type;
     }
 
     private boolean schemaExistsInSQL(String schema) throws SQLException {
         try (ResultSet rs = this.sqlgGraph.tx().getConnection().getMetaData().getSchemas(null, schema)) {
             return rs.next();
         }
     }
 
     private boolean tableExistsInSQL(String schema, String table) throws SQLException {
         try (ResultSet rs = this.sqlgGraph.tx().getConnection().getMetaData().getTables(null, schema, table, null)) {
             return rs.next();
         }
 
     }
 
     private boolean columnExistsInSQL(String schema, String table, String column) throws SQLException {
         return !this.sqlgGraph.getSqlDialect().getTableColumns(
                 this.sqlgGraph.tx().getConnection().getMetaData(),
                 null, schema, table, column
         ).isEmpty();
     }
 
     private boolean indexExistsInSQL(String schema, String table, String index) throws SQLException {
         try (ResultSet rs = this.sqlgGraph.tx().getConnection().getMetaData().getIndexInfo(null, schema, table, false, false)) {
             while (rs.next()) {
                 String in = rs.getString("INDEX_NAME");
                 if (index.equals(in)) {
                     return true;
                 }
             }
             return false;
         }
 
     }
 
     private void checkPropertyExistenceBeforeDeletion(String schema) throws Exception {
         checkPropertyExistenceBeforeDeletion(schema, null);
     }
 
     private void checkPropertyExistenceBeforeDeletion(String schema, Index index) throws Exception {
         Optional<VertexLabel> olbl = this.sqlgGraph.getTopology().getVertexLabel(schema, "A");
         assertNotNull(olbl);
         assertTrue(olbl.isPresent());
         assertTrue(olbl.get().getProperty("p1").isPresent());
         assertTrue(olbl.get().getProperty("p2").isPresent());
 
         assertEquals(1L, this.sqlgGraph.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
                 .out(SQLG_SCHEMA_VERTEX_PROPERTIES_EDGE).has(SQLG_SCHEMA_PROPERTY_NAME, "p1").count().next().longValue());
 
         if (index != null) {
             assertEquals(1L, this.sqlgGraph.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                     .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
                     .out(SQLG_SCHEMA_VERTEX_INDEX_EDGE).has(SQLG_SCHEMA_INDEX_NAME, index.getName()).count().next().longValue());
             assertTrue(indexExistsInSQL(schema, VERTEX_PREFIX + "A", index.getName()));
         }
 
         assertEquals(1L, this.sqlgGraph.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
                 .out(SQLG_SCHEMA_VERTEX_PROPERTIES_EDGE).has(SQLG_SCHEMA_PROPERTY_NAME, "p2").count().next().longValue());
 
         assertTrue(columnExistsInSQL(schema, VERTEX_PREFIX + "A", "p1"));
         assertTrue(columnExistsInSQL(schema, VERTEX_PREFIX + "A", "p2"));
 
     }
 
     private void checkPropertyExistenceAfterDeletion(SqlgGraph g, String schema) throws Exception {
         checkPropertyExistenceAfterDeletion(g, schema, null);
     }
 
     private void checkPropertyExistenceAfterDeletion(SqlgGraph g, String schema, Index index) throws Exception {
         Optional<VertexLabel> olbl = g.getTopology().getVertexLabel(schema, "A");
         assertNotNull(olbl);
         assertTrue(olbl.isPresent());
         assertFalse(olbl.get().getProperty("p1").isPresent());
         assertFalse(olbl.get().getProperty("p2").isPresent());
 
         assertEquals(0L, g.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
                 .out(SQLG_SCHEMA_VERTEX_PROPERTIES_EDGE).has(SQLG_SCHEMA_PROPERTY_NAME, "p1").count().next().longValue());
 
         if (index != null) {
             assertEquals(0L, g.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                     .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
                     .out(SQLG_SCHEMA_VERTEX_INDEX_EDGE).has(SQLG_SCHEMA_INDEX_NAME, index.getName()).count().next().longValue());
             assertFalse(indexExistsInSQL(schema, VERTEX_PREFIX + "A", index.getName()));
         }
 
         assertEquals(0L, g.topology().V().hasLabel(SQLG_SCHEMA + "." + SQLG_SCHEMA_SCHEMA).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, schema)
                 .out(SQLG_SCHEMA_SCHEMA_VERTEX_EDGE).has(SQLG_SCHEMA_VERTEX_LABEL_NAME, "A")
                 .out(SQLG_SCHEMA_VERTEX_PROPERTIES_EDGE).has(SQLG_SCHEMA_PROPERTY_NAME, "p2").count().next().longValue());
 
         assertFalse(columnExistsInSQL(schema, VERTEX_PREFIX + "A", "p1"));
         assertTrue(columnExistsInSQL(schema, VERTEX_PREFIX + "A", "p2"));
 
     }
 
 
 }