Coverage Summary for Class: TestDropStep (org.umlg.sqlg.test.process.dropstep)
  | Class | Method, % | Branch, % | Line, % | 
  | TestDropStep | 100%
  
  
    (39/39) | 93.5%
  
  
    (58/62) | 99.8%
  
  
    (913/915) | 
  
    | TestDropStep$1 | 100%
  
  
    (3/3) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$10 | 100%
  
  
    (1/1) | 100%
  
  
    (2/2) | 
  
    | TestDropStep$11 | 100%
  
  
    (1/1) | 100%
  
  
    (4/4) | 
  
    | TestDropStep$12 | 100%
  
  
    (2/2) | 100%
  
  
    (5/5) | 
  
    | TestDropStep$13 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$14 | 100%
  
  
    (2/2) | 100%
  
  
    (5/5) | 
  
    | TestDropStep$15 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$16 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$17 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$18 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$19 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$2 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$20 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$21 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$22 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$23 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$24 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$25 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$26 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$27 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$28 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$29 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$3 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$30 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$31 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$32 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$33 | 100%
  
  
    (1/1) | 100%
  
  
    (4/4) | 
  
    | TestDropStep$34 | 100%
  
  
    (1/1) | 100%
  
  
    (4/4) | 
  
    | TestDropStep$35 | 100%
  
  
    (1/1) | 100%
  
  
    (4/4) | 
  
    | TestDropStep$36 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$37 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$38 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$39 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$4 | 100%
  
  
    (1/1) | 100%
  
  
    (4/4) | 
  
    | TestDropStep$40 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$41 | 100%
  
  
    (1/1) | 100%
  
  
    (2/2) | 
  
    | TestDropStep$42 | 100%
  
  
    (1/1) | 100%
  
  
    (2/2) | 
  
    | TestDropStep$43 | 100%
  
  
    (1/1) | 100%
  
  
    (4/4) | 
  
    | TestDropStep$44 | 100%
  
  
    (1/1) | 100%
  
  
    (4/4) | 
  
    | TestDropStep$45 | 100%
  
  
    (1/1) | 100%
  
  
    (4/4) | 
  
    | TestDropStep$46 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$47 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$48 | 100%
  
  
    (1/1) | 100%
  
  
    (4/4) | 
  
    | TestDropStep$49 | 100%
  
  
    (1/1) | 100%
  
  
    (4/4) | 
  
    | TestDropStep$5 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$50 | 100%
  
  
    (1/1) | 100%
  
  
    (4/4) | 
  
    | TestDropStep$51 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$52 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$53 | 100%
  
  
    (1/1) | 100%
  
  
    (4/4) | 
  
    | TestDropStep$54 | 100%
  
  
    (1/1) | 100%
  
  
    (4/4) | 
  
    | TestDropStep$55 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$56 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$57 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$58 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$59 | 100%
  
  
    (1/1) | 100%
  
  
    (2/2) | 
  
    | TestDropStep$6 | 100%
  
  
    (1/1) | 100%
  
  
    (2/2) | 
  
    | TestDropStep$60 | 100%
  
  
    (1/1) | 100%
  
  
    (2/2) | 
  
    | TestDropStep$61 | 100%
  
  
    (1/1) | 100%
  
  
    (4/4) | 
  
    | TestDropStep$62 | 100%
  
  
    (1/1) | 100%
  
  
    (4/4) | 
  
    | TestDropStep$63 | 100%
  
  
    (1/1) | 100%
  
  
    (4/4) | 
  
    | TestDropStep$64 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$65 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$66 | 100%
  
  
    (1/1) | 100%
  
  
    (4/4) | 
  
    | TestDropStep$67 | 100%
  
  
    (1/1) | 100%
  
  
    (4/4) | 
  
    | TestDropStep$68 | 100%
  
  
    (1/1) | 100%
  
  
    (4/4) | 
  
    | TestDropStep$69 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$7 | 100%
  
  
    (1/1) | 100%
  
  
    (2/2) | 
  
    | TestDropStep$70 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$71 | 100%
  
  
    (1/1) | 100%
  
  
    (4/4) | 
  
    | TestDropStep$72 | 100%
  
  
    (1/1) | 100%
  
  
    (4/4) | 
  
    | TestDropStep$73 | 100%
  
  
    (1/1) | 100%
  
  
    (4/4) | 
  
    | TestDropStep$74 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$75 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$8 | 100%
  
  
    (1/1) | 100%
  
  
    (2/2) | 
  
    | TestDropStep$9 | 100%
  
  
    (1/1) | 100%
  
  
    (3/3) | 
  
    | TestDropStep$AbstractMutationListener | 9.1%
  
  
    (1/11) | 9.1%
  
  
    (1/11) | 
  | Total | 92.2%
  
  
    (119/129) | 93.5%
  
  
    (58/62) | 99%
  
  
    (1157/1169) | 
 package org.umlg.sqlg.test.process.dropstep;
 
 import org.apache.commons.collections4.set.ListOrderedSet;
 import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
 import org.apache.tinkerpop.gremlin.process.traversal.P;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.MutationListener;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.EventStrategy;
 import org.apache.tinkerpop.gremlin.structure.*;
 import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertex;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 import org.hamcrest.CoreMatchers;
 import org.hamcrest.MatcherAssert;
 import org.hamcrest.core.IsInstanceOf;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.umlg.sqlg.structure.PropertyType;
 import org.umlg.sqlg.structure.*;
 import org.umlg.sqlg.structure.topology.EdgeDefinition;
 import org.umlg.sqlg.structure.topology.EdgeLabel;
 import org.umlg.sqlg.structure.topology.Schema;
 import org.umlg.sqlg.structure.topology.VertexLabel;
 import org.umlg.sqlg.test.BaseTest;
 
 import java.util.*;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
  * @author <a href="https://github.com/pietermartin">Pieter Martin</a>
  * Date: 2017/11/11
  */
 @SuppressWarnings({"DuplicatedCode", "unchecked", "unused", "rawtypes"})
 @RunWith(Parameterized.class)
 public class TestDropStep extends BaseTest {
 
     @Parameterized.Parameter
     public Boolean fkOn;
     @Parameterized.Parameter(1)
     public Boolean mutatingCallback;
     private final List<Vertex> removedVertices = new ArrayList<>();
     private final List<Edge> removedEdges = new ArrayList<>();
     private GraphTraversalSource dropTraversal;
 
     @Parameterized.Parameters(name = "foreign key implement foreign keys: {0}, callback {1}")
     public static Collection<Object[]> data() {
         return Arrays.asList(new Object[]{Boolean.TRUE, Boolean.FALSE}, new Object[]{Boolean.FALSE, Boolean.FALSE},
                 new Object[]{Boolean.TRUE, Boolean.TRUE}, new Object[]{Boolean.FALSE, Boolean.TRUE});
 //        return Collections.singletonList(new Object[]{Boolean.FALSE, Boolean.FALSE});
 //        return Collections.singletonList(new Object[]{Boolean.TRUE, Boolean.TRUE});
     }
 
 
     @Before
     public void before() throws Exception {
         super.before();
         configuration.setProperty("implement.foreign.keys", this.fkOn);
         this.removedVertices.clear();
         if (this.mutatingCallback) {
 //            Assume.assumeTrue(this.sqlgGraph.getSqlDialect().supportReturningDeletedRows());
             final MutationListener listener = new AbstractMutationListener() {
                 @Override
                 public void vertexRemoved(final Vertex vertex) {
                     removedVertices.add(vertex);
                 }
 
                 @Override
                 public void edgeRemoved(final Edge edge) {
                     removedEdges.add(edge);
                 }
             };
             final EventStrategy.Builder builder = EventStrategy.build().addListener(listener);
             EventStrategy eventStrategy = builder.create();
             this.dropTraversal = this.sqlgGraph.traversal();
             if (this.mutatingCallback) {
                 this.dropTraversal = this.dropTraversal.withStrategies(eventStrategy);
             }
         } else {
             this.dropTraversal = this.sqlgGraph.traversal();
         }
     }
 
     @Test
     public void testMultiplicityWithCountAcrossSchemasDropEdges_1() {
         Schema aSchema = this.sqlgGraph.getTopology().ensureSchemaExist("A");
         Schema bSchema = this.sqlgGraph.getTopology().ensureSchemaExist("B");
         VertexLabel aVertexLabel = aSchema.ensureVertexLabelExist("A",
                 new HashMap<>() {{
                     put("id1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("id2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(List.of("id1", "id2"))
         );
         VertexLabel bVertexLabel = bSchema.ensureVertexLabelExist("B",
                 new HashMap<>() {{
                     put("di1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("di2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(List.of("di1", "di2"))
         );
         EdgeLabel edgeLabel = aVertexLabel.ensureEdgeLabelExist("ab", bVertexLabel,
                 EdgeDefinition.of(
                         Multiplicity.of(0, 1),
                         Multiplicity.of(4, 5))
         );
         this.sqlgGraph.tx().commit();
 
         Vertex a = this.sqlgGraph.addVertex(T.label, "A.A", "id1", "1", "id2", "1");
         Vertex b1 = this.sqlgGraph.addVertex(T.label, "B.B", "di1", "1", "di2", "1");
         Vertex b2 = this.sqlgGraph.addVertex(T.label, "B.B", "di1", "1", "di2", "2");
         Vertex b3 = this.sqlgGraph.addVertex(T.label, "B.B", "di1", "1", "di2", "3");
         Vertex b4 = this.sqlgGraph.addVertex(T.label, "B.B", "di1", "1", "di2", "4");
         Vertex b5 = this.sqlgGraph.addVertex(T.label, "B.B", "di1", "1", "di2", "5");
         Edge edge1 = a.addEdge("ab", b1);
         Edge edge2 = a.addEdge("ab", b2);
         Edge edge3 = a.addEdge("ab", b3);
         a.addEdge("ab", b4);
         a.addEdge("ab", b5);
         this.sqlgGraph.tx().commit();
 
         this.sqlgGraph.traversal().V().hasLabel("A.A").out().toList();
 
         this.sqlgGraph.traversal().V().hasLabel("A.A").outE().hasId(P.within(edge1.id(), edge2.id(), edge3.id())).drop().iterate();
         this.sqlgGraph.tx().rollback();
     }
 
     @Test
     public void testUserSuppliedIdsWithinID() {
         this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "PolicyDiscrepancy",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         this.sqlgGraph.tx().commit();
         for (int i = 0; i < 10; i++) {
             this.sqlgGraph.addVertex(T.label, "PolicyDiscrepancy",
                     "uid1", "uid1" + i,
                     "uid2", "uid2" + i,
                     "name", "name" + i
             );
         }
         this.sqlgGraph.tx().commit();
         Assert.assertEquals(10, this.sqlgGraph.traversal().V().hasLabel("PolicyDiscrepancy").toList().size(), 0);
 
         sqlgGraph.traversal().V()
                 .hasLabel("PolicyDiscrepancy")
                 .has("uid1", "uid10")
                 .has("uid2", "uid20")
                 .drop().iterate();
         this.sqlgGraph.tx().commit();
 
         Assert.assertEquals(9, this.sqlgGraph.traversal().V().hasLabel("PolicyDiscrepancy").toList().size(), 0);
 
         List<String> uids = Arrays.asList("uid11", "uid12", "uid13");
         sqlgGraph.traversal().V()
                 .hasLabel("PolicyDiscrepancy")
                 .has("uid1", P.within(uids))
                 .drop().iterate();
         this.sqlgGraph.tx().commit();
 
         Assert.assertEquals(6, this.sqlgGraph.traversal().V().hasLabel("PolicyDiscrepancy").toList().size(), 0);
     }
 
     @Test
     public void testNormalAndUserSuppliedIdsIn() {
         VertexLabel aVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "A",
                 new LinkedHashMap<>() {{
                     put("uid", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Collections.singletonList("uid"))
         );
         VertexLabel bVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "B",
                 new LinkedHashMap<>() {{
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }}
         );
         aVertexLabel.ensureEdgeLabelExist(
                 "ab",
                 bVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Collections.singletonList("uid"))
         );
         this.sqlgGraph.tx().commit();
 
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "uid", "uid1", "name", "name1");
         Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "name1");
         Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "name2");
         a1.addEdge("ab", b1, "uid", "uid1");
         a1.addEdge("ab", b2, "uid", "uid2");
         this.sqlgGraph.tx().commit();
 
         Assert.assertEquals(2, this.sqlgGraph.traversal().V().hasLabel("A").out().toList().size(), 0);
         Assert.assertEquals(2, this.sqlgGraph.traversal().V().hasLabel("B").toList().size(), 0);
 
 
         this.sqlgGraph.traversal().V()
                 .hasLabel("B")
                 .has("name", P.within("name1"))
                 .drop().iterate();
         this.sqlgGraph.tx().commit();
 
         Assert.assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("B").toList().size(), 0);
     }
 
     @Test
     public void testNormalAndUserSuppliedIdsOut() {
         VertexLabel aVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "A",
                 new LinkedHashMap<>() {{
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }}
         );
         VertexLabel bVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "B",
                 new LinkedHashMap<>() {{
                     put("uid", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Collections.singletonList("uid"))
         );
         aVertexLabel.ensureEdgeLabelExist(
                 "ab",
                 bVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Collections.singletonList("uid"))
         );
         this.sqlgGraph.tx().commit();
 
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "name1");
         Vertex b1 = this.sqlgGraph.addVertex(T.label, "B","uid", "uid1",  "name", "name1");
         Vertex b2 = this.sqlgGraph.addVertex(T.label, "B","uid", "uid2",  "name", "name2");
         a1.addEdge("ab", b1, "uid", "uid1");
         a1.addEdge("ab", b2, "uid", "uid2");
         this.sqlgGraph.tx().commit();
 
         Assert.assertEquals(2, this.sqlgGraph.traversal().V().hasLabel("A").out().toList().size(), 0);
         Assert.assertEquals(2, this.sqlgGraph.traversal().V().hasLabel("B").toList().size(), 0);
 
 
         this.sqlgGraph.traversal().V()
                 .hasLabel("A")
                 .has("name", P.within("name1"))
                 .drop().iterate();
         this.sqlgGraph.tx().commit();
 
         Assert.assertEquals(0, this.sqlgGraph.traversal().V().hasLabel("A").toList().size(), 0);
         Assert.assertEquals(2, this.sqlgGraph.traversal().V().hasLabel("B").toList().size(), 0);
         Assert.assertEquals(0, this.sqlgGraph.traversal().E().hasLabel("ab").toList().size(), 0);
     }
 
     @Test
     public void testUserSuppliedDrop() {
         this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "A",
                 new LinkedHashMap<>() {{
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         this.sqlgGraph.tx().commit();
 
         String uid1 = UUID.randomUUID().toString();
         String uid2 = UUID.randomUUID().toString();
         this.sqlgGraph.addVertex(T.label, "A", "uid1", uid1, "uid2", uid2, "name", "a1");
         this.sqlgGraph.addVertex(T.label, "A", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "a2");
         this.sqlgGraph.addVertex(T.label, "A", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "a3");
         this.sqlgGraph.tx().commit();
         Assert.assertEquals(3, this.sqlgGraph.traversal().V().hasLabel("A").count().next(), 0);
 
         SchemaTable schemaTable = SchemaTable.of(this.sqlgGraph.getSqlDialect().getPublicSchema(), "A");
         this.sqlgGraph.traversal().V().hasLabel("A")
                 .hasId(RecordId.from(sqlgGraph, schemaTable.getSchema() + "." + schemaTable.getTable() + RecordId.RECORD_ID_DELIMITER + "[" + uid1 + "," + uid2 + "]"))
                 .drop().iterate();
         Assert.assertEquals(2, this.sqlgGraph.traversal().V().hasLabel("A").count().next(), 0);
 
         this.sqlgGraph.addVertex(T.label, "A", "uid1", uid1, "uid2", uid2, "name", "a1");
         this.sqlgGraph.tx().commit();
         Assert.assertEquals(3, this.sqlgGraph.traversal().V().hasLabel("A").count().next(), 0);
 
         this.sqlgGraph.traversal().V().hasLabel("A")
                 .has("name", "a1")
                 .drop().iterate();
         Assert.assertEquals(2, this.sqlgGraph.traversal().V().hasLabel("A").count().next(), 0);
     }
 
     @Test
     public void g_V_properties_drop() {
         loadModern();
         final Traversal<Vertex, VertexProperty<?>> traversal = (Traversal) this.sqlgGraph.traversal().V().properties().drop();
         printTraversalForm(traversal);
         Assert.assertFalse(traversal.hasNext());
         Assert.assertEquals(6, IteratorUtils.count(this.sqlgGraph.traversal().V()));
         Assert.assertEquals(6, IteratorUtils.count(this.sqlgGraph.traversal().E()));
         this.sqlgGraph.traversal().V().forEachRemaining(vertex -> Assert.assertEquals(0, IteratorUtils.count(vertex.properties())));
     }
 
     @Test
     public void shouldReferenceVertexWhenRemoved() {
         final AtomicBoolean triggered = new AtomicBoolean(false);
         final Vertex v = this.sqlgGraph.addVertex();
         final String label = v.label();
         final Object id = v.id();
 
         final MutationListener listener = new AbstractMutationListener() {
             @Override
             public void vertexRemoved(final Vertex element) {
                 MatcherAssert.assertThat(element, IsInstanceOf.instanceOf(ReferenceVertex.class));
                 Assert.assertEquals(id, element.id());
                 Assert.assertEquals(label, element.label());
                 triggered.set(true);
             }
         };
         final EventStrategy.Builder builder = EventStrategy.build().addListener(listener)
             .detach(EventStrategy.Detachment.REFERENCE);
 
         if (this.sqlgGraph.features().graph().supportsTransactions())
             builder.eventQueue(new EventStrategy.TransactionalEventQueue(this.sqlgGraph));
 
         final EventStrategy eventStrategy = builder.create();
         final GraphTraversalSource gts = this.sqlgGraph.traversal().withStrategies(eventStrategy);
 
         gts.V(v).drop().iterate();
         this.sqlgGraph.tx().commit();
 
         AbstractGremlinTest.assertVertexEdgeCounts(this.sqlgGraph, 0, 0);
         MatcherAssert.assertThat(triggered.get(), CoreMatchers.is(true));
     }
 
     @Test
     public void shouldReferenceVertexWhenRemovedUserSuppliedIds() {
 
         this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "A",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2")));
         this.sqlgGraph.tx().commit();
 
         final AtomicBoolean triggered = new AtomicBoolean(false);
         final Vertex v = this.sqlgGraph.addVertex(T.label, "A", "uid1", "1", "uid2", "2");
         final String label = v.label();
         final Object id = v.id();
 
         final MutationListener listener = new AbstractMutationListener() {
             @Override
             public void vertexRemoved(final Vertex element) {
                 MatcherAssert.assertThat(element, IsInstanceOf.instanceOf(ReferenceVertex.class));
                 Assert.assertEquals(id, element.id());
                 Assert.assertEquals(label, element.label());
                 triggered.set(true);
             }
         };
         final EventStrategy.Builder builder = EventStrategy.build().addListener(listener)
             .detach(EventStrategy.Detachment.REFERENCE);
 
         if (this.sqlgGraph.features().graph().supportsTransactions())
             builder.eventQueue(new EventStrategy.TransactionalEventQueue(this.sqlgGraph));
 
         final EventStrategy eventStrategy = builder.create();
         final GraphTraversalSource gts = this.sqlgGraph.traversal().withStrategies(eventStrategy);
 
         gts.V(v).drop().iterate();
         this.sqlgGraph.tx().commit();
 
         AbstractGremlinTest.assertVertexEdgeCounts(this.sqlgGraph, 0, 0);
         MatcherAssert.assertThat(triggered.get(), CoreMatchers.is(true));
     }
 
     @Test
     public void testDropStep() {
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
         Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
         Vertex a3 = this.sqlgGraph.addVertex(T.label, "A", "name", "a3");
         this.sqlgGraph.tx().commit();
 
         this.dropTraversal.V().hasLabel("A").has("name", "a1").drop().iterate();
         this.sqlgGraph.tx().commit();
         List<Vertex> vertices = this.sqlgGraph.traversal().V().hasLabel("A").toList();
         Assert.assertEquals(2, vertices.size());
         Assert.assertTrue(vertices.containsAll(Arrays.asList(a2, a3)));
         if (this.mutatingCallback) {
             Assert.assertEquals(1, this.removedVertices.size());
             Assert.assertTrue(this.removedVertices.contains(a1));
         }
     }
 
     @Test
     public void testDropStepUserSuppliedIds() {
         this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "A",
                 new LinkedHashMap<>() {{
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                     put("uid", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Collections.singletonList("uid"))
         );
         this.sqlgGraph.tx().commit();
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "uid", UUID.randomUUID().toString(), "name", "a1");
         Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "uid", UUID.randomUUID().toString(), "name", "a2");
         Vertex a3 = this.sqlgGraph.addVertex(T.label, "A", "uid", UUID.randomUUID().toString(), "name", "a3");
         this.sqlgGraph.tx().commit();
 
         this.dropTraversal.V().hasLabel("A").has("name", "a1").drop().iterate();
         this.sqlgGraph.tx().commit();
         List<Vertex> vertices = this.sqlgGraph.traversal().V().hasLabel("A").toList();
         Assert.assertEquals(2, vertices.size());
         Assert.assertTrue(vertices.containsAll(Arrays.asList(a2, a3)));
         if (this.mutatingCallback) {
             Assert.assertEquals(1, this.removedVertices.size());
             Assert.assertTrue(this.removedVertices.contains(a1));
         }
     }
 
     @Test
     public void testDropStepRepeat1() {
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A");
         Vertex b1 = this.sqlgGraph.addVertex(T.label, "B");
         Vertex c1 = this.sqlgGraph.addVertex(T.label, "C");
         Vertex d1 = this.sqlgGraph.addVertex(T.label, "D");
         a1.addEdge("ab", b1);
         b1.addEdge("bc", c1);
         c1.addEdge("cd", d1);
         this.sqlgGraph.tx().commit();
 
         this.dropTraversal.V().hasLabel("A")
                 .repeat(__.out())
                 .times(3)
                 .drop()
                 .iterate();
         this.sqlgGraph.tx().commit();
 
         Assert.assertFalse(this.sqlgGraph.traversal().V().hasLabel("D").hasNext());
         Assert.assertFalse(this.sqlgGraph.traversal().E().hasLabel("cd").hasNext());
         if (this.mutatingCallback) {
             Assert.assertEquals(1, this.removedVertices.size());
             Assert.assertEquals(1, this.removedEdges.size());
         }
     }
 
     @Test
     public void testDropStepRepeat1UserSuppliedIds() {
         VertexLabel aVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "A",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         VertexLabel bVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "B",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         VertexLabel cVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "C",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         VertexLabel dVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "D",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         aVertexLabel.ensureEdgeLabelExist(
                 "ab",
                 bVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         bVertexLabel.ensureEdgeLabelExist(
                 "bc",
                 cVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         cVertexLabel.ensureEdgeLabelExist(
                 "cd",
                 dVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
 
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         Vertex d1 = this.sqlgGraph.addVertex(T.label, "D", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         a1.addEdge("ab", b1, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         b1.addEdge("bc", c1, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         c1.addEdge("cd", d1, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         this.sqlgGraph.tx().commit();
 
         this.dropTraversal.V().hasLabel("A")
                 .repeat(__.out())
                 .times(3)
                 .drop()
                 .iterate();
         this.sqlgGraph.tx().commit();
 
         Assert.assertFalse(this.sqlgGraph.traversal().V().hasLabel("D").hasNext());
         Assert.assertFalse(this.sqlgGraph.traversal().E().hasLabel("cd").hasNext());
         if (this.mutatingCallback) {
             Assert.assertEquals(1, this.removedVertices.size());
             Assert.assertEquals(1, this.removedEdges.size());
         }
     }
 
 
     @Test
     public void testDuplicatePath() {
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
         Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
         a1.addEdge("aaa", a2);
         this.sqlgGraph.tx().commit();
 
         List<Vertex> vertices = this.sqlgGraph.traversal().V().hasLabel("A").out().toList();
         Assert.assertEquals(1, vertices.size());
     }
 
     @Test
     public void testAsWithDuplicatePaths() throws InterruptedException {
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "Person", "name", "a1");
         Vertex a2 = this.sqlgGraph.addVertex(T.label, "Person", "name", "a2");
         Edge e1 = a1.addEdge("friend", a2, "weight", 5);
         this.sqlgGraph.tx().commit();
 
         testAsWithDuplicatePaths_assert(this.sqlgGraph, a1, e1);
         if (this.sqlgGraph1 != null) {
             Thread.sleep(SLEEP_TIME);
             testAsWithDuplicatePaths_assert(this.sqlgGraph1, a1, e1);
         }
     }
 
     private void testAsWithDuplicatePaths_assert(SqlgGraph sqlgGraph, Vertex a1, Edge e1) {
         DefaultGraphTraversal<Vertex, Map<String, Element>> gt = (DefaultGraphTraversal<Vertex, Map<String, Element>>) sqlgGraph.traversal()
                 .V(a1)
                 .outE().as("e")
                 .inV()
                 .in().as("v")
                 .<Element>select("e", "v");
         Assert.assertEquals(5, gt.getSteps().size());
 
         List<Map<String, Element>> result = gt.toList();
         Assert.assertEquals(2, gt.getSteps().size());
         Assert.assertEquals(1, result.size());
         Assert.assertEquals(e1, result.get(0).get("e"));
         Assert.assertEquals(a1, result.get(0).get("v"));
     }
 
 
     @Test
     public void testDropStepRepeat2() {
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A");
         Vertex b1 = this.sqlgGraph.addVertex(T.label, "B");
         Vertex c1 = this.sqlgGraph.addVertex(T.label, "C");
         Vertex d1 = this.sqlgGraph.addVertex(T.label, "D");
         a1.addEdge("ab", b1);
         b1.addEdge("bc", c1);
         c1.addEdge("cd", d1);
         Vertex a2 = this.sqlgGraph.addVertex(T.label, "A");
         Vertex b2 = this.sqlgGraph.addVertex(T.label, "B");
         Vertex c2 = this.sqlgGraph.addVertex(T.label, "C");
         Vertex d2 = this.sqlgGraph.addVertex(T.label, "D");
         b2.addEdge("ab", a2);
         c2.addEdge("bc", b2);
         d2.addEdge("cd", c2);
         this.sqlgGraph.tx().commit();
 
         this.dropTraversal.V().hasLabel("A")
                 .repeat(__.out()).times(3)
                 .drop()
                 .iterate();
         this.sqlgGraph.tx().commit();
 
         Assert.assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("D").count().next(), 0);
 
         if (this.mutatingCallback) {
             Assert.assertEquals(1, this.removedVertices.size());
             Assert.assertEquals(1, this.removedEdges.size());
         }
 
         this.dropTraversal.V().hasLabel("A")
                 .repeat(__.in()).times(3)
                 .drop()
                 .iterate();
         this.sqlgGraph.tx().commit();
 
         Assert.assertEquals(0, this.sqlgGraph.traversal().V().hasLabel("D").count().next(), 0);
         if (this.mutatingCallback) {
             Assert.assertEquals(2, this.removedVertices.size());
             Assert.assertEquals(2, this.removedEdges.size());
         }
     }
 
     @Test
     public void testDropStepRepeat2UserSuppliedIds() {
         VertexLabel aVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "A",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         VertexLabel bVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "B",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         VertexLabel cVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "C",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         VertexLabel dVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "D",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         aVertexLabel.ensureEdgeLabelExist(
                 "ab",
                 bVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         bVertexLabel.ensureEdgeLabelExist(
                 "bc",
                 cVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         cVertexLabel.ensureEdgeLabelExist(
                 "cd",
                 dVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
 
         bVertexLabel.ensureEdgeLabelExist(
                 "ab",
                 aVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         cVertexLabel.ensureEdgeLabelExist(
                 "bc",
                 bVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         dVertexLabel.ensureEdgeLabelExist(
                 "cd",
                 cVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         this.sqlgGraph.tx().commit();
 
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         Vertex d1 = this.sqlgGraph.addVertex(T.label, "D", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         a1.addEdge("ab", b1, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         b1.addEdge("bc", c1, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         c1.addEdge("cd", d1, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         Vertex d2 = this.sqlgGraph.addVertex(T.label, "D", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         b2.addEdge("ab", a2, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         c2.addEdge("bc", b2, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         d2.addEdge("cd", c2, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         this.sqlgGraph.tx().commit();
 
         this.dropTraversal.V().hasLabel("A")
                 .repeat(__.out()).times(3)
                 .drop()
                 .iterate();
         this.sqlgGraph.tx().commit();
 
         Assert.assertEquals(1, this.sqlgGraph.traversal().V().hasLabel("D").count().next(), 0);
 
         if (this.mutatingCallback) {
             Assert.assertEquals(1, this.removedVertices.size());
             Assert.assertEquals(1, this.removedEdges.size());
         }
 
         this.dropTraversal.V().hasLabel("A")
                 .repeat(__.in()).times(3)
                 .drop()
                 .iterate();
         this.sqlgGraph.tx().commit();
 
         Assert.assertEquals(0, this.sqlgGraph.traversal().V().hasLabel("D").count().next(), 0);
         if (this.mutatingCallback) {
             Assert.assertEquals(2, this.removedVertices.size());
             Assert.assertEquals(2, this.removedEdges.size());
         }
     }
 
     @Test
     public void testDropStepWithJoin() {
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
         Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
         Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
         Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "name", "b3");
         Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1");
         Edge e1 = a1.addEdge("ab", b1);
         Edge e2 = a1.addEdge("ab", b2);
         Edge e3 = a1.addEdge("ab", b3);
         Edge e4 = b1.addEdge("bc", c1);
         Edge e5 = b2.addEdge("bc", c1);
         Edge e6 = b3.addEdge("bc", c1);
         this.sqlgGraph.tx().commit();
 
         this.dropTraversal
                 .V().hasLabel("A").as("a")
                 .out("ab").has("name", "b2")
                 .drop().iterate();
         this.sqlgGraph.tx().commit();
 
         List<Vertex> vertices = this.sqlgGraph.traversal().V().hasLabel("A").out("ab").toList();
         Assert.assertEquals(2, vertices.size());
         Assert.assertTrue(vertices.containsAll(Arrays.asList(b1, b3)));
         vertices = this.sqlgGraph.traversal().V().hasLabel("B").toList();
         Assert.assertEquals(2, vertices.size());
         Assert.assertTrue(vertices.containsAll(Arrays.asList(b1, b3)));
         List<Edge> edges = this.sqlgGraph.traversal().E().hasLabel("ab").toList();
         Assert.assertEquals(2, edges.size());
         Assert.assertTrue(edges.containsAll(Arrays.asList(e1, e3)));
 
         if (this.mutatingCallback) {
             Assert.assertEquals(1, this.removedVertices.size());
             Assert.assertTrue(this.removedVertices.contains(b2));
             Assert.assertTrue(this.removedEdges.contains(e2));
         }
     }
 
     @Test
     public void testDropStepWithJoinWithuserSuppliedIds() {
         VertexLabel aVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "A",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         VertexLabel bVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "B",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         VertexLabel cVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "C",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         aVertexLabel.ensureEdgeLabelExist(
                 "ab",
                 bVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         bVertexLabel.ensureEdgeLabelExist(
                 "bc",
                 cVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         this.sqlgGraph.tx().commit();
 
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "a1");
         Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "b1");
         Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "b2");
         Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "b3");
         Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "c1");
         Edge e1 = a1.addEdge("ab", b1, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         Edge e2 = a1.addEdge("ab", b2, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         Edge e3 = a1.addEdge("ab", b3, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         Edge e4 = b1.addEdge("bc", c1, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         Edge e5 = b2.addEdge("bc", c1, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         Edge e6 = b3.addEdge("bc", c1, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         this.sqlgGraph.tx().commit();
 
         this.dropTraversal
                 .V().hasLabel("A").as("a")
                 .out("ab").has("name", "b2")
                 .drop().iterate();
         this.sqlgGraph.tx().commit();
 
         List<Vertex> vertices = this.sqlgGraph.traversal().V().hasLabel("A").out("ab").toList();
         Assert.assertEquals(2, vertices.size());
         Assert.assertTrue(vertices.containsAll(Arrays.asList(b1, b3)));
         vertices = this.sqlgGraph.traversal().V().hasLabel("B").toList();
         Assert.assertEquals(2, vertices.size());
         Assert.assertTrue(vertices.containsAll(Arrays.asList(b1, b3)));
         List<Edge> edges = this.sqlgGraph.traversal().E().hasLabel("ab").toList();
         Assert.assertEquals(2, edges.size());
         Assert.assertTrue(edges.containsAll(Arrays.asList(e1, e3)));
 
         if (this.mutatingCallback) {
             Assert.assertEquals(1, this.removedVertices.size());
             Assert.assertTrue(this.removedVertices.contains(b2));
             Assert.assertTrue(this.removedEdges.contains(e2));
         }
     }
 
     @Test
     public void testDropEdges() {
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
         Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
         Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
         Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "name", "b3");
         Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1");
         Edge e1 = a1.addEdge("ab", b1);
         Edge e2 = a1.addEdge("ab", b2);
         Edge e3 = a1.addEdge("ab", b3);
         Edge e4 = b1.addEdge("bc", c1);
         Edge e5 = b2.addEdge("bc", c1);
         Edge e6 = b3.addEdge("bc", c1);
 
         this.sqlgGraph.tx().commit();
 
         this.dropTraversal
                 .V().hasLabel("A").as("a")
                 .outE("ab")
                 .drop().iterate();
         this.sqlgGraph.tx().commit();
 
         Assert.assertFalse(this.sqlgGraph.traversal().E().hasLabel("ab").hasNext());
         Assert.assertEquals(3L, this.sqlgGraph.traversal().E().hasLabel("bc").count().next(), 0L);
         if (this.mutatingCallback) {
             Assert.assertEquals(3, this.removedEdges.size());
             Assert.assertEquals(0, this.removedVertices.size());
             Assert.assertTrue(this.removedEdges.containsAll(Arrays.asList(e1, e2, e3)));
         }
     }
 
     @Test
     public void testDropEdgesUserSuppliedIds() {
         VertexLabel aVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "A",
                 new LinkedHashMap<>() {{
                     put("uid", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Collections.singletonList("uid"))
         );
         VertexLabel bVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "B",
                 new LinkedHashMap<>() {{
                     put("uid", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Collections.singletonList("uid"))
         );
         VertexLabel cVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "C",
                 new LinkedHashMap<>() {{
                     put("uid", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Collections.singletonList("uid"))
         );
         aVertexLabel.ensureEdgeLabelExist(
                 "ab",
                 bVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Collections.singletonList("uid"))
         );
         bVertexLabel.ensureEdgeLabelExist(
                 "bc",
                 cVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Collections.singletonList("uid"))
         );
 
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "uid", UUID.randomUUID().toString(), "name", "a1");
         Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "uid", UUID.randomUUID().toString(), "name", "b1");
         Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "uid", UUID.randomUUID().toString(), "name", "b2");
         Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "uid", UUID.randomUUID().toString(), "name", "b3");
         Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "uid", UUID.randomUUID().toString(), "name", "c1");
         Edge e1 = a1.addEdge("ab", b1, "uid", UUID.randomUUID().toString());
         Edge e2 = a1.addEdge("ab", b2, "uid", UUID.randomUUID().toString());
         Edge e3 = a1.addEdge("ab", b3, "uid", UUID.randomUUID().toString());
         Edge e4 = b1.addEdge("bc", c1, "uid", UUID.randomUUID().toString());
         Edge e5 = b2.addEdge("bc", c1, "uid", UUID.randomUUID().toString());
         Edge e6 = b3.addEdge("bc", c1, "uid", UUID.randomUUID().toString());
 
         this.sqlgGraph.tx().commit();
 
         this.dropTraversal
                 .V().hasLabel("A").as("a")
                 .outE("ab")
                 .drop().iterate();
         this.sqlgGraph.tx().commit();
 
         Assert.assertFalse(this.sqlgGraph.traversal().E().hasLabel("ab").hasNext());
         Assert.assertEquals(3L, this.sqlgGraph.traversal().E().hasLabel("bc").count().next(), 0L);
         if (this.mutatingCallback) {
             Assert.assertEquals(3, this.removedEdges.size());
             Assert.assertEquals(0, this.removedVertices.size());
             Assert.assertTrue(this.removedEdges.containsAll(Arrays.asList(e1, e2, e3)));
         }
     }
 
     @Test
     public void dropAll() {
         loadModern(this.sqlgGraph);
         this.dropTraversal.V().drop().iterate();
         this.sqlgGraph.tx().commit();
         Assert.assertFalse(this.dropTraversal.V().hasNext());
         Assert.assertEquals(0, IteratorUtils.count(this.sqlgGraph.traversal().V()));
         Assert.assertEquals(0, IteratorUtils.count(this.sqlgGraph.traversal().E()));
         if (this.mutatingCallback) {
             Assert.assertEquals(6, this.removedVertices.size());
             Assert.assertEquals(6, this.removedEdges.size());
         }
     }
 
     @Test
     public void dropAllEdges() {
         loadModern(this.sqlgGraph);
         this.dropTraversal.E().drop().iterate();
         Assert.assertFalse(this.dropTraversal.E().hasNext());
         this.sqlgGraph.tx().commit();
         Assert.assertEquals(6, IteratorUtils.count(this.sqlgGraph.traversal().V()));
         Assert.assertEquals(0, IteratorUtils.count(this.sqlgGraph.traversal().E()));
         if (this.mutatingCallback) {
             Assert.assertEquals(0, this.removedVertices.size());
             Assert.assertEquals(6, this.removedEdges.size());
         }
     }
 
 
     @Test
     public void dropMultiplePathsToVertices() {
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
         Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
         Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
         Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
         Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "name", "b3");
         Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1");
         Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2");
         Vertex c3 = this.sqlgGraph.addVertex(T.label, "C", "name", "c3");
         Vertex c4 = this.sqlgGraph.addVertex(T.label, "C", "name", "c4");
         Vertex c5 = this.sqlgGraph.addVertex(T.label, "C", "name", "c5");
         a1.addEdge("ab", b1);
         a1.addEdge("ab", b2);
         b1.addEdge("bc", c1);
         b1.addEdge("bc", c2);
         b1.addEdge("bc", c3);
         b2.addEdge("bc", c3);
         b2.addEdge("bc", c4);
         b2.addEdge("bc", c5);
         this.sqlgGraph.tx().commit();
 
         List<Vertex> vertices = this.sqlgGraph.traversal().V().hasLabel("A")
                 .out()
                 .out()
                 .toList();
         Assert.assertEquals(6, vertices.size());
         Assert.assertTrue(vertices.removeAll(Arrays.asList(c1, c2, c3, c4, c5)));
         Assert.assertEquals(0, vertices.size());
 
         this.dropTraversal.V().hasLabel("A")
                 .out()
                 .out()
                 .drop()
                 .iterate();
         this.sqlgGraph.tx().commit();
 
         Assert.assertEquals(0L, this.sqlgGraph.traversal().V().hasLabel("C").count().next(), 0L);
         Assert.assertEquals(0L, this.sqlgGraph.traversal().E().hasLabel("bc").count().next(), 0L);
 
         if (this.mutatingCallback) {
             Assert.assertEquals(5, this.removedVertices.size());
             Assert.assertEquals(6, this.removedEdges.size());
         }
 
     }
 
     @Test
     public void dropMultiplePathsToVerticesUserSuppliedIds() {
         VertexLabel aVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "A",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         VertexLabel bVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "B",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         VertexLabel cVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "C",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         aVertexLabel.ensureEdgeLabelExist(
                 "ab",
                 bVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         bVertexLabel.ensureEdgeLabelExist(
                 "bc",
                 cVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         this.sqlgGraph.tx().commit();
 
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "a1");
         Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "a2");
         Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "b1");
         Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "b2");
         Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "b3");
         Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "c1");
         Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "c2");
         Vertex c3 = this.sqlgGraph.addVertex(T.label, "C", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "c3");
         Vertex c4 = this.sqlgGraph.addVertex(T.label, "C", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "c4");
         Vertex c5 = this.sqlgGraph.addVertex(T.label, "C", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "c5");
         a1.addEdge("ab", b1, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         a1.addEdge("ab", b2, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         b1.addEdge("bc", c1, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         b1.addEdge("bc", c2, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         b1.addEdge("bc", c3, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         b2.addEdge("bc", c3, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         b2.addEdge("bc", c4, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         b2.addEdge("bc", c5, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         this.sqlgGraph.tx().commit();
 
         List<Vertex> vertices = this.sqlgGraph.traversal().V().hasLabel("A")
                 .out()
                 .out()
                 .toList();
         Assert.assertEquals(6, vertices.size());
         Assert.assertTrue(vertices.removeAll(Arrays.asList(c1, c2, c3, c4, c5)));
         Assert.assertEquals(0, vertices.size());
 
         this.dropTraversal.V().hasLabel("A")
                 .out()
                 .out()
                 .drop()
                 .iterate();
         this.sqlgGraph.tx().commit();
 
         Assert.assertEquals(0L, this.sqlgGraph.traversal().V().hasLabel("C").count().next(), 0L);
         Assert.assertEquals(0L, this.sqlgGraph.traversal().E().hasLabel("bc").count().next(), 0L);
 
         if (this.mutatingCallback) {
             Assert.assertEquals(5, this.removedVertices.size());
             Assert.assertEquals(6, this.removedEdges.size());
         }
 
     }
 
     @Test
     public void dropMultiplePathsToVerticesWithHas() {
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
         Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
         Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
         Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
         Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "name", "b3");
         Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1");
         Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2");
         Vertex c3 = this.sqlgGraph.addVertex(T.label, "C", "name", "c3");
         Vertex c4 = this.sqlgGraph.addVertex(T.label, "C", "name", "c4");
         Vertex c5 = this.sqlgGraph.addVertex(T.label, "C", "name", "c5");
         a1.addEdge("ab", b1);
         a1.addEdge("ab", b2);
         b1.addEdge("bc", c1);
         b1.addEdge("bc", c2);
         b1.addEdge("bc", c3);
         b2.addEdge("bc", c3);
         b2.addEdge("bc", c4);
         b2.addEdge("bc", c5);
         this.sqlgGraph.tx().commit();
 
         List<Vertex> vertices = this.sqlgGraph.traversal().V().hasLabel("A")
                 .out()
                 .out().has("name", P.within("c1", "c2", "c3", "c4"))
                 .toList();
         Assert.assertEquals(5, vertices.size());
         Assert.assertTrue(vertices.removeAll(Arrays.asList(c1, c2, c3, c4)));
         Assert.assertEquals(0, vertices.size());
 
         this.dropTraversal.V().hasLabel("A")
                 .out()
                 .out().has("name", P.within("c1", "c2", "c3", "c4"))
                 .drop()
                 .iterate();
         this.sqlgGraph.tx().commit();
 
         Assert.assertEquals(1L, this.sqlgGraph.traversal().V().hasLabel("C").count().next(), 0L);
         Assert.assertEquals(1L, this.sqlgGraph.traversal().E().hasLabel("bc").count().next(), 0L);
 
         if (this.mutatingCallback) {
             Assert.assertEquals(4, this.removedVertices.size());
             Assert.assertEquals(5, this.removedEdges.size());
         }
     }
 
     @Test
     public void dropMultiplePathsToVerticesWithHasWithUserSuppliedIds() {
         VertexLabel aVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "A",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         VertexLabel bVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "B",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         VertexLabel cVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "C",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         aVertexLabel.ensureEdgeLabelExist(
                 "ab",
                 bVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         bVertexLabel.ensureEdgeLabelExist(
                 "bc",
                 cVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         this.sqlgGraph.tx().commit();
 
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "a1");
         Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "a2");
         Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "b1");
         Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "b2");
         Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "b3");
         Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "c1");
         Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "c2");
         Vertex c3 = this.sqlgGraph.addVertex(T.label, "C", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "c3");
         Vertex c4 = this.sqlgGraph.addVertex(T.label, "C", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "c4");
         Vertex c5 = this.sqlgGraph.addVertex(T.label, "C", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "c5");
         a1.addEdge("ab", b1, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         a1.addEdge("ab", b2, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         b1.addEdge("bc", c1, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         b1.addEdge("bc", c2, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         b1.addEdge("bc", c3, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         b2.addEdge("bc", c3, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         b2.addEdge("bc", c4, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         b2.addEdge("bc", c5, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         this.sqlgGraph.tx().commit();
 
         List<Vertex> vertices = this.sqlgGraph.traversal().V().hasLabel("A")
                 .out()
                 .out().has("name", P.within("c1", "c2", "c3", "c4"))
                 .toList();
         Assert.assertEquals(5, vertices.size());
         Assert.assertTrue(vertices.removeAll(Arrays.asList(c1, c2, c3, c4)));
         Assert.assertEquals(0, vertices.size());
 
         this.dropTraversal.V().hasLabel("A")
                 .out()
                 .out().has("name", P.within("c1", "c2", "c3", "c4"))
                 .drop()
                 .iterate();
         this.sqlgGraph.tx().commit();
 
         Assert.assertEquals(1L, this.sqlgGraph.traversal().V().hasLabel("C").count().next(), 0L);
         Assert.assertEquals(1L, this.sqlgGraph.traversal().E().hasLabel("bc").count().next(), 0L);
 
         if (this.mutatingCallback) {
             Assert.assertEquals(4, this.removedVertices.size());
             Assert.assertEquals(5, this.removedEdges.size());
         }
     }
 
     @Test
     public void testDropStepWithJoinVertexStep() {
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
         Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
         Vertex a3 = this.sqlgGraph.addVertex(T.label, "A", "name", "a3");
         Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
         Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
         Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "name", "b3");
         Edge e1 = a1.addEdge("ab", b1);
         Edge e2 = a1.addEdge("ab", b2);
         Edge e3 = a1.addEdge("ab", b3);
         this.sqlgGraph.tx().commit();
 
         this.dropTraversal
                 .V().hasLabel("A")
                 .local(
                         __.out("ab").has("name", "b2").drop()
                 )
                 .iterate();
         this.sqlgGraph.tx().commit();
 
         List<Vertex> vertices = this.sqlgGraph.traversal().V().hasLabel("A").out("ab").toList();
         Assert.assertEquals(2, vertices.size());
         Assert.assertTrue(vertices.containsAll(Arrays.asList(b1, b3)));
         vertices = this.sqlgGraph.traversal().V().hasLabel("B").toList();
         Assert.assertEquals(2, vertices.size());
         Assert.assertTrue(vertices.containsAll(Arrays.asList(b1, b3)));
         List<Edge> edges = this.sqlgGraph.traversal().E().hasLabel("ab").toList();
         Assert.assertEquals(2, edges.size());
         Assert.assertTrue(edges.containsAll(Arrays.asList(e1, e3)));
         if (this.mutatingCallback) {
             Assert.assertEquals(1, this.removedVertices.size());
             Assert.assertEquals(1, this.removedEdges.size());
         }
     }
 
     @Test
     public void testDropStepWithJoinVertexStepUserSuppliedIds() {
         VertexLabel aVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "A",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         VertexLabel bVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "B",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         aVertexLabel.ensureEdgeLabelExist(
                 "ab",
                 bVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         this.sqlgGraph.tx().commit();
 
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "a1");
         Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "a2");
         Vertex a3 = this.sqlgGraph.addVertex(T.label, "A", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "a3");
         Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "b1");
         Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "b2");
         Vertex b3 = this.sqlgGraph.addVertex(T.label, "B", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "b3");
         Edge e1 = a1.addEdge("ab", b1, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         Edge e2 = a1.addEdge("ab", b2, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         Edge e3 = a1.addEdge("ab", b3, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
         this.sqlgGraph.tx().commit();
 
         this.dropTraversal
                 .V().hasLabel("A")
                 .local(
                         __.out("ab").has("name", "b2").drop()
                 )
                 .iterate();
         this.sqlgGraph.tx().commit();
 
         List<Vertex> vertices = this.sqlgGraph.traversal().V().hasLabel("A").out("ab").toList();
         Assert.assertEquals(2, vertices.size());
         Assert.assertTrue(vertices.containsAll(Arrays.asList(b1, b3)));
         vertices = this.sqlgGraph.traversal().V().hasLabel("B").toList();
         Assert.assertEquals(2, vertices.size());
         Assert.assertTrue(vertices.containsAll(Arrays.asList(b1, b3)));
         List<Edge> edges = this.sqlgGraph.traversal().E().hasLabel("ab").toList();
         Assert.assertEquals(2, edges.size());
         Assert.assertTrue(edges.containsAll(Arrays.asList(e1, e3)));
         if (this.mutatingCallback) {
             Assert.assertEquals(1, this.removedVertices.size());
             Assert.assertEquals(1, this.removedEdges.size());
         }
     }
 
     @Test
     public void testDropOutMultiple() {
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
         Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
         a1.addEdge("e1", b1);
 
         Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "name", "a2");
         Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2");
         a2.addEdge("e1", c2);
 
         this.sqlgGraph.tx().commit();
 
         this.dropTraversal.V(a1, a2).out("e1").drop().iterate();
         this.dropTraversal.V(a1, a2).drop().iterate();
         this.sqlgGraph.tx().commit();
 
         List<Vertex> vertices = this.sqlgGraph.traversal().V().hasLabel("B").toList();
         Assert.assertEquals(0, vertices.size());
         vertices = this.sqlgGraph.traversal().V().hasLabel("C").toList();
         Assert.assertEquals(0, vertices.size());
         vertices = this.sqlgGraph.traversal().V().hasLabel("A").toList();
         Assert.assertEquals(0, vertices.size());
 
         if (this.mutatingCallback) {
             Assert.assertEquals(4, this.removedVertices.size());
             Assert.assertTrue(this.removedVertices.contains(b1));
             Assert.assertTrue(this.removedVertices.contains(c2));
             Assert.assertTrue(this.removedVertices.contains(a1));
             Assert.assertTrue(this.removedVertices.contains(a2));
         }
     }
 
     @Test
     public void testDropOutMultipleOneUserSuppliedId() {
         VertexLabel aVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "A",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Collections.singletonList("uid1"))
         );
         VertexLabel bVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "B",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Collections.singletonList("uid1"))
         );
         VertexLabel cVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "C",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Collections.singletonList("uid1"))
         );
         aVertexLabel.ensureEdgeLabelExist(
                 "e1",
                 bVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Collections.singletonList("uid1"))
         );
         aVertexLabel.ensureEdgeLabelExist(
                 "e1",
                 cVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Collections.singletonList("uid1"))
         );
         this.sqlgGraph.tx().commit();
 
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "uid1", "a1", "name", "a1");
         Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "uid1", "b1", "name", "b1");
         a1.addEdge("e1", b1, "uid1", "e1");
 
         Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "uid1", "a2", "name", "a2");
         Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "uid1", "c1", "name", "c2");
         a2.addEdge("e1", c2, "uid1", "e2");
 
         this.sqlgGraph.tx().commit();
 
         this.dropTraversal.V(a1, a2).out("e1").drop().iterate();
         this.dropTraversal.V(a1, a2).drop().iterate();
         this.sqlgGraph.tx().commit();
 
         List<Vertex> vertices = this.sqlgGraph.traversal().V().hasLabel("B").toList();
         Assert.assertEquals(0, vertices.size());
         vertices = this.sqlgGraph.traversal().V().hasLabel("C").toList();
         Assert.assertEquals(0, vertices.size());
         vertices = this.sqlgGraph.traversal().V().hasLabel("A").toList();
         Assert.assertEquals(0, vertices.size());
 
         if (this.mutatingCallback) {
             Assert.assertEquals(4, this.removedVertices.size());
             Assert.assertTrue(this.removedVertices.contains(b1));
             Assert.assertTrue(this.removedVertices.contains(c2));
             Assert.assertTrue(this.removedVertices.contains(a1));
             Assert.assertTrue(this.removedVertices.contains(a2));
         }
     }
 
     @Test
     public void testDropOutMultipleUserSuppliedIds() {
         VertexLabel aVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "A",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         VertexLabel bVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "B",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         VertexLabel cVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "C",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         aVertexLabel.ensureEdgeLabelExist(
                 "e1",
                 bVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         aVertexLabel.ensureEdgeLabelExist(
                 "e1",
                 cVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         this.sqlgGraph.tx().commit();
 
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "uid1", "a1", "uid2", "a11", "name", "a1");
         Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "uid1", "b1", "uid2", "b11", "name", "b1");
         a1.addEdge("e1", b1, "uid1", "e1", "uid2", "e11");
 
         Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "uid1", "a2", "uid2", "a22", "name", "a2");
         Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "uid1", "c1", "uid2", "c11", "name", "c2");
         a2.addEdge("e1", c2, "uid1", "e2", "uid2", "e22");
 
         this.sqlgGraph.tx().commit();
 
         this.dropTraversal.V(a1, a2).out("e1").drop().iterate();
         this.dropTraversal.V(a1, a2).drop().iterate();
         this.sqlgGraph.tx().commit();
 
         List<Vertex> vertices = this.sqlgGraph.traversal().V().hasLabel("B").toList();
         Assert.assertEquals(0, vertices.size());
         vertices = this.sqlgGraph.traversal().V().hasLabel("C").toList();
         Assert.assertEquals(0, vertices.size());
         vertices = this.sqlgGraph.traversal().V().hasLabel("A").toList();
         Assert.assertEquals(0, vertices.size());
 
         if (this.mutatingCallback) {
             Assert.assertEquals(4, this.removedVertices.size());
             Assert.assertTrue(this.removedVertices.contains(b1));
             Assert.assertTrue(this.removedVertices.contains(c2));
             Assert.assertTrue(this.removedVertices.contains(a1));
             Assert.assertTrue(this.removedVertices.contains(a2));
         }
     }
 
     @Test
     public void testDropOutMultipleUserSuppliedIdsSimpler() {
         VertexLabel aVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "A",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         VertexLabel bVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "B",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         VertexLabel cVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "C",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         aVertexLabel.ensureEdgeLabelExist(
                 "e1",
                 bVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         aVertexLabel.ensureEdgeLabelExist(
                 "e1",
                 cVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         this.sqlgGraph.tx().commit();
 
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "uid1", "a1", "uid2", "a11", "name", "a1");
         Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "uid1", "b1", "uid2", "b11", "name", "b1");
         a1.addEdge("e1", b1, "uid1", "e1", "uid2", "e11");
 
         Vertex a2 = this.sqlgGraph.addVertex(T.label, "A", "uid1", "a2", "uid2", "a22", "name", "a2");
         Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "uid1", "c1", "uid2", "c11", "name", "c2");
         a2.addEdge("e1", c2, "uid1", "e2", "uid2", "e22");
 
         this.sqlgGraph.tx().commit();
 
         List<Vertex> vertices = this.sqlgGraph.traversal().V(a1, a2).out("e1").toList();
         Assert.assertEquals(2, vertices.size());
     }
 
     @Test
     public void testDropOutMultipleAcrossSchemas() {
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A.A", "name", "a1");
         Vertex b1 = this.sqlgGraph.addVertex(T.label, "B.B", "name", "b1");
         a1.addEdge("e1", b1);
 
         Vertex a2 = this.sqlgGraph.addVertex(T.label, "A.A", "name", "a2");
         Vertex c2 = this.sqlgGraph.addVertex(T.label, "C.C", "name", "c2");
         a2.addEdge("e1", c2);
 
         this.sqlgGraph.tx().commit();
 
         this.dropTraversal.V(a1, a2).out("e1").drop().iterate();
         this.dropTraversal.V(a1, a2).drop().iterate();
         this.sqlgGraph.tx().commit();
 
         List<Vertex> vertices = this.sqlgGraph.traversal().V().hasLabel("B").toList();
         Assert.assertEquals(0, vertices.size());
         vertices = this.sqlgGraph.traversal().V().hasLabel("C").toList();
         Assert.assertEquals(0, vertices.size());
         vertices = this.sqlgGraph.traversal().V().hasLabel("A").toList();
         Assert.assertEquals(0, vertices.size());
 
         if (this.mutatingCallback) {
             Assert.assertEquals(4, this.removedVertices.size());
             Assert.assertTrue(this.removedVertices.contains(b1));
             Assert.assertTrue(this.removedVertices.contains(c2));
             Assert.assertTrue(this.removedVertices.contains(a1));
             Assert.assertTrue(this.removedVertices.contains(a2));
         }
     }
 
     @Test
     public void testDropOutMultipleAcrossSchemasuserSuppliedIds() {
         VertexLabel aVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "A",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         VertexLabel bVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "B",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         VertexLabel cVertexLabel = this.sqlgGraph.getTopology().getPublicSchema().ensureVertexLabelExist(
                 "C",
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("name", PropertyDefinition.of(PropertyType.STRING));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         aVertexLabel.ensureEdgeLabelExist(
                 "e1",
                 bVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         aVertexLabel.ensureEdgeLabelExist(
                 "e1",
                 cVertexLabel,
                 new LinkedHashMap<>() {{
                     put("uid1", PropertyDefinition.of(PropertyType.varChar(100)));
                     put("uid2", PropertyDefinition.of(PropertyType.varChar(100)));
                 }},
                 ListOrderedSet.listOrderedSet(Arrays.asList("uid1", "uid2"))
         );
         this.sqlgGraph.tx().commit();
 
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A.A", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "a1");
         Vertex b1 = this.sqlgGraph.addVertex(T.label, "B.B", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "b1");
         a1.addEdge("e1", b1, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
 
         Vertex a2 = this.sqlgGraph.addVertex(T.label, "A.A", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "a2");
         Vertex c2 = this.sqlgGraph.addVertex(T.label, "C.C", "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString(), "name", "c2");
         a2.addEdge("e1", c2, "uid1", UUID.randomUUID().toString(), "uid2", UUID.randomUUID().toString());
 
         this.sqlgGraph.tx().commit();
 
         this.dropTraversal.V(a1, a2).out("e1").drop().iterate();
         this.dropTraversal.V(a1, a2).drop().iterate();
         this.sqlgGraph.tx().commit();
 
         List<Vertex> vertices = this.sqlgGraph.traversal().V().hasLabel("B").toList();
         Assert.assertEquals(0, vertices.size());
         vertices = this.sqlgGraph.traversal().V().hasLabel("C").toList();
         Assert.assertEquals(0, vertices.size());
         vertices = this.sqlgGraph.traversal().V().hasLabel("A").toList();
         Assert.assertEquals(0, vertices.size());
 
         if (this.mutatingCallback) {
             Assert.assertEquals(4, this.removedVertices.size());
             Assert.assertTrue(this.removedVertices.contains(b1));
             Assert.assertTrue(this.removedVertices.contains(c2));
             Assert.assertTrue(this.removedVertices.contains(a1));
             Assert.assertTrue(this.removedVertices.contains(a2));
         }
     }
 
     @Test
     public void testOptionalAndDrop() {
         Vertex a1 = this.sqlgGraph.addVertex(T.label, "A", "name", "a1");
         Vertex b1 = this.sqlgGraph.addVertex(T.label, "B", "name", "b1");
         Vertex b2 = this.sqlgGraph.addVertex(T.label, "B", "name", "b2");
         a1.addEdge("ab", b1);
         a1.addEdge("ab", b2);
         Vertex c1 = this.sqlgGraph.addVertex(T.label, "C", "name", "c1");
         Vertex c2 = this.sqlgGraph.addVertex(T.label, "C", "name", "c2");
         b2.addEdge("bc", c1);
         b2.addEdge("bc", c2);
         this.sqlgGraph.tx().commit();
 
         this.sqlgGraph.traversal().V().hasLabel("A").out().optional(__.out()).drop().iterate();
         this.sqlgGraph.tx().commit();
 
         List<Vertex> vertices = this.sqlgGraph.traversal().V().toList();
         Assert.assertEquals(2, vertices.size());
         Assert.assertTrue(vertices.contains(a1));
         Assert.assertTrue(vertices.contains(b2));
     }
 
     static abstract class AbstractMutationListener implements MutationListener {
         @Override
         public void vertexAdded(final Vertex vertex) {
 
         }
 
         @Override
         public void vertexRemoved(final Vertex vertex) {
 
         }
 
         @Override
         public void vertexPropertyChanged(Vertex element, VertexProperty oldValue,
                                           Object setValue, Object... vertexPropertyKeyValues) {
 
         }
 
         @Override
         public void vertexPropertyRemoved(final VertexProperty vertexProperty) {
 
         }
 
         @Override
         public void edgeAdded(final Edge edge) {
 
         }
 
         @Override
         public void edgeRemoved(final Edge edge) {
 
         }
 
         @Override
         public void edgePropertyChanged(final Edge element, final Property oldValue, final Object setValue) {
 
         }
 
         @Override
         public void edgePropertyRemoved(final Edge element, final Property property) {
 
         }
 
         @Override
         public void vertexPropertyPropertyChanged(final VertexProperty element, final Property oldValue, final Object setValue) {
 
         }
 
         @Override
         public void vertexPropertyPropertyRemoved(final VertexProperty element, final Property property) {
 
         }
     }
 }