You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2015/05/01 16:59:28 UTC

[4/5] incubator-tinkerpop git commit: Multi-label steps complete. Cleaned up various aspects of the code base related to multi-labels in both steps and paths.

Multi-label steps complete. Cleaned up various aspects of the code base related to multi-labels in both steps and paths.


Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/036d6379
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/036d6379
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/036d6379

Branch: refs/heads/master
Commit: 036d6379201837f92c5e5255dc58ad284097e10d
Parents: 04928e1
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Fri May 1 08:58:58 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Fri May 1 08:58:58 2015 -0600

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  1 +
 .../gremlin/process/traversal/Path.java         |  2 +-
 .../gremlin/process/traversal/Step.java         | 10 ++--
 .../traversal/dsl/graph/GraphTraversal.java     | 30 +++++------
 .../gremlin/process/traversal/dsl/graph/__.java | 21 ++++----
 .../traversal/step/filter/WhereStep.java        | 52 ++++++++++----------
 .../process/traversal/step/map/PathStep.java    |  6 +--
 .../traversal/step/sideEffect/StartStep.java    |  6 +--
 .../traversal/step/util/AbstractStep.java       |  8 +--
 .../process/traversal/step/util/EmptyPath.java  |  3 +-
 .../step/util/ExpandableStepIterator.java       | 18 +++----
 .../traversal/step/util/HasContainer.java       | 43 ++++++++--------
 .../traversal/step/util/ImmutablePath.java      | 11 ++---
 .../traversal/step/util/MutablePath.java        | 13 +++--
 .../TraversalVerificationStrategy.java          | 13 +++--
 .../traverser/B_O_P_S_SE_SL_Traverser.java      | 13 ++---
 .../structure/util/detached/DetachedPath.java   |  2 +-
 .../structure/util/reference/ReferencePath.java |  2 +-
 .../process/traversal/step/util/PathTest.java   | 23 ++++-----
 19 files changed, 135 insertions(+), 142 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 35926dd..49d8f9c 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -25,6 +25,7 @@ image::http://www.tinkerpop.com/docs/current/images/gremlin-hindu.png[width=225]
 TinkerPop 3.0.0.M9 (NOT OFFICIALLY RELEASED YET)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
+* A `Step` now has a `Set<String>` of labels. Updated `as()` to take a var args of labels.
 * Dropped `BatchGraph` from the code base - it will be replaced by bulk loader functionality over OLAP.
 * `TraversalSideEffects` now implements `Optional` semantics. Less code as Java8 provides the helper methods.
 * `TraversalScriptSupplier` now takes an `Object` var args for setting `ScriptEngine` bindings if needed.

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java
index b83bd23..5ff3aa3 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java
@@ -54,7 +54,7 @@ public interface Path extends Cloneable {
      * @param labels the labels at the head of the path
      * @return the extended path
      */
-    public Path extend(final Object object, final String... labels);
+    public Path extend(final Object object, final Set<String> labels);
 
     /**
      * Get the object associated with the particular label of the path.

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Step.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Step.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Step.java
index d447175..14a6014 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Step.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Step.java
@@ -23,7 +23,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequire
 import java.io.Serializable;
 import java.util.Collections;
 import java.util.Iterator;
-import java.util.Optional;
 import java.util.Set;
 
 /**
@@ -116,17 +115,16 @@ public interface Step<S, E> extends Iterator<Traverser<E>>, Serializable, Clonea
     public Step<S, E> clone();
 
     /**
-     * Get the label of this step.
-     * If the step is  not labeled, then an {@link Optional#empty} is returned.
+     * Get the labels of this step.
      *
-     * @return the optional label of the step
+     * @return the set of labels for this step
      */
     public Set<String> getLabels();
 
     /**
-     * Set the label of this step.
+     * Add a label to this step.
      *
-     * @param label the label for this step
+     * @param label the label to add to this step
      */
     public void addLabel(final String label);
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
index 32f04d1..60ae481 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
@@ -462,31 +462,27 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
     }
 
     public default GraphTraversal<S, E> has(final String key, final P<?>... predicates) {
-        final HasContainer[] hasContainers = new HasContainer[predicates.length];
-        for (int i = 0; i < predicates.length; i++) {
-            hasContainers[i] = new HasContainer(key, predicates[i].getBiPredicate(), predicates[i].getValue());
-        }
-        return this.asAdmin().addStep(new HasStep(this.asAdmin(), hasContainers));
+        return this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(key, predicates)));
     }
 
-    public default GraphTraversal<S, E> has(final String key, final Object value) {
-        return this.has(key, new P<?>[]{value instanceof P ? (P) value : P.eq(value)});
+    public default GraphTraversal<S, E> has(final T accessor, final P<?>... predicates) {
+        return this.has(accessor.getAccessor(), predicates);
     }
 
-    public default GraphTraversal<S, E> has(final T accessor, final P<?> predicate) {
-        return this.has(accessor.getAccessor(), predicate);
+    public default GraphTraversal<S, E> has(final String key, final Object value) {
+        return this.has(key, new P<?>[]{value instanceof P ? (P) value : P.eq(value)});
     }
 
     public default GraphTraversal<S, E> has(final T accessor, final Object value) {
         return this.has(accessor.getAccessor(), value);
     }
 
-    public default GraphTraversal<S, E> has(final String label, final String key, final Object value) {
-        return this.has(label, key, P.eq(value));
+    public default GraphTraversal<S, E> has(final String label, final String key, final P<?>... predicates) {
+        return this.has(T.label, label).has(key, predicates);
     }
 
-    public default GraphTraversal<S, E> has(final String label, final String key, final P<?> predicate) {
-        return this.has(T.label, label).has(key, predicate);
+    public default GraphTraversal<S, E> has(final String label, final String key, final Object value) {
+        return this.has(label, key, new P<?>[]{value instanceof P ? (P) value : P.eq(value)});
     }
 
     public default GraphTraversal<S, E> has(final String key) {
@@ -705,9 +701,13 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
 
     ///////////////////// UTILITY STEPS /////////////////////
 
-    public default GraphTraversal<S, E> as(final String stepLabel) {
+    public default GraphTraversal<S, E> as(final String stepLabel, final String... stepLabels) {
         if (this.asAdmin().getSteps().size() == 0) this.asAdmin().addStep(new StartStep<>(this.asAdmin()));
-        this.asAdmin().getEndStep().addLabel(stepLabel);
+        final Step<?, E> endStep = this.asAdmin().getEndStep();
+        endStep.addLabel(stepLabel);
+        for (final String label : stepLabels) {
+            endStep.addLabel(label);
+        }
         return this;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
index 4ade570..74e6e65 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
@@ -218,7 +218,6 @@ public class __ {
         return __.<A>start().sum(scope);
     }
 
-
     public static <A, E2 extends Number> GraphTraversal<A, E2> min() {
         return __.<A>start().min();
     }
@@ -317,16 +316,16 @@ public class __ {
         return __.<A>start().hasNot(hasNotNextTraversal);
     }
 
-    public static <A> GraphTraversal<A, A> has(final String key, final P<?> predicate) {
-        return __.<A>start().has(key, predicate);
+    public static <A> GraphTraversal<A, A> has(final String key, final P<?>... predicates) {
+        return __.<A>start().has(key, predicates);
     }
 
-    public static <A> GraphTraversal<A, A> has(final String key, final Object value) {
-        return __.<A>start().has(key, value);
+    public static <A> GraphTraversal<A, A> has(final T accessor, final P<?>... predicates) {
+        return __.<A>start().has(accessor, predicates);
     }
 
-    public static <A> GraphTraversal<A, A> has(final T accessor, final P<?> predicate) {
-        return __.<A>start().has(accessor, predicate);
+    public static <A> GraphTraversal<A, A> has(final String key, final Object value) {
+        return __.<A>start().has(key, value);
     }
 
     public static <A> GraphTraversal<A, A> has(final T accessor, final Object value) {
@@ -337,8 +336,8 @@ public class __ {
         return __.<A>start().has(label, key, value);
     }
 
-    public static <A> GraphTraversal<A, A> has(final String label, final String key, final P<?> predicate) {
-        return __.<A>start().has(label, key, predicate);
+    public static <A> GraphTraversal<A, A> has(final String label, final String key, final P<?>... predicates) {
+        return __.<A>start().has(label, key, predicates);
     }
 
     public static <A> GraphTraversal<A, A> has(final String key) {
@@ -555,8 +554,8 @@ public class __ {
 
     ///////////////////// UTILITY STEPS /////////////////////
 
-    public static <A> GraphTraversal<A, A> as(final String label) {
-        return __.<A>start().as(label);
+    public static <A> GraphTraversal<A, A> as(final String label, final String... labels) {
+        return __.<A>start().as(label, labels);
     }
 
     public static <A> GraphTraversal<A, A> profile() {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
index d7d7142..7b80015 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
@@ -41,7 +41,7 @@ public final class WhereStep<E> extends FilterStep<Map<String, E>> implements Tr
     private final String firstKey;
     private final String secondKey;
     private final BiPredicate biPredicate;
-    private Traversal.Admin constraint;
+    private Traversal.Admin traversalConstraint;
 
 
     public WhereStep(final Traversal.Admin traversal, final String firstKey, final P<?> secondKeyPredicate) {
@@ -49,39 +49,42 @@ public final class WhereStep<E> extends FilterStep<Map<String, E>> implements Tr
         this.firstKey = firstKey;
         this.secondKey = (String) secondKeyPredicate.getValue();
         this.biPredicate = secondKeyPredicate.getBiPredicate();
-        this.constraint = null;
+        this.traversalConstraint = null;
     }
 
-    public WhereStep(final Traversal.Admin traversal, final Traversal.Admin constraint) {
+    public WhereStep(final Traversal.Admin traversal, final Traversal.Admin traversalConstraint) {
         super(traversal);
         this.biPredicate = null;
-        this.constraint = this.integrateChild(constraint);
+        this.traversalConstraint = this.integrateChild(traversalConstraint);
         // TODO: do we need to compile the traversal first (probably)
-        ///
-        final Step<?, ?> startStep = this.constraint.getStartStep();
+        ///  get the start-step as()
+        final Step<?, ?> startStep = this.traversalConstraint.getStartStep();
         if (startStep.getLabels().isEmpty())
-            throw new IllegalArgumentException("Where traversal must have their start step labeled with as(): " + this.constraint);
+            throw new IllegalArgumentException("Where traversal must have their start step labeled with as(): " + this.traversalConstraint);
         if (startStep.getLabels().size() > 1)
-            throw new IllegalArgumentException("Where traversal can not have multiple labels on the start step: " + this.constraint);
+            throw new IllegalArgumentException("Where traversal can not have multiple labels on the start step: " + this.traversalConstraint);
         this.firstKey = startStep.getLabels().iterator().next();
-        ///
-        Step<?, ?> endStep = this.constraint.getEndStep();
+        /// get the end-step as()
+        Step<?, ?> endStep = this.traversalConstraint.getEndStep();
         if (endStep instanceof MarkerIdentityStep) endStep = endStep.getPreviousStep();  // DAH
         if (endStep.getLabels().size() > 1)
-            throw new IllegalArgumentException("Where traversal can not have multiple labels on the end step: " + this.constraint);
+            throw new IllegalArgumentException("Where traversal can not have multiple labels on the end step: " + this.traversalConstraint);
         this.secondKey = endStep.getLabels().isEmpty() ? null : endStep.getLabels().iterator().next();
     }
 
     @Override
     protected boolean filter(final Traverser.Admin<Map<String, E>> traverser) {
         final Map<String, E> map = traverser.get();
-        if (null == this.constraint) {
+        // bi-predicate predicate
+        if (null == this.traversalConstraint) {
             if (!map.containsKey(this.firstKey))
                 throw new IllegalArgumentException("The provided key is not in the current map: " + this.firstKey);
             if (!map.containsKey(this.secondKey))
                 throw new IllegalArgumentException("The provided key is not in the current map: " + this.secondKey);
             return this.biPredicate.test(map.get(this.firstKey), map.get(this.secondKey));
-        } else {
+        }
+        // traversal predicate
+        else {
             final Object startObject = map.get(this.firstKey);
             if (null == startObject)
                 throw new IllegalArgumentException("The provided key is not in the current map: " + this.firstKey);
@@ -89,40 +92,39 @@ public final class WhereStep<E> extends FilterStep<Map<String, E>> implements Tr
                 throw new IllegalArgumentException("The provided key is not in the current map: " + this.secondKey);
             final Object endObject = null == this.secondKey ? null : map.get(this.secondKey);
             //
-            this.constraint.addStart(this.getTraversal().asAdmin().getTraverserGenerator().generate(startObject, this.constraint.getStartStep(), traverser.bulk()));
+            this.traversalConstraint.addStart(this.getTraversal().asAdmin().getTraverserGenerator().generate(startObject, this.traversalConstraint.getStartStep(), traverser.bulk()));
             if (null == endObject) {
-                if (this.constraint.hasNext()) {
-                    this.constraint.reset();
+                if (this.traversalConstraint.hasNext()) {
+                    this.traversalConstraint.reset();
                     return true;
-                } else {
-                    return false;
                 }
             } else {
-                while (this.constraint.hasNext()) {
-                    if (this.constraint.next().equals(endObject)) {
-                        this.constraint.reset();
+                while (this.traversalConstraint.hasNext()) {
+                    if (this.traversalConstraint.next().equals(endObject)) {
+                        this.traversalConstraint.reset();
                         return true;
                     }
                 }
-                return false;
             }
+            return false;
         }
     }
 
     @Override
     public List<Traversal.Admin> getLocalChildren() {
-        return null == this.constraint ? Collections.emptyList() : Collections.singletonList(this.constraint);
+        return null == this.traversalConstraint ? Collections.emptyList() : Collections.singletonList(this.traversalConstraint);
     }
 
     @Override
     public String toString() {
-        return TraversalHelper.makeStepString(this, this.firstKey, this.biPredicate, this.secondKey, this.constraint);
+        return TraversalHelper.makeStepString(this, this.firstKey, this.biPredicate, this.secondKey, this.traversalConstraint);
     }
 
     @Override
     public WhereStep<E> clone() {
         final WhereStep<E> clone = (WhereStep<E>) super.clone();
-        if (null != this.constraint) clone.constraint = clone.integrateChild(this.constraint.clone());
+        if (null != this.traversalConstraint)
+            clone.traversalConstraint = clone.integrateChild(this.traversalConstraint.clone());
         return clone;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathStep.java
index fcb6b9a..60699a3 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathStep.java
@@ -22,11 +22,11 @@ import org.apache.tinkerpop.gremlin.process.traversal.Path;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MutablePath;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalRing;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.MutablePath;
 
 import java.util.Collections;
 import java.util.List;
@@ -51,7 +51,7 @@ public final class PathStep<S> extends MapStep<S, Path> implements TraversalPare
             path = traverser.path();
         else {
             path = MutablePath.make();
-            traverser.path().forEach((object, labels) -> path.extend(TraversalUtil.apply(object, this.traversalRing.next()), labels.toArray(new String[labels.size()])));
+            traverser.path().forEach((object, labels) -> path.extend(TraversalUtil.apply(object, this.traversalRing.next()), labels));
         }
         this.traversalRing.reset();
         return path;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StartStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StartStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StartStep.java
index 5e762fe..63ab045 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StartStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StartStep.java
@@ -24,7 +24,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 
 import java.util.Iterator;
-import java.util.stream.Stream;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -47,10 +46,7 @@ public class StartStep<S> extends AbstractStep<S, S> {
         return (T) this.start;
     }
 
-    public boolean startAssignableTo(final Class... assignableClasses) {
-        return Stream.of(assignableClasses).filter(check -> check.isAssignableFrom(this.start.getClass())).findAny().isPresent();
-    }
-
+    @Override
     public String toString() {
         return TraversalHelper.makeStepString(this, this.start);
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java
index bb70e67..28b85f8 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java
@@ -47,7 +47,7 @@ public abstract class AbstractStep<S, E> implements Step<S, E> {
 
     public AbstractStep(final Traversal.Admin traversal) {
         this.traversal = traversal;
-        this.starts = new ExpandableStepIterator<S>((Step) this);
+        this.starts = new ExpandableStepIterator<>(this);
     }
 
     @Override
@@ -164,8 +164,8 @@ public abstract class AbstractStep<S, E> implements Step<S, E> {
     @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
     public AbstractStep<S, E> clone() {
         try {
-            final AbstractStep clone = (AbstractStep) super.clone();
-            clone.starts = new ExpandableStepIterator<S>(clone);
+            final AbstractStep<S,E> clone = (AbstractStep<S,E>) super.clone();
+            clone.starts = new ExpandableStepIterator<>(clone);
             clone.previousStep = EmptyStep.instance();
             clone.nextStep = EmptyStep.instance();
             clone.nextEnd = null;
@@ -177,7 +177,7 @@ public abstract class AbstractStep<S, E> implements Step<S, E> {
 
     private final Traverser<E> prepareTraversalForNextStep(final Traverser<E> traverser) {
         if (!this.traverserStepIdSetByChild) ((Traverser.Admin<E>) traverser).setStepId(this.nextStep.getId());
-        this.labels.forEach(label -> traverser.path().addLabel(label));
+        if (!this.labels.isEmpty()) this.labels.forEach(label -> traverser.path().addLabel(label));
         return traverser;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyPath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyPath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyPath.java
index 8be354d..72d8c01 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyPath.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyPath.java
@@ -42,7 +42,7 @@ public final class EmptyPath implements Path, Serializable {
     }
 
     @Override
-    public Path extend(final Object object, final String... labels) {
+    public Path extend(final Object object, final Set<String> labels) {
         return this;
     }
 
@@ -82,6 +82,7 @@ public final class EmptyPath implements Path, Serializable {
     }
 
     @Override
+    @SuppressWarnings("CloneDoesntCallSuperClone,CloneDoesntDeclareCloneNotSupportedException")
     public EmptyPath clone() {
         return this;
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ExpandableStepIterator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ExpandableStepIterator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ExpandableStepIterator.java
index 57687c1..09e82d0 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ExpandableStepIterator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ExpandableStepIterator.java
@@ -29,13 +29,13 @@ import java.util.Iterator;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class ExpandableStepIterator<E> implements Iterator<Traverser.Admin<E>>, Serializable {
+public final class ExpandableStepIterator<S> implements Iterator<Traverser.Admin<S>>, Serializable {
 
-    private final TraverserSet<E> traverserSet = new TraverserSet<>();
-    private final MultiIterator<Traverser.Admin<E>> traverserIterators = new MultiIterator<>();
-    private final Step<?, E> hostStep;
+    private final TraverserSet<S> traverserSet = new TraverserSet<>();
+    private final MultiIterator<Traverser.Admin<S>> traverserIterators = new MultiIterator<>();
+    private final Step<S,?> hostStep;
 
-    public ExpandableStepIterator(final Step<?, E> hostStep) {
+    public ExpandableStepIterator(final Step<S,?> hostStep) {
         this.hostStep = hostStep;
     }
 
@@ -45,23 +45,23 @@ public final class ExpandableStepIterator<E> implements Iterator<Traverser.Admin
     }
 
     @Override
-    public Traverser.Admin<E> next() {
+    public Traverser.Admin<S> next() {
         if (!this.traverserSet.isEmpty())
             return this.traverserSet.remove();
         if (this.traverserIterators.hasNext())
             return this.traverserIterators.next();
         /////////////
         if (this.hostStep.getPreviousStep().hasNext())
-            return (Traverser.Admin<E>) this.hostStep.getPreviousStep().next();
+            return (Traverser.Admin<S>) this.hostStep.getPreviousStep().next();
         /////////////
         return this.traverserSet.remove();
     }
 
-    public void add(final Iterator<Traverser.Admin<E>> iterator) {
+    public void add(final Iterator<Traverser.Admin<S>> iterator) {
         this.traverserIterators.addIterator(iterator);
     }
 
-    public void add(final Traverser.Admin<E> traverser) {
+    public void add(final Traverser.Admin<S> traverser) {
         this.traverserSet.add(traverser);
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/HasContainer.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/HasContainer.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/HasContainer.java
index 4f16d96..014f21f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/HasContainer.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/HasContainer.java
@@ -18,10 +18,11 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.step.util;
 
-import org.apache.tinkerpop.gremlin.structure.T;
 import org.apache.tinkerpop.gremlin.structure.Contains;
 import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.P;
 import org.apache.tinkerpop.gremlin.structure.Property;
+import org.apache.tinkerpop.gremlin.structure.T;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;
 
@@ -44,26 +45,14 @@ public final class HasContainer implements Serializable {
         this.predicate = predicate;
         this.value = value;
         if (null == this.value && !(this.predicate instanceof Contains)) {
-            throw new IllegalArgumentException("For determining the existence of a property, use the Contains predicate");
+            throw new IllegalArgumentException("For determining the existence of a property, use the Contains predicate with null-value");
         }
     }
 
-    public HasContainer(final String key, final Contains contains) {
-        this(key, contains, null);
-    }
-
-    public HasContainer(final T accessor, final BiPredicate predicate, final Object value) {
-        this(accessor.getAccessor(), predicate, value);
-    }
-
-    public HasContainer(final T accessor, final Contains contains) {
-        this(accessor.getAccessor(), contains, null);
-    }
-
     public boolean test(final Element element) {
         if (null != this.value) {
             // it is OK to evaluate equality of ids via toString() now given that the toString() the test suite
-            // enforces the value of id.()toString() to be a first class representation of the identifier
+            // enforces the value of id().toString() to be a first class representation of the identifier
             if (this.key.equals(T.id.getAccessor()))
                 return this.predicate.test(element.id().toString(), this.value.toString());
             else if (this.key.equals(T.label.getAccessor()))
@@ -92,6 +81,17 @@ public final class HasContainer implements Serializable {
         }
     }
 
+    // note that if the user is looking for a label property key (e.g.), then it will look the same as looking for the label of the element.
+    public String toString() {
+        return this.value == null ?
+                (this.predicate == Contains.within ?
+                        '[' + this.key + ']' :
+                        "[!" + this.key + ']') :
+                '[' + this.key + ',' + this.predicate + ',' + this.value + ']';
+    }
+
+    ////////////
+
     public static boolean testAll(final Element element, final List<HasContainer> hasContainers) {
         if (hasContainers.size() == 0)
             return true;
@@ -104,12 +104,11 @@ public final class HasContainer implements Serializable {
         }
     }
 
-    // note that if the user is looking for a label property key (e.g.), then it will look the same as looking for the label of the element.
-    public String toString() {
-        return this.value == null ?
-                (this.predicate == Contains.within ?
-                        '[' + this.key + ']' :
-                        "[!" + this.key + ']') :
-                '[' + this.key + ',' + this.predicate + ',' + this.value + ']';
+    public static HasContainer[] makeHasContainers(final String key, final P<?>... predicates) {
+        final HasContainer[] hasContainers = new HasContainer[predicates.length];
+        for (int i = 0; i < predicates.length; i++) {
+            hasContainers[i] = new HasContainer(key, predicates[i].getBiPredicate(), predicates[i].getValue());
+        }
+        return hasContainers;
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ImmutablePath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ImmutablePath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ImmutablePath.java
index 608c3f6..18914be 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ImmutablePath.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ImmutablePath.java
@@ -51,15 +51,14 @@ public class ImmutablePath implements Path, Serializable, Cloneable {
         return this;
     }
 
-    private ImmutablePath(final Object currentObject, final String... currentLabels) {
+    private ImmutablePath(final Object currentObject, final Set<String> currentLabels) {
         this(HeadPath.instance(), currentObject, currentLabels);
     }
 
-    private ImmutablePath(final Path previousPath, final Object currentObject, final String... currentLabels) {
+    private ImmutablePath(final Path previousPath, final Object currentObject, final Set<String> currentLabels) {
         this.previousPath = previousPath;
         this.currentObject = currentObject;
-        if (currentLabels.length > 0)
-            Stream.of(currentLabels).forEach(this.currentLabels::add);
+        this.currentLabels.addAll(currentLabels);
     }
 
     @Override
@@ -68,7 +67,7 @@ public class ImmutablePath implements Path, Serializable, Cloneable {
     }
 
     @Override
-    public Path extend(final Object object, final String... labels) {
+    public Path extend(final Object object, final Set<String> labels) {
         return new ImmutablePath(this, object, labels);
     }
 
@@ -121,7 +120,7 @@ public class ImmutablePath implements Path, Serializable, Cloneable {
         }
 
         @Override
-        public Path extend(final Object object, final String... labels) {
+        public Path extend(final Object object, final Set<String> labels) {
             return new ImmutablePath(object, labels);
         }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MutablePath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MutablePath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MutablePath.java
index d458bfb..10fd639 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MutablePath.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MutablePath.java
@@ -23,21 +23,20 @@ import org.apache.tinkerpop.gremlin.process.traversal.Path;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
 public class MutablePath implements Path, Serializable {
 
-    final protected List<Object> objects;
-    final protected List<Set<String>> labels;
+    protected final List<Object> objects;
+    protected final List<Set<String>> labels;
 
     protected MutablePath() {
-        this(0);
+        this(10);
     }
 
     private MutablePath(final int capacity) {
@@ -69,9 +68,9 @@ public class MutablePath implements Path, Serializable {
     }
 
     @Override
-    public Path extend(final Object object, final String... labels) {
+    public Path extend(final Object object, final Set<String> labels) {
         this.objects.add(object);
-        this.labels.add(Stream.of(labels).collect(Collectors.toSet()));
+        this.labels.add(new HashSet<>(labels));
         return this;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/TraversalVerificationStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/TraversalVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/TraversalVerificationStrategy.java
index 70dfdd2..9e38646 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/TraversalVerificationStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/TraversalVerificationStrategy.java
@@ -18,14 +18,15 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.strategy.verification;
 
+import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.SupplyingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 
@@ -53,9 +54,9 @@ public final class TraversalVerificationStrategy extends AbstractTraversalStrate
             endStep = endStep.getPreviousStep();
 
         for (final Step<?, ?> step : traversal.getSteps()) {
-            if ((step instanceof ReducingBarrierStep || step instanceof SupplyingBarrierStep) && (step != endStep || !(traversal.getParent() instanceof EmptyStep))) {
+            if ((step instanceof ReducingBarrierStep || step instanceof SupplyingBarrierStep) && (step != endStep || !(traversal.getParent() instanceof EmptyStep)))
                 throw new IllegalStateException("Global traversals on GraphComputer may not contain mid-traversal barriers: " + step);
-            }
+
             if (step instanceof TraversalParent) {
                 final Optional<Traversal.Admin<Object, Object>> traversalOptional = ((TraversalParent) step).getLocalChildren().stream()
                         .filter(t -> !TraversalHelper.isLocalStarGraph(t.asAdmin()))
@@ -63,6 +64,8 @@ public final class TraversalVerificationStrategy extends AbstractTraversalStrate
                 if (traversalOptional.isPresent())
                     throw new IllegalStateException("Local traversals on GraphComputer may not traverse past the local star-graph: " + traversalOptional.get());
             }
+            if (step instanceof Mutating)
+                throw new IllegalStateException("Muting steps are currently not supported on GraphComputer traversals");
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_S_SE_SL_Traverser.java
index 3daa672..b6920e5 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_S_SE_SL_Traverser.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_S_SE_SL_Traverser.java
@@ -25,7 +25,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.util.ImmutablePath;
 import org.apache.tinkerpop.gremlin.structure.util.Attachable;
 import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory;
 
-import java.util.Optional;
 import java.util.function.Function;
 
 /**
@@ -40,8 +39,7 @@ public class B_O_P_S_SE_SL_Traverser<T> extends B_O_S_SE_SL_Traverser<T> {
 
     public B_O_P_S_SE_SL_Traverser(final T t, final Step<T, ?> step, final long initialBulk) {
         super(t, step, initialBulk);
-        final String[] stepLabels = step.getLabels().toArray(new String[step.getLabels().size()]);
-        this.path = ImmutablePath.make().extend(t, stepLabels);
+        this.path = ImmutablePath.make().extend(t, step.getLabels());
     }
 
     /////////////////
@@ -77,12 +75,9 @@ public class B_O_P_S_SE_SL_Traverser<T> extends B_O_S_SE_SL_Traverser<T> {
 
     @Override
     public <R> Traverser.Admin<R> split(final R r, final Step<T, R> step) {
-
-            final B_O_P_S_SE_SL_Traverser<R> clone = (B_O_P_S_SE_SL_Traverser<R>) super.split(r,step);
-            final String[] stepLabels = step.getLabels().toArray(new String[step.getLabels().size()]);
-            clone.path = clone.path.clone().extend(r, stepLabels);
-            //clone.sack = null == clone.sack ? null : clone.sideEffects.getSackSplitOperator().orElse(UnaryOperator.identity()).apply(clone.sack);
-            return clone;
+        final B_O_P_S_SE_SL_Traverser<R> clone = (B_O_P_S_SE_SL_Traverser<R>) super.split(r, step);
+        clone.path = clone.path.clone().extend(r, step.getLabels());
+        return clone;
 
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPath.java
index 6f9b540..d2d0094 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPath.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPath.java
@@ -63,7 +63,7 @@ public class DetachedPath extends MutablePath implements Attachable<Path> {
     @Override
     public Path attach(final Function<Attachable<Path>, Path> method) {
         final Path path = MutablePath.make();  // TODO: Use ImmutablePath?
-        this.forEach((object, labels) -> path.extend(object instanceof Attachable ? ((Attachable) object).attach(method) : object, labels.toArray(new String[labels.size()])));
+        this.forEach((object, labels) -> path.extend(object instanceof Attachable ? ((Attachable) object).attach(method) : object, labels));
         return path;
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferencePath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferencePath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferencePath.java
index f2e0571..d7ac31d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferencePath.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/reference/ReferencePath.java
@@ -66,7 +66,7 @@ public class ReferencePath extends MutablePath implements Attachable<Path> {
     @Override
     public Path attach(final Function<Attachable<Path>, Path> method) {
         final Path path = MutablePath.make();  // TODO: Use ImmutablePath?
-        this.forEach((object, labels) -> path.extend(object instanceof Attachable ? ((Attachable) object).attach(method) : object, labels.toArray(new String[labels.size()])));
+        this.forEach((object, labels) -> path.extend(object instanceof Attachable ? ((Attachable) object).attach(method) : object, labels));
         return path;
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/036d6379/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathTest.java
index 752d2e2..94ea30a 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathTest.java
@@ -20,12 +20,13 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.util;
 
 import org.apache.tinkerpop.gremlin.LoadGraphWith;
 import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
 import org.apache.tinkerpop.gremlin.process.traversal.Path;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
 import org.junit.Test;
 
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 
@@ -43,9 +44,9 @@ public class PathTest extends AbstractGremlinProcessTest {
         Arrays.asList(MutablePath.make(), ImmutablePath.make()).forEach(path -> {
             assertTrue(path.isSimple());
             assertEquals(0, path.size());
-            path = path.extend(1, "a");
-            path = path.extend(2, "b");
-            path = path.extend(3, "c");
+            path = path.extend(1, Collections.singleton("a"));
+            path = path.extend(2, Collections.singleton("b"));
+            path = path.extend(3, Collections.singleton("c"));
             assertEquals(3, path.size());
             assertEquals(Integer.valueOf(1), path.get("a"));
             assertEquals(Integer.valueOf(2), path.get("b"));
@@ -62,7 +63,7 @@ public class PathTest extends AbstractGremlinProcessTest {
             assertTrue(path.hasLabel("d"));
             assertFalse(path.hasLabel("e"));
             assertTrue(path.isSimple());
-            path = path.extend(3, "e");
+            path = path.extend(3, Collections.singleton("e"));
             assertFalse(path.isSimple());
             assertTrue(path.hasLabel("e"));
             assertEquals(4, path.size());
@@ -77,9 +78,9 @@ public class PathTest extends AbstractGremlinProcessTest {
     @LoadGraphWith(LoadGraphWith.GraphData.MODERN)
     public void shouldHandleMultiLabelPaths() {
         Arrays.asList(MutablePath.make(), ImmutablePath.make()).forEach(path -> {
-            path = path.extend("marko", "a");
-            path = path.extend("stephen", "b");
-            path = path.extend("matthias", "a");
+            path = path.extend("marko", Collections.singleton("a"));
+            path = path.extend("stephen", Collections.singleton("b"));
+            path = path.extend("matthias", Collections.singleton("a"));
             assertEquals(3, path.size());
             assertEquals(3, path.objects().size());
             assertEquals(3, path.labels().size());
@@ -105,9 +106,9 @@ public class PathTest extends AbstractGremlinProcessTest {
     @Test
     public void shouldExcludeUnlabeledLabelsFromPath() {
         Arrays.asList(MutablePath.make(), ImmutablePath.make()).forEach(path -> {
-            path = path.extend("marko", "a");
-            path = path.extend("stephen", "b");
-            path = path.extend("matthias", "c", "d");
+            path = path.extend("marko", Collections.singleton("a"));
+            path = path.extend("stephen", Collections.singleton("b"));
+            path = path.extend("matthias", new HashSet<>(Arrays.asList("c", "d")));
             assertEquals(3, path.size());
             assertEquals(3, path.objects().size());
             assertEquals(3, path.labels().size());