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 2016/02/17 04:45:25 UTC

incubator-tinkerpop git commit: TraversalVertexProgram now uses the GraphStep instead of reasoning on its internal state. This simplifies the code and stages us for mid-traversal V()/E(). Added a new GraphTest. Fixed an old problem with TraversalVertexPr

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1154 01b4a539b -> 86284f2c8


TraversalVertexProgram now uses the GraphStep instead of reasoning on its internal state. This simplifies the code and stages us for mid-traversal V()/E(). Added a new GraphTest. Fixed an old problem with TraversalVertexProgram and headless-traversals. I just changed and old GraphComputerTest and it worked. Sweet.


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

Branch: refs/heads/TINKERPOP-1154
Commit: 86284f2c8f6c13782e5165c37e35c7a56a66192a
Parents: 01b4a53
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Feb 16 20:45:15 2016 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue Feb 16 20:45:15 2016 -0700

----------------------------------------------------------------------
 .../ranking/pagerank/PageRankVertexProgram.java | 25 ++++---
 .../traversal/TraversalVertexProgram.java       | 78 +++++++-------------
 .../step/map/PageRankVertexProgramStep.java     |  2 +-
 .../process/traversal/step/map/GraphStep.java   |  1 +
 .../decoration/VertexProgramStrategy.java       |  2 +-
 .../traversal/step/map/GroovyGraphTest.groovy   |  5 ++
 .../process/computer/GraphComputerTest.java     |  3 +-
 .../process/traversal/step/map/GraphTest.java   | 15 ++++
 .../structure/TinkerGraphPlayTest.java          |  7 +-
 9 files changed, 70 insertions(+), 68 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/86284f2c/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/pagerank/PageRankVertexProgram.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/pagerank/PageRankVertexProgram.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/pagerank/PageRankVertexProgram.java
index b0b4a93..d6d2e9b 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/pagerank/PageRankVertexProgram.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/pagerank/PageRankVertexProgram.java
@@ -53,7 +53,7 @@ public class PageRankVertexProgram extends StaticVertexProgram<Double> {
     public static final String PAGE_RANK = "gremlin.pageRankVertexProgram.pageRank";
     public static final String EDGE_COUNT = "gremlin.pageRankVertexProgram.edgeCount";
 
-    public static final String PAGE_RANK_PROPERTY = "gremlin.pageRankVertexProgram.pageRankProperty";
+    public static final String PROPERTY = "gremlin.pageRankVertexProgram.property";
     private static final String VERTEX_COUNT = "gremlin.pageRankVertexProgram.vertexCount";
     private static final String ALPHA = "gremlin.pageRankVertexProgram.alpha";
     private static final String TOTAL_ITERATIONS = "gremlin.pageRankVertexProgram.totalIterations";
@@ -67,7 +67,7 @@ public class PageRankVertexProgram extends StaticVertexProgram<Double> {
     private double vertexCountAsDouble = 1.0d;
     private double alpha = 0.85d;
     private int totalIterations = 30;
-    private String pageRankProperty = PAGE_RANK;
+    private String property = PAGE_RANK;
     private Set<String> computeKeys;
 
     private PageRankVertexProgram() {
@@ -86,9 +86,8 @@ public class PageRankVertexProgram extends StaticVertexProgram<Double> {
         this.vertexCountAsDouble = configuration.getDouble(VERTEX_COUNT, 1.0d);
         this.alpha = configuration.getDouble(ALPHA, 0.85d);
         this.totalIterations = configuration.getInt(TOTAL_ITERATIONS, 30);
-        this.pageRankProperty = configuration.getString(PAGE_RANK_PROPERTY, PAGE_RANK);
-        this.computeKeys = new HashSet<>(Arrays.asList(this.pageRankProperty, EDGE_COUNT));
-
+        this.property = configuration.getString(PROPERTY, PAGE_RANK);
+        this.computeKeys = new HashSet<>(Arrays.asList(this.property, EDGE_COUNT));
     }
 
     @Override
@@ -97,7 +96,7 @@ public class PageRankVertexProgram extends StaticVertexProgram<Double> {
         configuration.setProperty(VERTEX_COUNT, this.vertexCountAsDouble);
         configuration.setProperty(ALPHA, this.alpha);
         configuration.setProperty(TOTAL_ITERATIONS, this.totalIterations);
-        configuration.setProperty(PAGE_RANK_PROPERTY, this.pageRankProperty);
+        configuration.setProperty(PROPERTY, this.property);
         if (null != this.edgeTraversal)
             this.edgeTraversal.storeState(configuration, EDGE_TRAVERSAL);
         if (null != this.vertexTraversal)
@@ -143,7 +142,7 @@ public class PageRankVertexProgram extends StaticVertexProgram<Double> {
         } else if (1 == memory.getIteration()) {
             double initialPageRank = 1.0d / this.vertexCountAsDouble;
             double edgeCount = IteratorUtils.reduce(messenger.receiveMessages(), 0.0d, (a, b) -> a + b);
-            vertex.property(VertexProperty.Cardinality.single, this.pageRankProperty, initialPageRank);
+            vertex.property(VertexProperty.Cardinality.single, this.property, initialPageRank);
             vertex.property(VertexProperty.Cardinality.single, EDGE_COUNT, edgeCount);
             messenger.sendMessage(this.incidentMessageScope, initialPageRank / edgeCount);
         } else {
@@ -151,7 +150,7 @@ public class PageRankVertexProgram extends StaticVertexProgram<Double> {
                 return;
             double newPageRank = IteratorUtils.reduce(messenger.receiveMessages(), 0.0d, (a, b) -> a + b);
             newPageRank = (this.alpha * newPageRank) + ((1.0d - this.alpha) / this.vertexCountAsDouble);
-            vertex.property(VertexProperty.Cardinality.single, this.pageRankProperty, newPageRank);
+            vertex.property(VertexProperty.Cardinality.single, this.property, newPageRank);
             messenger.sendMessage(this.incidentMessageScope, newPageRank / vertex.<Double>value(EDGE_COUNT));
         }
     }
@@ -188,8 +187,8 @@ public class PageRankVertexProgram extends StaticVertexProgram<Double> {
             return this;
         }
 
-        public Builder pageRankProperty(final String key) {
-            this.configuration.setProperty(PAGE_RANK_PROPERTY, key);
+        public Builder property(final String key) {
+            this.configuration.setProperty(PROPERTY, key);
             return this;
         }
 
@@ -208,11 +207,17 @@ public class PageRankVertexProgram extends StaticVertexProgram<Double> {
             return this;
         }
 
+        /**
+         * @deprecated As of release 3.2.0, replaced by {@link org.apache.tinkerpop.gremlin.process.computer.ranking.pagerank.PageRankVertexProgram.Builder#edges(Traversal.Admin)}
+         */
         @Deprecated
         public Builder traversal(final TraversalSource traversalSource, final String scriptEngine, final String traversalScript, final Object... bindings) {
             return this.edges(new ScriptTraversal<>(traversalSource, scriptEngine, traversalScript, bindings));
         }
 
+        /**
+         * @deprecated As of release 3.2.0, replaced by {@link org.apache.tinkerpop.gremlin.process.computer.ranking.pagerank.PageRankVertexProgram.Builder#edges(Traversal.Admin)}
+         */
         @Deprecated
         public Builder traversal(final Traversal.Admin<Vertex, Edge> traversal) {
             return this.edges(traversal);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/86284f2c/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
index 4ceeb48..fa9054e 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
@@ -32,7 +32,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.TraverserGenerator;
 import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapStep;
@@ -43,13 +42,14 @@ import org.apache.tinkerpop.gremlin.process.traversal.util.ScriptTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMatrix;
 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.Vertex;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;
 import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+import org.apache.tinkerpop.gremlin.util.iterator.EmptyIterator;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
 import java.util.Arrays;
 import java.util.Collections;
@@ -135,56 +135,32 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
     public void execute(final Vertex vertex, final Messenger<TraverserSet<?>> messenger, final Memory memory) {
         this.traversal.getSideEffects().setLocalVertex(vertex);
         if (memory.isInitialIteration()) {    // ITERATION 1
-            if (!(this.traversal.getStartStep() instanceof GraphStep)) {  // NOT A GRAPH-STEP TRAVERSAL
-                final TraverserSet<Object> haltedTraversers = vertex.<TraverserSet<Object>>property(HALTED_TRAVERSERS).orElse(new TraverserSet<>());
-                vertex.property(VertexProperty.Cardinality.single, HALTED_TRAVERSERS, haltedTraversers);
-                if (haltedTraversers.isEmpty()) {
-                    memory.and(VOTE_TO_HALT, true);
-                } else {
-                    final TraverserSet<Object> aliveTraverses = new TraverserSet<>();
-                    haltedTraversers.forEach(traverser -> {
-                        traverser.setStepId(this.traversal.getStartStep().getId());
-                        aliveTraverses.add(traverser);
-                    });
-                    haltedTraversers.clear();
-                    memory.and(VOTE_TO_HALT, TraverserExecutor.execute(vertex, new SingleMessenger<>(messenger, aliveTraverses), this.traversalMatrix));
-                }
-            } else {                                                     // A GRAPH-STEP TRAVERSAL
-                final TraverserSet<Object> haltedTraversers = new TraverserSet<>();
-                vertex.property(VertexProperty.Cardinality.single, HALTED_TRAVERSERS, haltedTraversers);
-                final GraphStep<Element, Element> graphStep = (GraphStep<Element, Element>) this.traversal.getStartStep();
-                final String future = (this.traversal.getStartStep() instanceof GraphStep) ? graphStep.getNextStep().getId() : this.traversal.getStartStep().getId();
-                final TraverserGenerator traverserGenerator = this.traversal.getTraverserGenerator();
-                if (graphStep.returnsVertex()) {  // VERTICES (process the first step locally)
-                    if (ElementHelper.idExists(vertex.id(), graphStep.getIds())) {
-                        final Traverser.Admin<Element> traverser = traverserGenerator.generate(vertex, graphStep, 1l);
-                        traverser.setStepId(future);
-                        traverser.detach();  // TODO: bad?
-                        if (traverser.isHalted())
-                            haltedTraversers.add((Traverser.Admin) traverser);
-                        else
-                            memory.and(VOTE_TO_HALT, TraverserExecutor.execute(vertex, new SingleMessenger<>(messenger, new TraverserSet<>(traverser)), this.traversalMatrix));
-                    }
-                } else {  // EDGES (process the first step via a message pass)
-                    boolean voteToHalt = true;
-                    final Iterator<Edge> starts = vertex.edges(Direction.OUT);
-                    while (starts.hasNext()) {
-                        final Edge start = starts.next();
-                        if (ElementHelper.idExists(start.id(), graphStep.getIds())) {
-                            final Traverser.Admin<Element> traverser = traverserGenerator.generate(start, graphStep, 1l);
-                            traverser.setStepId(future);
-                            traverser.detach(); // TODO: bad?
-                            if (traverser.isHalted())
-                                haltedTraversers.add((Traverser.Admin) traverser);
-                            else {
-                                voteToHalt = false;
-                                messenger.sendMessage(MessageScope.Global.of(vertex), new TraverserSet<>(traverser));
-                            }
-                        }
-                    }
-                    memory.and(VOTE_TO_HALT, voteToHalt);
-                }
+            final TraverserSet<Object> haltedTraversers = vertex.<TraverserSet<Object>>property(HALTED_TRAVERSERS).orElse(new TraverserSet<>());
+            vertex.property(VertexProperty.Cardinality.single, HALTED_TRAVERSERS, haltedTraversers);
+            final TraverserSet<Object> aliveTraverses = new TraverserSet<>();
+            IteratorUtils.removeOnNext(haltedTraversers.iterator()).forEachRemaining(traverser -> {
+                traverser.setStepId(this.traversal.getStartStep().getId());
+                aliveTraverses.add((Traverser.Admin) traverser);
+            });
+            assert haltedTraversers.isEmpty();
+            if (this.traversal.getStartStep() instanceof GraphStep) {
+                final GraphStep<?, ?> graphStep = (GraphStep<Element, Element>) this.traversal.getStartStep();
+                graphStep.reset();
+                aliveTraverses.forEach(traverser -> graphStep.addStart((Traverser.Admin) traverser));
+                aliveTraverses.clear();
+                if (graphStep.returnsVertex())
+                    graphStep.setIteratorSupplier(() -> ElementHelper.idExists(vertex.id(), graphStep.getIds()) ? (Iterator) IteratorUtils.of(vertex) : EmptyIterator.instance());
+                else
+                    graphStep.setIteratorSupplier(() -> (Iterator) IteratorUtils.filter(vertex.edges(Direction.OUT), edge -> ElementHelper.idExists(edge.id(), graphStep.getIds())));
+                graphStep.forEachRemaining(traverser -> {
+                    if (traverser.asAdmin().isHalted()) {
+                        traverser.asAdmin().detach();
+                        haltedTraversers.add((Traverser.Admin) traverser);
+                    } else
+                        aliveTraverses.add((Traverser.Admin) traverser);
+                });
             }
+            memory.and(VOTE_TO_HALT, aliveTraverses.isEmpty() || TraverserExecutor.execute(vertex, new SingleMessenger<>(messenger, aliveTraverses), this.traversalMatrix));
         } else {  // ITERATION 1+
             memory.and(VOTE_TO_HALT, TraverserExecutor.execute(vertex, messenger, this.traversalMatrix));
         }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/86284f2c/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PageRankVertexProgramStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PageRankVertexProgramStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PageRankVertexProgramStep.java
index 59b31ad..7cc543a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PageRankVertexProgramStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/PageRankVertexProgramStep.java
@@ -107,7 +107,7 @@ public final class PageRankVertexProgramStep extends AbstractStep<ComputerResult
 
     private PageRankVertexProgram generateProgram(final Graph graph) {
         return PageRankVertexProgram.build()
-                .pageRankProperty(this.pageRankProperty)
+                .property(this.pageRankProperty)
                 .edges(this.compileTraversal(graph))
                 .create(graph);
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/86284f2c/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStep.java
index ca332bc..4131b83 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStep.java
@@ -131,6 +131,7 @@ public class GraphStep<S, E extends Element> extends AbstractStep<S, E> implemen
     public void reset() {
         super.reset();
         this.head = null;
+        this.done = false;
         this.iterator = EmptyIterator.instance();
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/86284f2c/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/VertexProgramStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/VertexProgramStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/VertexProgramStrategy.java
index ba9dec3..354e5a5 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/VertexProgramStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/VertexProgramStrategy.java
@@ -96,7 +96,7 @@ public final class VertexProgramStrategy extends AbstractTraversalStrategy<Trave
                 TraversalHelper.insertAfterStep(computerResultStep, (Step) step, traversal);
             }
         });
-        if (traversal.getEndStep() instanceof PageRankVertexProgramStep) {
+        if (traversal.getEndStep() instanceof PageRankVertexProgramStep) {  // TODO: VertexComputing but not TraversalVertexProgramStep
             final TraversalVertexProgramStep traversalVertexProgramStep = new TraversalVertexProgramStep(traversal, __.identity().asAdmin());
             traversal.addStep(traversalVertexProgramStep);
             traversal.addStep(new ComputerResultStep<>(traversal, true));

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/86284f2c/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyGraphTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyGraphTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyGraphTest.groovy
index bad69aa..cff3e65 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyGraphTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyGraphTest.groovy
@@ -37,6 +37,11 @@ public abstract class GroovyGraphTest {
         }
 
         @Override
+        public Traversal<Vertex, String> get_g_V_outXknowsX_V_name() {
+            new ScriptTraversal<>(g, "gremlin-groovy", "g.V.out('knows').V.name")
+        }
+
+        @Override
         public Traversal<Vertex, String> get_g_V_hasXname_GarciaX_inXsungByX_asXsongX_V_hasXname_Willie_DixonX_inXwrittenByX_whereXeqXsongXX_name() {
             new ScriptTraversal<>(g, "gremlin-groovy", "g.V.has('name','Garcia').in('sungBy').as('song').V.has('name','Willie_Dixon').in('writtenBy').where(eq('song')).name")
         }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/86284f2c/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java
index 6dc8015..254ac31 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java
@@ -1859,9 +1859,8 @@ public class GraphComputerTest extends AbstractGremlinProcessTest {
         assertEquals(6, graph2.traversal().V().values(PageRankVertexProgram.PAGE_RANK).count().next().intValue());
         assertEquals(6, graph2.traversal().V().values(PageRankVertexProgram.EDGE_COUNT).count().next().intValue());
         //
-        // TODO: Need to solve the chicken and the egg problem with how TraversalVertexPrograms and strategies play on each other.
         final ComputerResult result3 = graph2.compute(graphProvider.getGraphComputer(graph2).getClass())
-                .program(TraversalVertexProgram.build().traversal(__.V().groupCount("m").by(__.values(PageRankVertexProgram.PAGE_RANK).count()).label().asAdmin()).create(graph2)).persist(GraphComputer.Persist.EDGES).result(GraphComputer.ResultGraph.NEW).submit().get();
+                .program(TraversalVertexProgram.build().traversal(g.V().groupCount("m").by(__.values(PageRankVertexProgram.PAGE_RANK).count()).label().asAdmin()).create(graph2)).persist(GraphComputer.Persist.EDGES).result(GraphComputer.ResultGraph.NEW).submit().get();
         final Graph graph3 = result3.graph();
         final Memory memory3 = result3.memory();
         assertTrue(memory3.keys().contains("m"));

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/86284f2c/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphTest.java
index 4153125..97c1f9b 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphTest.java
@@ -52,6 +52,8 @@ public abstract class GraphTest extends AbstractGremlinProcessTest {
 
     public abstract Traversal<Vertex, Edge> get_g_V_hasLabelXpersonX_asXpX_VXsoftwareX_addInEXuses_pX();
 
+    public abstract Traversal<Vertex, String> get_g_V_outXknowsX_V_name();
+
     @Test
     @LoadGraphWith(MODERN)
     public void g_VX1X_V_valuesXnameX() {
@@ -87,6 +89,14 @@ public abstract class GraphTest extends AbstractGremlinProcessTest {
         assertEquals(8, counter);
     }
 
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_outXknowsX_V_name() {
+        final Traversal<Vertex, String> traversal = get_g_V_outXknowsX_V_name();
+        printTraversalForm(traversal);
+        checkResults(Arrays.asList("marko", "marko", "josh", "josh", "vadas", "vadas", "peter", "peter", "lop", "lop", "ripple", "ripple"), traversal);
+    }
+
     public static class Traversals extends GraphTest {
 
         @Override
@@ -95,6 +105,11 @@ public abstract class GraphTest extends AbstractGremlinProcessTest {
         }
 
         @Override
+        public Traversal<Vertex, String> get_g_V_outXknowsX_V_name() {
+            return g.V().out("knows").V().values("name");
+        }
+
+        @Override
         public Traversal<Vertex, String> get_g_V_hasXname_GarciaX_inXsungByX_asXsongX_V_hasXname_Willie_DixonX_inXwrittenByX_whereXeqXsongXX_name() {
             return g.V().has("artist", "name", "Garcia").in("sungBy").as("song")
                     .V().has("artist", "name", "Willie_Dixon").in("writtenBy").where(P.eq("song")).values("name");

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/86284f2c/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
index 5def976..921c4d5 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
@@ -74,11 +74,12 @@ public class TinkerGraphPlayTest {
     @Ignore
     public void testPlay8() throws Exception {
         Graph graph = TinkerFactory.createModern();
-        GraphTraversalSource g = graph.traversal().withComputer(); //GraphTraversalSource.computer());
+        GraphTraversalSource g = graph.traversal(); //GraphTraversalSource.computer());
         //System.out.println(g.V().outE("knows").identity().inV().count().is(P.eq(5)).explain());
         //System.out.println(g.V().hasLabel("person").fold().order(Scope.local).by("age").toList());
-        System.out.println(g.V().hasLabel("person").pageRank().by("pageRank").order().by("pageRank").valueMap("name", "pageRank").iterate().toString());
-        System.out.println(g.V().hasLabel("person").pageRank().by("pageRank").order().by("pageRank").valueMap("name", "pageRank").toList());
+        System.out.println(g.V().out("knows").V().values("name").toString());
+        System.out.println(g.V().out("knows").V().values("name").iterate().toString());
+        System.out.println(g.V().out("knows").V().values("name").toList());
         //System.out.println(g.V().pageRank().order().by(PageRankVertexProgram.PAGE_RANK).valueMap().toList());
 
     }