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/03/17 15:34:31 UTC

incubator-tinkerpop git commit: A Traversal is always off an 'emanating graph'. For anonymous traversals, that emanting graph is the EmptyGraph. g.addV() added. Neo4jGraph ignores the g.V().addV() test as GlobalGraphOperations iterates vertices created a

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/master d999b3ef4 -> cadf6ccaa


A Traversal is always off an 'emanating graph'. For anonymous traversals, that emanting graph is the EmptyGraph. g.addV() added. Neo4jGraph ignores the g.V().addV() test as GlobalGraphOperations iterates vertices created after the iterator is created. Added another AddVertexTest.


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

Branch: refs/heads/master
Commit: cadf6ccaa001f2df6521f6af06ec884b7d8c2dc0
Parents: d999b3e
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Mar 17 08:34:27 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue Mar 17 08:34:27 2015 -0600

----------------------------------------------------------------------
 .../tinkerpop/gremlin/process/Traversal.java    |  2 +
 .../gremlin/process/TraversalStrategies.java    | 24 ++++------
 .../graph/traversal/DefaultGraphTraversal.java  |  5 +-
 .../graph/traversal/GraphTraversalSource.java   | 19 ++++----
 .../gremlin/process/graph/traversal/__.java     |  3 +-
 .../traversal/step/map/AddVertexStartStep.java  | 49 +++++++++++++++++++
 .../graph/traversal/step/map/AddVertexStep.java |  3 +-
 .../traversal/step/sideEffect/GraphStep.java    | 13 ++---
 .../process/traversal/DefaultTraversal.java     | 14 +++++-
 .../lambda/AbstractLambdaTraversal.java         |  7 +++
 .../traversal/lambda/HasNextTraversal.java      |  6 +++
 .../process/traversal/util/EmptyTraversal.java  | 11 +++--
 .../process/traversal/util/TraversalHelper.java |  4 --
 .../structure/strategy/PartitionStrategy.java   |  5 +-
 .../step/sideEffect/StrategyGraphStep.java      |  2 +-
 .../process/util/TraversalHelperTest.java       |  9 ++--
 .../step/map/GroovyAddVertexTest.groovy         |  5 ++
 .../graph/traversal/step/map/AddVertexTest.java | 24 +++++++++-
 .../step/sideEffect/Neo4jGraphStep.java         | 50 ++++++++++++--------
 .../gremlin/neo4j/structure/Neo4jGraph.java     | 11 ++++-
 .../traversal/sideEffect/TinkerGraphStep.java   | 18 +++----
 21 files changed, 199 insertions(+), 85 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cadf6cca/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traversal.java
index 0952ca9..bd08c21 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traversal.java
@@ -421,6 +421,8 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable {
          */
         public boolean isLocked();
 
+        public Optional<Graph> getGraph();
+
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cadf6cca/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalStrategies.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalStrategies.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalStrategies.java
index 3bb6c5c..d7ca954 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalStrategies.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalStrategies.java
@@ -18,7 +18,6 @@
  */
 package org.apache.tinkerpop.gremlin.process;
 
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.ComparatorHolderRemovalStrategy;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.ConjunctionStrategy;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.DedupOptimizerStrategy;
@@ -32,6 +31,7 @@ import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.TraversalVe
 import org.apache.tinkerpop.gremlin.process.traversal.DefaultTraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.traverser.TraverserGeneratorFactory;
 import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
 import org.apache.tinkerpop.gremlin.util.tools.MultiMap;
 
 import java.io.Serializable;
@@ -156,7 +156,7 @@ public interface TraversalStrategies extends Serializable, Cloneable {
 
     public static final class GlobalCache {
 
-        private static final Map<Class, TraversalStrategies> CACHE = new HashMap<>();
+        private static final Map<Class<? extends Graph>, TraversalStrategies> CACHE = new HashMap<>();
 
         static {
             final TraversalStrategies coreStrategies = new DefaultTraversalStrategies();
@@ -173,26 +173,22 @@ public interface TraversalStrategies extends Serializable, Cloneable {
                     ConjunctionStrategy.instance());
             try {
                 CACHE.put(Graph.class, coreStrategies.clone());
-                CACHE.put(__.class, new DefaultTraversalStrategies());
+                CACHE.put(EmptyGraph.class, new DefaultTraversalStrategies());
             } catch (final CloneNotSupportedException e) {
                 throw new IllegalStateException(e.getMessage(), e);
             }
         }
 
-        public static void registerStrategies(final Class emanatingClass, final TraversalStrategies traversalStrategies) {
-            CACHE.put(emanatingClass, traversalStrategies);
+        public static void registerStrategies(final Class<? extends Graph> graphClass, final TraversalStrategies traversalStrategies) {
+            CACHE.put(graphClass, traversalStrategies);
         }
 
-        public static TraversalStrategies getStrategies(final Class emanatingClass) {
-            final TraversalStrategies traversalStrategies = CACHE.get(emanatingClass);
+        public static TraversalStrategies getStrategies(final Class<? extends Graph> graphClass) {
+            final TraversalStrategies traversalStrategies = CACHE.get(graphClass);
             if (null == traversalStrategies) {
-                if (__.class.isAssignableFrom(emanatingClass))
-                    return CACHE.get(__.class);
-                else if (Graph.class.isAssignableFrom(emanatingClass))
-                    return CACHE.get(Graph.class);
-                else
-                    return new DefaultTraversalStrategies();
-                // throw new IllegalStateException("The provided class has no registered traversal strategies: " + emanatingClass);
+                if (EmptyGraph.class.isAssignableFrom(graphClass))
+                    return CACHE.get(EmptyGraph.class);
+                else return CACHE.get(Graph.class);
             }
             return traversalStrategies;
         }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cadf6cca/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/DefaultGraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/DefaultGraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/DefaultGraphTraversal.java
index 3279c9f..64bb473 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/DefaultGraphTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/DefaultGraphTraversal.java
@@ -19,14 +19,15 @@
 package org.apache.tinkerpop.gremlin.process.graph.traversal;
 
 import org.apache.tinkerpop.gremlin.process.traversal.DefaultTraversal;
+import org.apache.tinkerpop.gremlin.structure.Graph;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
 public class DefaultGraphTraversal<S, E> extends DefaultTraversal<S, E> implements GraphTraversal.Admin<S, E> {
 
-    public DefaultGraphTraversal(final Object emanatingObject) {
-        super(emanatingObject);
+    public DefaultGraphTraversal(final Graph graph) {
+        super(graph);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cadf6cca/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversalSource.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversalSource.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversalSource.java
index 298295d..756883a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversalSource.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversalSource.java
@@ -23,6 +23,7 @@ import org.apache.tinkerpop.gremlin.process.TraversalSource;
 import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.TraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
+import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexStartStep;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
 import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEngine;
 import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
@@ -57,31 +58,33 @@ public class GraphTraversalSource implements TraversalSource {
     public GraphTraversalSource(final Graph graph, final TraversalEngine.Builder engine, final TraversalStrategy... strategies) {
         this.graph = graph;
         this.engine = engine;
-        final TraversalStrategies temp = TraversalStrategies.GlobalCache.getStrategies(this.graph.getClass());
+        final TraversalStrategies tempStrategies = TraversalStrategies.GlobalCache.getStrategies(this.graph.getClass());
         try {
-            this.strategies = strategies.length == 0 ? temp : temp.clone().addStrategies(strategies);
+            this.strategies = strategies.length == 0 ? tempStrategies : tempStrategies.clone().addStrategies(strategies);
         } catch (final CloneNotSupportedException e) {
             throw new IllegalStateException(e.getMessage(), e);
         }
     }
 
     public GraphTraversal<Vertex, Vertex> addV(final Object... keyValues) {
-        final Vertex vertex = this.graph.addVertex(keyValues);
-        return this.V(vertex);
+        final GraphTraversal.Admin<Vertex, Vertex> traversal = new DefaultGraphTraversal<>(this.graph);
+        traversal.setEngine(this.engine.create(this.graph));
+        traversal.setStrategies(this.strategies);
+        return traversal.addStep(new AddVertexStartStep(traversal, keyValues));
     }
 
     public GraphTraversal<Vertex, Vertex> V(final Object... vertexIds) {
-        final GraphTraversal.Admin<Vertex, Vertex> traversal = new DefaultGraphTraversal<>(this);
+        final GraphTraversal.Admin<Vertex, Vertex> traversal = new DefaultGraphTraversal<>(this.graph);
         traversal.setEngine(this.engine.create(this.graph));
         traversal.setStrategies(this.strategies);
-        return traversal.addStep(new GraphStep<>(traversal, this.graph, Vertex.class, vertexIds));
+        return traversal.addStep(new GraphStep<>(traversal, Vertex.class, vertexIds));
     }
 
     public GraphTraversal<Edge, Edge> E(final Object... edgesIds) {
-        final GraphTraversal.Admin<Edge, Edge> traversal = new DefaultGraphTraversal<>(this);
+        final GraphTraversal.Admin<Edge, Edge> traversal = new DefaultGraphTraversal<>(this.graph);
         traversal.setEngine(this.engine.create(this.graph));
         traversal.setStrategies(this.strategies);
-        return traversal.addStep(new GraphStep<>(traversal, this.graph, Edge.class, edgesIds));
+        return traversal.addStep(new GraphStep<>(traversal, Edge.class, edgesIds));
     }
 
     public Transaction tx() {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cadf6cca/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/__.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/__.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/__.java
index 49dadfc..b613596 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/__.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/__.java
@@ -28,6 +28,7 @@ import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Property;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
 
 import java.util.Collection;
 import java.util.Iterator;
@@ -53,7 +54,7 @@ public class __ {
     //////////////////////////////////////////////////////////////////////
 
     public static <A> GraphTraversal<A, A> start() {
-        return new DefaultGraphTraversal<>(new __());
+        return new DefaultGraphTraversal<>(EmptyGraph.instance());
     }
 
     public static <A> GraphTraversal<A, A> __(final Object... starts) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cadf6cca/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexStartStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexStartStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexStartStep.java
new file mode 100644
index 0000000..debd910
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexStartStep.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.gremlin.process.graph.traversal.step.map;
+
+import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class AddVertexStartStep extends AbstractStep<Vertex, Vertex> {
+
+    private final Object[] keyValues;
+    private boolean first = true;
+
+    public AddVertexStartStep(final Traversal.Admin traversal, final Object... keyValues) {
+        super(traversal);
+        this.keyValues = keyValues;
+    }
+
+
+    @Override
+    protected Traverser<Vertex> processNextStart() {
+        if (this.first) {
+            this.first = false;
+            return this.getTraversal().getTraverserGenerator().generate(this.getTraversal().getGraph().get().addVertex(this.keyValues), this, 1l);
+        } else
+            throw FastNoSuchElementException.instance();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cadf6cca/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexStep.java
index 0240d7a..5b5eadd 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexStep.java
@@ -20,7 +20,6 @@ package org.apache.tinkerpop.gremlin.process.graph.traversal.step.map;
 
 import org.apache.tinkerpop.gremlin.process.Traversal;
 import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 
@@ -35,7 +34,7 @@ public final class AddVertexStep<S> extends MapStep<S, Vertex> {
     public AddVertexStep(final Traversal.Admin traversal, final Object... keyValues) {
         super(traversal);
         this.keyValues = keyValues;
-        this.graph = TraversalHelper.getGraph(traversal);
+        this.graph = this.getTraversal().getGraph().get();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cadf6cca/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java
index 203d983..e36ea37 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java
@@ -25,7 +25,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.util.iterator.EmptyIterator;
 
@@ -41,12 +40,10 @@ public class GraphStep<S extends Element> extends StartStep<S> implements Engine
 
     protected final Class<S> returnClass;
     protected Object[] ids;
-    protected transient Graph graph;
     protected transient Supplier<Iterator<S>> iteratorSupplier;
 
-    public GraphStep(final Traversal.Admin traversal, final Graph graph, final Class<S> returnClass, final Object... ids) {
+    public GraphStep(final Traversal.Admin traversal, final Class<S> returnClass, final Object... ids) {
         super(traversal);
-        this.graph = graph;
         this.returnClass = returnClass;
         this.ids = ids;
         for (int i = 0; i < this.ids.length; i++) {
@@ -54,8 +51,8 @@ public class GraphStep<S extends Element> extends StartStep<S> implements Engine
                 this.ids[i] = ((Element) this.ids[i]).id();
         }
         this.iteratorSupplier = () -> (Iterator<S>) (Vertex.class.isAssignableFrom(this.returnClass) ?
-                this.graph.vertices(this.ids) :
-                this.graph.edges(this.ids));
+                this.getTraversal().getGraph().get().vertices(this.ids) :
+                this.getTraversal().getGraph().get().edges(this.ids));
     }
 
     public String toString() {
@@ -78,10 +75,6 @@ public class GraphStep<S extends Element> extends StartStep<S> implements Engine
         this.iteratorSupplier = iteratorSupplier;
     }
 
-    public <G extends Graph> G getGraph(final Class<G> graphClass) {
-        return (G) this.graph;
-    }
-
     public Object[] getIds() {
         return this.ids;
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cadf6cca/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversal.java
index e0c6e8f..8eb8767 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversal.java
@@ -28,11 +28,13 @@ import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEn
 import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.structure.Graph;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Optional;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -44,6 +46,8 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
     private Step<?, E> finalEndStep = EmptyStep.instance();
     private final StepPosition stepPosition = new StepPosition();
 
+    protected final transient Graph graph;
+
     protected List<Step> steps = new ArrayList<>();
     protected TraversalSideEffects sideEffects = new DefaultTraversalSideEffects();
     protected TraversalStrategies strategies;
@@ -53,8 +57,9 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
 
     protected TraversalParent traversalParent = (TraversalParent) EmptyStep.instance();
 
-    public DefaultTraversal(final Object emanatingObject) {
-        this.setStrategies(TraversalStrategies.GlobalCache.getStrategies(emanatingObject.getClass()));
+    public DefaultTraversal(final Graph graph) {
+        this.graph = graph;
+        this.setStrategies(TraversalStrategies.GlobalCache.getStrategies(this.graph.getClass()));
         this.traversalEngine = StandardTraversalEngine.instance(); // TODO: remove and then clean up v.outE
     }
 
@@ -244,4 +249,9 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
         return this.traversalParent;
     }
 
+    @Override
+    public Optional<Graph> getGraph() {
+        return Optional.ofNullable(this.graph);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cadf6cca/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java
index 186a19b..32f1ae5 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java
@@ -31,9 +31,11 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversalSideEffects;
 import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.traverser.O_TraverserGenerator;
+import org.apache.tinkerpop.gremlin.structure.Graph;
 
 import java.util.Collections;
 import java.util.List;
+import java.util.Optional;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -134,4 +136,9 @@ public abstract class AbstractLambdaTraversal<S, E> implements Traversal.Admin<S
 
     }
 
+    @Override
+    public Optional<Graph> getGraph() {
+        return Optional.empty();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cadf6cca/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/HasNextTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/HasNextTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/HasNextTraversal.java
index 3e7a15f..839e722 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/HasNextTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/HasNextTraversal.java
@@ -26,6 +26,7 @@ import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Graph;
 
 import java.util.List;
 import java.util.Optional;
@@ -143,4 +144,9 @@ public final class HasNextTraversal<S> implements Traversal.Admin<S, Boolean> {
     public void reset() {
         this.hasNextTraversal.reset();
     }
+
+    @Override
+    public Optional<Graph> getGraph() {
+        return Optional.empty();
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cadf6cca/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java
index f78a8b6..1560299 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.util;
 
+import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
 import org.apache.tinkerpop.gremlin.process.Step;
 import org.apache.tinkerpop.gremlin.process.Traversal;
 import org.apache.tinkerpop.gremlin.process.TraversalEngine;
@@ -25,12 +26,11 @@ import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
 import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.Traverser;
 import org.apache.tinkerpop.gremlin.process.TraverserGenerator;
-import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
 import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
+import org.apache.tinkerpop.gremlin.structure.Graph;
 
 import java.util.Collections;
 import java.util.Iterator;
@@ -173,4 +173,9 @@ public class EmptyTraversal<S, E> implements Traversal.Admin<S, E> {
     public Set<TraverserRequirement> getTraverserRequirements() {
         return Collections.emptySet();
     }
+
+    @Override
+    public Optional<Graph> getGraph() {
+        return Optional.empty();
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cadf6cca/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
index bb2446c..3cdf4b2 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
@@ -89,10 +89,6 @@ public final class TraversalHelper {
         return steps;
     }
 
-    public static Graph getGraph(final Traversal.Admin<?, ?> traversal) {
-        return ((GraphStep) traversal.getStartStep()).getGraph(Graph.class);
-    }
-
     public static boolean isLocalStarGraph(final Traversal.Admin<?, ?> traversal) {
         char state = 'v';
         for (final Step step : traversal.getSteps()) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cadf6cca/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/PartitionStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/PartitionStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/PartitionStrategy.java
index 5a6a6e1..7c76f13 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/PartitionStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/PartitionStrategy.java
@@ -30,6 +30,7 @@ import org.apache.tinkerpop.gremlin.structure.Contains;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Property;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;
@@ -185,8 +186,8 @@ public final class PartitionStrategy implements GraphStrategy {
         }
     }
 
-    private final <S, E> GraphTraversal<S, E> generateTraversal(final Object emanatingObject) {
-        return new DefaultGraphTraversal<S, E>(emanatingObject) {
+    private final <S, E> GraphTraversal<S, E> generateTraversal(final Graph graph) {
+        return new DefaultGraphTraversal<S, E>(graph) {
             @Override
             public GraphTraversal<S, Vertex> to(final Direction direction, final String... edgeLabels) {
                 return direction.equals(Direction.BOTH) ?

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cadf6cca/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/process/graph/step/sideEffect/StrategyGraphStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/process/graph/step/sideEffect/StrategyGraphStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/process/graph/step/sideEffect/StrategyGraphStep.java
index af415f6..403df97 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/process/graph/step/sideEffect/StrategyGraphStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/process/graph/step/sideEffect/StrategyGraphStep.java
@@ -37,7 +37,7 @@ public class StrategyGraphStep<E extends Element> extends GraphStep<E> {
     private final GraphTraversal<?, E> graphTraversal;
 
     public StrategyGraphStep(final Traversal.Admin traversal, final StrategyGraph strategyGraph, final Class<E> returnClass, final GraphTraversal<?, E> graphTraversal) {
-        super(traversal, strategyGraph, returnClass);
+        super(traversal, returnClass);
         this.graphTraversal = graphTraversal;
         this.setIteratorSupplier(() -> (Iterator) (Vertex.class.isAssignableFrom(this.returnClass) ?
                 new StrategyVertex.StrategyVertexIterator((Iterator) this.graphTraversal, strategyGraph) :

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cadf6cca/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/TraversalHelperTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/TraversalHelperTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/TraversalHelperTest.java
index b49bee2..19f9d3f 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/TraversalHelperTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/TraversalHelperTest.java
@@ -30,6 +30,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEn
 import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.PropertyType;
+import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
 import org.junit.Test;
 import org.mockito.Mockito;
 
@@ -44,7 +45,7 @@ public class TraversalHelperTest {
 
     @Test
     public void shouldChainTogetherStepsWithNextPreviousInALinkedListStructure() {
-        Traversal.Admin traversal = new DefaultTraversal<>(new Object());
+        Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
         traversal.asAdmin().addStep(new IdentityStep(traversal));
         traversal.asAdmin().addStep(new HasStep(traversal, null));
         traversal.asAdmin().addStep(new LambdaFilterStep(traversal, traverser -> true));
@@ -53,13 +54,13 @@ public class TraversalHelperTest {
 
     @Test
     public void shouldAddStepsCorrectly() {
-        Traversal.Admin traversal = new DefaultTraversal<>(new Object());
+        Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
         traversal.asAdmin().addStep(0, new LambdaFilterStep(traversal, traverser -> true));
         traversal.asAdmin().addStep(0, new HasStep(traversal, null));
         traversal.asAdmin().addStep(0, new IdentityStep(traversal));
         validateToyTraversal(traversal);
 
-        traversal = new DefaultTraversal<>(new Object());
+        traversal = new DefaultTraversal<>(EmptyGraph.instance());
         traversal.asAdmin().addStep(0, new IdentityStep(traversal));
         traversal.asAdmin().addStep(1, new HasStep(traversal, null));
         traversal.asAdmin().addStep(2, new LambdaFilterStep(traversal, traverser -> true));
@@ -68,7 +69,7 @@ public class TraversalHelperTest {
 
     @Test
     public void shouldRemoveStepsCorrectly() {
-        Traversal.Admin traversal = new DefaultTraversal<>(new Object());
+        Traversal.Admin traversal = new DefaultTraversal<>(EmptyGraph.instance());
         traversal.asAdmin().addStep(new IdentityStep(traversal));
         traversal.asAdmin().addStep(new HasStep(traversal, null));
         traversal.asAdmin().addStep(new LambdaFilterStep(traversal, traverser -> true));

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cadf6cca/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyAddVertexTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyAddVertexTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyAddVertexTest.groovy
index 2e47b5a..0f6f398 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyAddVertexTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyAddVertexTest.groovy
@@ -37,5 +37,10 @@ public abstract class GroovyAddVertexTest {
         public Traversal<Vertex, Vertex> get_g_V_addVXlabel_animal_age_0X() {
             g.V.addV(T.label, 'animal', 'age', 0);
         }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_addVXlabel_person_name_stephenX() {
+            g.addV(T.label, 'person', 'name', 'stephen');
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cadf6cca/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexTest.java
index fd66b9d..020b98b 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexTest.java
@@ -28,11 +28,11 @@ import org.apache.tinkerpop.gremlin.process.UseEngine;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-import org.junit.Ignore;
 import org.junit.Test;
 
 import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -41,9 +41,10 @@ public abstract class AddVertexTest extends AbstractGremlinTest {
 
     public abstract Traversal<Vertex, Vertex> get_g_V_addVXlabel_animal_age_0X();
 
+    public abstract Traversal<Vertex, Vertex> get_g_addVXlabel_person_name_stephenX();
+
     @Test
     @LoadGraphWith(MODERN)
-    @Ignore
     @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
     public void g_V_addVXlabel_animal_age_0X() {
         final Traversal<Vertex, Vertex> traversal = get_g_V_addVXlabel_animal_age_0X();
@@ -59,6 +60,20 @@ public abstract class AddVertexTest extends AbstractGremlinTest {
         assertEquals(6, count);
     }
 
+    @Test
+    @LoadGraphWith(MODERN)
+    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
+    public void g_addVXlabel_person_name_stephenX() {
+        final Traversal<Vertex, Vertex> traversal = get_g_addVXlabel_person_name_stephenX();
+        printTraversalForm(traversal);
+        final Vertex stephen = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals("person", stephen.label());
+        assertEquals("stephen", stephen.value("name"));
+        assertEquals(1, IteratorUtils.count(stephen.properties()));
+        assertEquals(7, IteratorUtils.count(graph.vertices()));
+    }
+
 
     @UseEngine(TraversalEngine.Type.STANDARD)
     public static class Traversals extends AddVertexTest {
@@ -67,5 +82,10 @@ public abstract class AddVertexTest extends AbstractGremlinTest {
         public Traversal<Vertex, Vertex> get_g_V_addVXlabel_animal_age_0X() {
             return g.V().addV(T.label, "animal", "age", 0);
         }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_addVXlabel_person_name_stephenX() {
+            return g.addV(T.label, "person", "name", "stephen");
+        }
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cadf6cca/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/step/sideEffect/Neo4jGraphStep.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/step/sideEffect/Neo4jGraphStep.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/step/sideEffect/Neo4jGraphStep.java
index 937a2fa..4fef2fd 100644
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/step/sideEffect/Neo4jGraphStep.java
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/step/sideEffect/Neo4jGraphStep.java
@@ -61,27 +61,29 @@ public class Neo4jGraphStep<S extends Element> extends GraphStep<S> {
 
     public final List<HasContainer> hasContainers = new ArrayList<>();
 
-    public Neo4jGraphStep(final Traversal.Admin traversal, final Neo4jGraph graph, final Class<S> returnClass, final Object... ids) {
-        super(traversal, graph, returnClass, ids);
+    public Neo4jGraphStep(final Traversal.Admin traversal, final Class<S> returnClass, final Object... ids) {
+        super(traversal, returnClass, ids);
         this.setIteratorSupplier(() -> (Iterator<S>) (Vertex.class.isAssignableFrom(this.returnClass) ? this.vertices() : this.edges()));
     }
 
     private Iterator<? extends Edge> edges() {
-        this.graph.tx().readWrite();
+        final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
+        graph.tx().readWrite();
         // ids are present, filter on them first
         if (this.ids != null && this.ids.length > 0)
-            return IteratorUtils.filter(this.graph.edges(this.ids), edge -> HasContainer.testAll((Edge) edge, this.hasContainers));
+            return IteratorUtils.filter(graph.edges(this.ids), edge -> HasContainer.testAll((Edge) edge, this.hasContainers));
         final HasContainer hasContainer = this.getHasContainerForAutomaticIndex(Edge.class);
         return (null == hasContainer) ?
-                IteratorUtils.filter(this.graph.edges(), edge -> HasContainer.testAll((Edge) edge, this.hasContainers)) :
+                IteratorUtils.filter(graph.edges(), edge -> HasContainer.testAll((Edge) edge, this.hasContainers)) :
                 getEdgesUsingAutomaticIndex(hasContainer).filter(edge -> HasContainer.testAll((Edge) edge, this.hasContainers)).iterator();
     }
 
     private Iterator<? extends Vertex> vertices() {
-        this.graph.tx().readWrite();
+        final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
+        graph.tx().readWrite();
         // ids are present, filter on them first
         if (this.ids != null && this.ids.length > 0)
-            return IteratorUtils.filter(this.graph.vertices(this.ids), vertex -> HasContainer.testAll((Vertex) vertex, this.hasContainers));
+            return IteratorUtils.filter(graph.vertices(this.ids), vertex -> HasContainer.testAll((Vertex) vertex, this.hasContainers));
         // a label and a property
         final Pair<String, HasContainer> labelHasPair = this.getHasContainerForLabelIndex();
         if (null != labelHasPair)
@@ -97,56 +99,61 @@ public class Neo4jGraphStep<S extends Element> extends GraphStep<S> {
         if (null != labels)
             return this.getVerticesUsingOnlyLabels(labels).filter(vertex -> HasContainer.testAll((Vertex) vertex, this.hasContainers)).iterator();
         // linear scan
-        return IteratorUtils.filter(this.graph.vertices(), vertex -> HasContainer.testAll((Vertex) vertex, this.hasContainers));
+        return IteratorUtils.filter(graph.vertices(), vertex -> HasContainer.testAll((Vertex) vertex, this.hasContainers));
     }
 
 
     private Stream<Neo4jVertex> getVerticesUsingLabelAndProperty(final String label, final HasContainer hasContainer) {
         //System.out.println("labelProperty: " + label + ":" + hasContainer);
-        final ResourceIterator<Node> iterator1 = this.getGraph(Neo4jGraph.class).getBaseGraph().findNodesByLabelAndProperty(DynamicLabel.label(label), hasContainer.key, hasContainer.value).iterator();
-        final ResourceIterator<Node> iterator2 = this.getGraph(Neo4jGraph.class).getBaseGraph().findNodesByLabelAndProperty(DynamicLabel.label(hasContainer.key), T.value.getAccessor(), hasContainer.value).iterator();
+        final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
+        final ResourceIterator<Node> iterator1 = graph.getBaseGraph().findNodesByLabelAndProperty(DynamicLabel.label(label), hasContainer.key, hasContainer.value).iterator();
+        final ResourceIterator<Node> iterator2 = graph.getBaseGraph().findNodesByLabelAndProperty(DynamicLabel.label(hasContainer.key), T.value.getAccessor(), hasContainer.value).iterator();
         final Stream<Neo4jVertex> stream1 = StreamFactory.stream(iterator1)
                 .filter(node -> ElementHelper.idExists(node.getId(), this.ids))
-                .map(node -> new Neo4jVertex(node, this.getGraph(Neo4jGraph.class)));
+                .map(node -> new Neo4jVertex(node, graph));
         final Stream<Neo4jVertex> stream2 = StreamFactory.stream(iterator2)
                 .filter(node -> ElementHelper.idExists(node.getId(), this.ids))
                 .filter(node -> node.getProperty(T.key.getAccessor()).equals(hasContainer.key))
                 .map(node -> node.getRelationships(Direction.INCOMING).iterator().next().getStartNode())
-                .map(node -> new Neo4jVertex(node, this.getGraph(Neo4jGraph.class)));
+                .map(node -> new Neo4jVertex(node, graph));
         return Stream.concat(stream1, stream2);
     }
 
     private Stream<Neo4jVertex> getVerticesUsingOnlyLabels(final List<String> labels) {
         //System.out.println("labels: " + labels);
+        final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
         return labels.stream()
                 .filter(label -> !label.equals(Neo4jVertexProperty.VERTEX_PROPERTY_LABEL.name()))
-                .flatMap(label -> StreamFactory.stream(GlobalGraphOperations.at(this.getGraph(Neo4jGraph.class).getBaseGraph()).getAllNodesWithLabel(DynamicLabel.label(label)).iterator()))
+                .flatMap(label -> StreamFactory.stream(GlobalGraphOperations.at(graph.getBaseGraph()).getAllNodesWithLabel(DynamicLabel.label(label)).iterator()))
                 .filter(node -> !node.hasLabel(Neo4jVertexProperty.VERTEX_PROPERTY_LABEL))
                 .filter(node -> ElementHelper.idExists(node.getId(), this.ids))
-                .map(node -> new Neo4jVertex(node, this.getGraph(Neo4jGraph.class)));
+                .map(node -> new Neo4jVertex(node, graph));
     }
 
     private Stream<Neo4jVertex> getVerticesUsingAutomaticIndex(final HasContainer hasContainer) {
         //System.out.println("automatic index: " + hasContainer);
-        return StreamFactory.stream(this.getGraph(Neo4jGraph.class).getBaseGraph().index().getNodeAutoIndexer().getAutoIndex().get(hasContainer.key, hasContainer.value).iterator())
+        final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
+        return StreamFactory.stream(graph.getBaseGraph().index().getNodeAutoIndexer().getAutoIndex().get(hasContainer.key, hasContainer.value).iterator())
                 .map(node -> node.hasLabel(Neo4jVertexProperty.VERTEX_PROPERTY_LABEL) ?
                         node.getRelationships(Direction.INCOMING).iterator().next().getStartNode() :
                         node)
                 .filter(node -> ElementHelper.idExists(node.getId(), this.ids))
-                .map(node -> new Neo4jVertex(node, this.getGraph(Neo4jGraph.class)));
+                .map(node -> new Neo4jVertex(node, graph));
     }
 
     private Stream<Neo4jEdge> getEdgesUsingAutomaticIndex(final HasContainer hasContainer) {
-        return StreamFactory.stream(this.getGraph(Neo4jGraph.class).getBaseGraph().index().getRelationshipAutoIndexer().getAutoIndex().get(hasContainer.key, hasContainer.value).iterator())
+        final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
+        return StreamFactory.stream(graph.getBaseGraph().index().getRelationshipAutoIndexer().getAutoIndex().get(hasContainer.key, hasContainer.value).iterator())
                 .filter(relationship -> ElementHelper.idExists(relationship.getId(), this.ids))
                 .filter(relationship -> !relationship.getType().name().startsWith(Neo4jVertexProperty.VERTEX_PROPERTY_PREFIX))
-                .map(relationship -> new Neo4jEdge(relationship, this.getGraph(Neo4jGraph.class)));
+                .map(relationship -> new Neo4jEdge(relationship, graph));
     }
 
     private Pair<String, HasContainer> getHasContainerForLabelIndex() {
+        final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
         for (final HasContainer hasContainer : this.hasContainers) {
             if (hasContainer.key.equals(T.label.getAccessor()) && hasContainer.predicate.equals(Compare.eq)) {
-                for (final IndexDefinition index : this.getGraph(Neo4jGraph.class).getBaseGraph().schema().getIndexes(DynamicLabel.label((String) hasContainer.value))) {
+                for (final IndexDefinition index : graph.getBaseGraph().schema().getIndexes(DynamicLabel.label((String) hasContainer.value))) {
                     for (final HasContainer hasContainer1 : this.hasContainers) {
                         if (!hasContainer1.key.equals(T.label.getAccessor()) && hasContainer1.predicate.equals(Compare.eq)) {
                             for (final String key : index.getPropertyKeys()) {
@@ -172,9 +179,10 @@ public class Neo4jGraphStep<S extends Element> extends GraphStep<S> {
     }
 
     private HasContainer getHasContainerForAutomaticIndex(final Class<? extends Element> elementClass) {
+        final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
         final AutoIndexer<?> indexer = elementClass.equals(Vertex.class) ?
-                this.getGraph(Neo4jGraph.class).getBaseGraph().index().getNodeAutoIndexer() :
-                this.getGraph(Neo4jGraph.class).getBaseGraph().index().getRelationshipAutoIndexer();
+                graph.getBaseGraph().index().getNodeAutoIndexer() :
+                graph.getBaseGraph().index().getRelationshipAutoIndexer();
 
         if (!indexer.isEnabled())
             return null;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cadf6cca/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraph.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraph.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraph.java
index e573d41..a10318e 100644
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraph.java
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraph.java
@@ -21,7 +21,6 @@ package org.apache.tinkerpop.gremlin.neo4j.structure;
 import org.apache.commons.configuration.BaseConfiguration;
 import org.apache.commons.configuration.Configuration;
 import org.apache.commons.configuration.ConfigurationConverter;
-import org.apache.tinkerpop.gremlin.neo4j.process.graph.traversal.step.sideEffect.Neo4jGraphStep;
 import org.apache.tinkerpop.gremlin.neo4j.process.graph.traversal.step.util.Neo4jCypherIterator;
 import org.apache.tinkerpop.gremlin.neo4j.process.graph.traversal.strategy.Neo4jGraphStepStrategy;
 import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
@@ -70,6 +69,16 @@ import java.util.stream.Stream;
         method = "shouldThrowExceptionIfVertexWasRemovedWhenCallingProperty",
         specific = "property(single,k,v)",
         reason = "Neo4j throws a NodeNotFoundException instead of the desired IllegalStateException")
+@Graph.OptOut(
+        test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexTest$Traversals",
+        method = "g_V_addVXlabel_animal_age_0X",
+        reason = "Neo4j global graph operators stream created vertices created after the access to the global iterator"
+)
+@Graph.OptOut(
+        test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyAddVertexTest$StandardTraversals",
+        method = "g_V_addVXlabel_animal_age_0X",
+        reason = "Neo4j global graph operators stream created vertices created after the access to the global iterator"
+)
 public class Neo4jGraph implements Graph, WrappedGraph<GraphDatabaseService> {
 
     static {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cadf6cca/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/graph/traversal/sideEffect/TinkerGraphStep.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/graph/traversal/sideEffect/TinkerGraphStep.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/graph/traversal/sideEffect/TinkerGraphStep.java
index a6117a4..b5699a8 100644
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/graph/traversal/sideEffect/TinkerGraphStep.java
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/graph/traversal/sideEffect/TinkerGraphStep.java
@@ -44,40 +44,42 @@ public class TinkerGraphStep<S extends Element> extends GraphStep<S> implements
     public final List<HasContainer> hasContainers = new ArrayList<>();
 
     public TinkerGraphStep(final GraphStep<S> originalGraphStep) {
-        super(originalGraphStep.getTraversal(), originalGraphStep.getGraph(TinkerGraph.class), originalGraphStep.getReturnClass(), originalGraphStep.getIds());
+        super(originalGraphStep.getTraversal(), originalGraphStep.getReturnClass(), originalGraphStep.getIds());
         if (originalGraphStep.getLabel().isPresent())
             this.setLabel(originalGraphStep.getLabel().get());
         this.setIteratorSupplier(() -> (Iterator<S>) (Vertex.class.isAssignableFrom(this.returnClass) ? this.vertices() : this.edges()));
     }
 
     private Iterator<? extends Edge> edges() {
+        final TinkerGraph graph = (TinkerGraph) this.getTraversal().getGraph().get();
         final HasContainer indexedContainer = getIndexKey(Edge.class);
         // ids are present, filter on them first
         if (this.ids != null && this.ids.length > 0)
-            return this.iteratorList(this.getGraph(TinkerGraph.class).edges(this.ids));
+            return this.iteratorList(graph.edges(this.ids));
         else
             return null == indexedContainer ?
-                    this.iteratorList(this.getGraph(TinkerGraph.class).edges()) :
-                    TinkerHelper.queryEdgeIndex(this.getGraph(TinkerGraph.class), indexedContainer.key, indexedContainer.value).stream()
+                    this.iteratorList(graph.edges()) :
+                    TinkerHelper.queryEdgeIndex(graph, indexedContainer.key, indexedContainer.value).stream()
                             .filter(edge -> HasContainer.testAll(edge, this.hasContainers))
                             .collect(Collectors.<Edge>toList()).iterator();
     }
 
     private Iterator<? extends Vertex> vertices() {
+        final TinkerGraph graph = (TinkerGraph) this.getTraversal().getGraph().get();
         final HasContainer indexedContainer = getIndexKey(Vertex.class);
         // ids are present, filter on them first
         if (this.ids != null && this.ids.length > 0)
-            return this.iteratorList(this.getGraph(TinkerGraph.class).vertices(this.ids));
+            return this.iteratorList(graph.vertices(this.ids));
         else
             return null == indexedContainer ?
-                    this.iteratorList(this.getGraph(TinkerGraph.class).vertices()) :
-                    TinkerHelper.queryVertexIndex(this.getGraph(TinkerGraph.class), indexedContainer.key, indexedContainer.value).stream()
+                    this.iteratorList(graph.vertices()) :
+                    TinkerHelper.queryVertexIndex(graph, indexedContainer.key, indexedContainer.value).stream()
                             .filter(vertex -> HasContainer.testAll(vertex, this.hasContainers))
                             .collect(Collectors.<Vertex>toList()).iterator();
     }
 
     private HasContainer getIndexKey(final Class<? extends Element> indexedClass) {
-        final Set<String> indexedKeys = this.getGraph(TinkerGraph.class).getIndexedKeys(indexedClass);
+        final Set<String> indexedKeys = ((TinkerGraph) this.getTraversal().getGraph().get()).getIndexedKeys(indexedClass);
         return this.hasContainers.stream()
                 .filter(c -> indexedKeys.contains(c.key) && c.predicate.equals(Compare.eq))
                 .findAny()