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/27 21:53:41 UTC

incubator-tinkerpop git commit: TinkerGraphComputer, SparkGraphComputer, and GiraphGraphComputer are all consistent regarding ResultGraph/Persist options. Added helper methods to GraphComputerHelper so its easy for vendors to get consistent behavior with

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/master ec9365a21 -> 6faea9038


TinkerGraphComputer, SparkGraphComputer, and GiraphGraphComputer are all consistent regarding ResultGraph/Persist options. Added helper methods to GraphComputerHelper so its easy for vendors to get consistent behavior without any deep thought. More GraphComputerTests that validate semantics.


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

Branch: refs/heads/master
Commit: 6faea903836cb213af7798d49ae911622eb306b6
Parents: ec9365a
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed May 27 13:53:49 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed May 27 13:53:49 2015 -0600

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |   2 +
 .../computer/util/GraphComputerHelper.java      |  12 +-
 .../process/computer/GraphComputerTest.java     | 123 +++++++++++++++++--
 .../computer/AbstractHadoopGraphComputer.java   |  18 ++-
 .../computer/giraph/GiraphGraphComputer.java    |   6 +-
 .../computer/spark/SparkGraphComputer.java      |   6 +-
 .../process/computer/TinkerGraphComputer.java   |  55 ++++++---
 .../process/computer/TinkerGraphView.java       |   9 ++
 .../tinkergraph/structure/TinkerVertex.java     |   6 +-
 9 files changed, 188 insertions(+), 49 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6faea903/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 4bf047d..330b5f6 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -25,6 +25,8 @@ image::http://www.tinkerpop.com/docs/current/images/gremlin-hindu.png[width=225]
 TinkerPop 3.0.0.GA (NOT OFFICIALLY RELEASED YET)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
+* `GraphComputerTest` extended with validation of the semantics of all `ResultGraph`/`Persist` combinations.
+* GiraphGraphComputer no longer requires an extra iteration and MapReduce job to derive the full `Memory` result.
 * SparkGraphComputer now supports `InputRDD` to allow vendors/users to use a `SparkContext` to generate the adjacency list representation.
 * Added `Scope.getScopeValueByKey()` static method so all "selecting" steps use the same pattern for map, path, and sideEffect data retrieval.
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6faea903/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/GraphComputerHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/GraphComputerHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/GraphComputerHelper.java
index 2b8cf12..468791f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/GraphComputerHelper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/GraphComputerHelper.java
@@ -24,10 +24,8 @@ import org.apache.tinkerpop.gremlin.process.computer.Memory;
 import org.apache.tinkerpop.gremlin.process.computer.VertexProgram;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 
-import java.io.Serializable;
 import java.lang.reflect.Method;
-import java.util.Comparator;
-import java.util.List;
+import java.util.Optional;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -62,6 +60,14 @@ public final class GraphComputerHelper {
         }
     }
 
+    public static GraphComputer.ResultGraph getResultGraphState(final Optional<VertexProgram> vertexProgram, final Optional<GraphComputer.ResultGraph> resultGraph) {
+        return resultGraph.isPresent() ? resultGraph.get() : vertexProgram.isPresent() ? vertexProgram.get().getPreferredResultGraph() : GraphComputer.ResultGraph.ORIGINAL;
+    }
+
+    public static GraphComputer.Persist getPersistState(final Optional<VertexProgram> vertexProgram, final Optional<GraphComputer.Persist> persist) {
+        return persist.isPresent() ? persist.get() : vertexProgram.isPresent() ? vertexProgram.get().getPreferredPersist() : GraphComputer.Persist.NOTHING;
+    }
+
     public static boolean areEqual(final MapReduce a, final Object b) {
         if (null == a)
             throw Graph.Exceptions.argumentCanNotBeNull("a");

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6faea903/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 a364ed0..93bf48d 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
@@ -426,7 +426,7 @@ public class GraphComputerTest extends AbstractGremlinProcessTest {
         } catch (IllegalArgumentException e) {
             assertEquals(Memory.Exceptions.memoryDoesNotExist("BAD").getMessage(), e.getMessage());
         }
-        assertEquals(Long.valueOf(6), results.graph().traversal().V().count().next());
+        assertEquals(Long.valueOf(0), results.graph().traversal().V().count().next()); // persist new/nothing.
 
         results.graph().traversal().V().forEachRemaining(v -> {
             assertTrue(v.property("nameLengthCounter").isPresent());
@@ -1187,14 +1187,42 @@ public class GraphComputerTest extends AbstractGremlinProcessTest {
 
     /////////////////////////////////////////////
     @Test
+    @LoadGraphWith
+    public void shouldSupportPersistResultGraphPairsStatedInFeatures() throws Exception {
+        for (final GraphComputer.ResultGraph resultGraph : GraphComputer.ResultGraph.values()) {
+            for (final GraphComputer.Persist persist : GraphComputer.Persist.values()) {
+                final GraphComputer computer = graph.compute(graphComputerClass.get());
+                if (computer.features().supportsResultGraphPersistCombination(resultGraph, persist)) {
+                    computer.program(new VertexProgramK()).result(resultGraph).persist(persist).submit().get();
+                } else {
+                    try {
+                        computer.program(new VertexProgramK()).result(resultGraph).persist(persist).submit().get();
+                        fail("The GraphComputer " + computer + " states that it does support the following resultGraph/persist pair: " + resultGraph + ":" + persist);
+                    } catch (final IllegalArgumentException e) {
+                        assertEquals(GraphComputer.Exceptions.resultGraphPersistCombinationNotSupported(resultGraph, persist).getMessage(), e.getMessage());
+                    }
+                }
+            }
+        }
+    }
+
+    @Test
     @LoadGraphWith(MODERN)
-    public void shouldWriteNewGraphResultWithEdges() throws Exception {
+    public void shouldWriteNewGraphResultWithNothing() throws Exception {
         final GraphComputer computer = graph.compute(graphComputerClass.get());
-        if (computer.features().supportsResultGraphPersistCombination(GraphComputer.ResultGraph.NEW, GraphComputer.Persist.EDGES)) {
-            final ComputerResult result = computer.program(new VertexProgramK()).submit().get();
-            assertEquals(Double.valueOf(28.0d), result.graph().traversal().V().values("money").sum().next());
-            assertEquals(Long.valueOf(6l), result.graph().traversal().E().count().next());
-            assertEquals(Long.valueOf(18l), result.graph().traversal().V().values().count().next());
+        if (computer.features().supportsResultGraphPersistCombination(GraphComputer.ResultGraph.NEW, GraphComputer.Persist.NOTHING)) {
+            final ComputerResult result = computer.program(new VertexProgramK()).result(GraphComputer.ResultGraph.NEW).persist(GraphComputer.Persist.NOTHING).submit().get();
+            assertEquals(Long.valueOf(0l), result.graph().traversal().V().count().next());
+            assertEquals(Long.valueOf(0l), result.graph().traversal().E().count().next());
+            assertEquals(Long.valueOf(0l), result.graph().traversal().V().values().count().next());
+            assertEquals(Long.valueOf(0l), result.graph().traversal().E().values().count().next());
+            assertEquals(Double.valueOf(0.0d), result.graph().traversal().V().values("money").sum().next());
+            ///
+            assertEquals(Long.valueOf(6l), graph.traversal().V().count().next());
+            assertEquals(Long.valueOf(6l), graph.traversal().E().count().next());
+            assertEquals(Long.valueOf(12l), graph.traversal().V().values().count().next());
+            assertEquals(Long.valueOf(6l), graph.traversal().E().values().count().next());
+            assertEquals(Double.valueOf(0.0d), graph.traversal().V().values("money").sum().next());
         }
     }
 
@@ -1204,9 +1232,57 @@ public class GraphComputerTest extends AbstractGremlinProcessTest {
         final GraphComputer computer = graph.compute(graphComputerClass.get());
         if (computer.features().supportsResultGraphPersistCombination(GraphComputer.ResultGraph.NEW, GraphComputer.Persist.VERTEX_PROPERTIES)) {
             final ComputerResult result = computer.program(new VertexProgramK()).result(GraphComputer.ResultGraph.NEW).persist(GraphComputer.Persist.VERTEX_PROPERTIES).submit().get();
-            assertEquals(Double.valueOf(28.0d), result.graph().traversal().V().values("money").sum().next());
+            assertEquals(Long.valueOf(6l), result.graph().traversal().V().count().next());
             assertEquals(Long.valueOf(0l), result.graph().traversal().E().count().next());
             assertEquals(Long.valueOf(18l), result.graph().traversal().V().values().count().next());
+            assertEquals(Long.valueOf(0l), result.graph().traversal().E().values().count().next());
+            assertEquals(Double.valueOf(28.0d), result.graph().traversal().V().values("money").sum().next());
+            ///
+            assertEquals(Long.valueOf(6l), graph.traversal().V().count().next());
+            assertEquals(Long.valueOf(6l), graph.traversal().E().count().next());
+            assertEquals(Long.valueOf(12l), graph.traversal().V().values().count().next());
+            assertEquals(Long.valueOf(6l), graph.traversal().E().values().count().next());
+            assertEquals(Double.valueOf(0.0d), graph.traversal().V().values("money").sum().next());
+        }
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void shouldWriteNewGraphResultWithEdges() throws Exception {
+        final GraphComputer computer = graph.compute(graphComputerClass.get());
+        if (computer.features().supportsResultGraphPersistCombination(GraphComputer.ResultGraph.NEW, GraphComputer.Persist.EDGES)) {
+            final ComputerResult result = computer.program(new VertexProgramK()).result(GraphComputer.ResultGraph.NEW).persist(GraphComputer.Persist.EDGES).submit().get();
+            assertEquals(Long.valueOf(6l), result.graph().traversal().V().count().next());
+            assertEquals(Long.valueOf(6l), result.graph().traversal().E().count().next());
+            assertEquals(Long.valueOf(18l), result.graph().traversal().V().values().count().next());
+            assertEquals(Long.valueOf(6l), result.graph().traversal().E().values().count().next());
+            assertEquals(Double.valueOf(28.0d), result.graph().traversal().V().values("money").sum().next());
+            ///
+            assertEquals(Long.valueOf(6l), graph.traversal().V().count().next());
+            assertEquals(Long.valueOf(6l), graph.traversal().E().count().next());
+            assertEquals(Long.valueOf(12l), graph.traversal().V().values().count().next());
+            assertEquals(Long.valueOf(6l), graph.traversal().E().values().count().next());
+            assertEquals(Double.valueOf(0.0d), graph.traversal().V().values("money").sum().next());
+        }
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void shouldWriteOriginalGraphResultWithNothing() throws Exception {
+        final GraphComputer computer = graph.compute(graphComputerClass.get());
+        if (computer.features().supportsResultGraphPersistCombination(GraphComputer.ResultGraph.ORIGINAL, GraphComputer.Persist.NOTHING)) {
+            final ComputerResult result = computer.program(new VertexProgramK()).result(GraphComputer.ResultGraph.ORIGINAL).persist(GraphComputer.Persist.NOTHING).submit().get();
+            assertEquals(Long.valueOf(6l), result.graph().traversal().V().count().next());
+            assertEquals(Long.valueOf(6l), result.graph().traversal().E().count().next());
+            assertEquals(Long.valueOf(12l), result.graph().traversal().V().values().count().next());
+            assertEquals(Long.valueOf(6l), result.graph().traversal().E().values().count().next());
+            assertEquals(Double.valueOf(0.0d), result.graph().traversal().V().values("money").sum().next());
+            ///
+            assertEquals(Long.valueOf(6l), graph.traversal().V().count().next());
+            assertEquals(Long.valueOf(6l), graph.traversal().E().count().next());
+            assertEquals(Long.valueOf(12l), graph.traversal().V().values().count().next());
+            assertEquals(Long.valueOf(6l), graph.traversal().E().values().count().next());
+            assertEquals(Double.valueOf(0.0d), graph.traversal().V().values("money").sum().next());
         }
     }
 
@@ -1216,14 +1292,37 @@ public class GraphComputerTest extends AbstractGremlinProcessTest {
         final GraphComputer computer = graph.compute(graphComputerClass.get());
         if (computer.features().supportsResultGraphPersistCombination(GraphComputer.ResultGraph.ORIGINAL, GraphComputer.Persist.VERTEX_PROPERTIES)) {
             final ComputerResult result = computer.program(new VertexProgramK()).result(GraphComputer.ResultGraph.ORIGINAL).persist(GraphComputer.Persist.VERTEX_PROPERTIES).submit().get();
-            assertEquals(Double.valueOf(28.0d), graph.traversal().V().values("money").sum().next());
+            assertEquals(Long.valueOf(6l), result.graph().traversal().V().count().next());
+            assertEquals(Long.valueOf(6l), result.graph().traversal().E().count().next());
+            assertEquals(Long.valueOf(18l), result.graph().traversal().V().values().count().next());
+            assertEquals(Long.valueOf(6l), result.graph().traversal().E().values().count().next());
+            assertEquals(Double.valueOf(28.0d), result.graph().traversal().V().values("money").sum().next());
+            ///
+            assertEquals(Long.valueOf(6l), graph.traversal().V().count().next());
             assertEquals(Long.valueOf(6l), graph.traversal().E().count().next());
             assertEquals(Long.valueOf(18l), graph.traversal().V().values().count().next());
-            ///
-            assertEquals(Double.valueOf(28.0d), result.graph().traversal().V().values("money").sum().next());
+            assertEquals(Long.valueOf(6l), graph.traversal().E().values().count().next());
+            assertEquals(Double.valueOf(28.0d), graph.traversal().V().values("money").sum().next());
+        }
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void shouldWriteOriginalGraphResultWithEdges() throws Exception {
+        final GraphComputer computer = graph.compute(graphComputerClass.get());
+        if (computer.features().supportsResultGraphPersistCombination(GraphComputer.ResultGraph.ORIGINAL, GraphComputer.Persist.EDGES)) {
+            final ComputerResult result = computer.program(new VertexProgramK()).result(GraphComputer.ResultGraph.ORIGINAL).persist(GraphComputer.Persist.EDGES).submit().get();
+            assertEquals(Long.valueOf(6l), result.graph().traversal().V().count().next());
             assertEquals(Long.valueOf(6l), result.graph().traversal().E().count().next());
-            result.graph().traversal().V().valueMap().forEachRemaining(System.out::println);
             assertEquals(Long.valueOf(18l), result.graph().traversal().V().values().count().next());
+            assertEquals(Long.valueOf(6l), result.graph().traversal().E().values().count().next());
+            assertEquals(Double.valueOf(28.0d), result.graph().traversal().V().values("money").sum().next());
+            ///
+            assertEquals(Long.valueOf(6l), graph.traversal().V().count().next());
+            assertEquals(Long.valueOf(6l), graph.traversal().E().count().next());
+            assertEquals(Long.valueOf(18l), graph.traversal().V().values().count().next());
+            assertEquals(Long.valueOf(6l), graph.traversal().E().values().count().next());
+            assertEquals(Double.valueOf(28.0d), graph.traversal().V().values("money").sum().next());
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6faea903/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/AbstractHadoopGraphComputer.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/AbstractHadoopGraphComputer.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/AbstractHadoopGraphComputer.java
index 6cfc50e..7980fe6 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/AbstractHadoopGraphComputer.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/AbstractHadoopGraphComputer.java
@@ -50,8 +50,8 @@ public abstract class AbstractHadoopGraphComputer implements GraphComputer {
     protected final Set<MapReduce> mapReducers = new HashSet<>();
     protected VertexProgram<Object> vertexProgram;
 
-    protected Optional<ResultGraph> resultGraph = Optional.empty();
-    protected Optional<Persist> persist = Optional.empty();
+    protected ResultGraph resultGraph = null;
+    protected Persist persist = null;
 
     public AbstractHadoopGraphComputer(final HadoopGraph hadoopGraph) {
         this.hadoopGraph = hadoopGraph;
@@ -60,13 +60,13 @@ public abstract class AbstractHadoopGraphComputer implements GraphComputer {
 
     @Override
     public GraphComputer result(final ResultGraph resultGraph) {
-        this.resultGraph = Optional.of(resultGraph);
+        this.resultGraph = resultGraph;
         return this;
     }
 
     @Override
     public GraphComputer persist(final Persist persist) {
-        this.persist = Optional.of(persist);
+        this.persist = persist;
         return this;
     }
 
@@ -102,13 +102,11 @@ public abstract class AbstractHadoopGraphComputer implements GraphComputer {
             this.mapReducers.addAll(this.vertexProgram.getMapReducers());
         }
         // if the user didn't set desired persistence/resultgraph, then get from vertex program or else, no persistence
-        if (!this.persist.isPresent())
-            this.persist = Optional.of(null == this.vertexProgram ? Persist.NOTHING : this.vertexProgram.getPreferredPersist());
-        if (!this.resultGraph.isPresent())
-            this.resultGraph = Optional.of(null == this.vertexProgram ? ResultGraph.ORIGINAL : this.vertexProgram.getPreferredResultGraph());
+        this.persist = GraphComputerHelper.getPersistState(Optional.ofNullable(this.vertexProgram), Optional.ofNullable(this.persist));
+        this.resultGraph = GraphComputerHelper.getResultGraphState(Optional.ofNullable(this.vertexProgram), Optional.ofNullable(this.resultGraph));
         // determine persistence and result graph options
-        if (!this.features().supportsResultGraphPersistCombination(this.resultGraph.get(), this.persist.get()))
-            throw GraphComputer.Exceptions.resultGraphPersistCombinationNotSupported(this.resultGraph.get(), this.persist.get());
+        if (!this.features().supportsResultGraphPersistCombination(this.resultGraph, this.persist))
+            throw GraphComputer.Exceptions.resultGraphPersistCombinationNotSupported(this.resultGraph, this.persist);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6faea903/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/GiraphGraphComputer.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/GiraphGraphComputer.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/GiraphGraphComputer.java
index e8f026f..6995331 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/GiraphGraphComputer.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/GiraphGraphComputer.java
@@ -107,13 +107,13 @@ public final class GiraphGraphComputer extends AbstractHadoopGraphComputer imple
             }
 
             this.memory.setRuntime(System.currentTimeMillis() - startTime);
-            return new DefaultComputerResult(HadoopHelper.getOutputGraph(this.hadoopGraph, this.resultGraph.get(), this.persist.get()), this.memory.asImmutable());
+            return new DefaultComputerResult(HadoopHelper.getOutputGraph(this.hadoopGraph, this.resultGraph, this.persist), this.memory.asImmutable());
         });
     }
 
     @Override
     public int run(final String[] args) {
-        this.giraphConfiguration.setBoolean(Constants.GREMLIN_HADOOP_GRAPH_OUTPUT_FORMAT_HAS_EDGES, this.persist.get().equals(Persist.EDGES));
+        this.giraphConfiguration.setBoolean(Constants.GREMLIN_HADOOP_GRAPH_OUTPUT_FORMAT_HAS_EDGES, this.persist.equals(Persist.EDGES));
         try {
             // it is possible to run graph computer without a vertex program (and thus, only map reduce jobs if they exist)
             if (null != this.vertexProgram) {
@@ -162,7 +162,7 @@ public final class GiraphGraphComputer extends AbstractHadoopGraphComputer imple
             }
 
             // if no persistence, delete the map reduce output
-            if (this.persist.get().equals(Persist.NOTHING)) {
+            if (this.persist.equals(Persist.NOTHING)) {
                 final Path outputPath = new Path(this.giraphConfiguration.get(Constants.GREMLIN_HADOOP_OUTPUT_LOCATION) + "/" + Constants.HIDDEN_G);
                 if (FileSystem.get(this.giraphConfiguration).exists(outputPath))      // TODO: what about when the output is not a file output?
                     FileSystem.get(this.giraphConfiguration).delete(outputPath, true);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6faea903/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkGraphComputer.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkGraphComputer.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkGraphComputer.java
index b6f6968..3c5c6ab 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkGraphComputer.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkGraphComputer.java
@@ -68,7 +68,7 @@ public final class SparkGraphComputer extends AbstractHadoopGraphComputer {
         super.validateStatePriorToExecution();
         // apache and hadoop configurations that are used throughout the graph computer computation
         final org.apache.commons.configuration.Configuration apacheConfiguration = new HadoopConfiguration(this.hadoopGraph.configuration());
-        apacheConfiguration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_OUTPUT_FORMAT_HAS_EDGES, this.persist.get().equals(Persist.EDGES));
+        apacheConfiguration.setProperty(Constants.GREMLIN_HADOOP_GRAPH_OUTPUT_FORMAT_HAS_EDGES, this.persist.equals(Persist.EDGES));
         final Configuration hadoopConfiguration = ConfUtil.makeHadoopConfiguration(apacheConfiguration);
         if (FileInputFormat.class.isAssignableFrom(hadoopConfiguration.getClass(Constants.GREMLIN_HADOOP_GRAPH_INPUT_FORMAT, InputFormat.class))) {
             try {
@@ -150,7 +150,7 @@ public final class SparkGraphComputer extends AbstractHadoopGraphComputer {
                         }
                     }
                     // write the graph rdd using the output rdd
-                    if (!this.persist.get().equals(Persist.NOTHING)) {
+                    if (!this.persist.equals(Persist.NOTHING)) {
                         try {
                             hadoopConfiguration.getClass(Constants.GREMLIN_HADOOP_OUTPUT_RDD, OutputFormatRDD.class, OutputRDD.class)
                                     .newInstance()
@@ -184,7 +184,7 @@ public final class SparkGraphComputer extends AbstractHadoopGraphComputer {
                 }
                 // update runtime and return the newly computed graph
                 finalMemory.setRuntime(System.currentTimeMillis() - startTime);
-                return new DefaultComputerResult(HadoopHelper.getOutputGraph(this.hadoopGraph, this.resultGraph.get(), this.persist.get()), finalMemory.asImmutable());
+                return new DefaultComputerResult(HadoopHelper.getOutputGraph(this.hadoopGraph, this.resultGraph, this.persist), finalMemory.asImmutable());
             }
         });
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6faea903/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphComputer.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphComputer.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphComputer.java
index f8693b0..622530f 100644
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphComputer.java
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphComputer.java
@@ -25,8 +25,10 @@ import org.apache.tinkerpop.gremlin.process.computer.VertexProgram;
 import org.apache.tinkerpop.gremlin.process.computer.util.ComputerGraph;
 import org.apache.tinkerpop.gremlin.process.computer.util.GraphComputerHelper;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerHelper;
 
@@ -45,8 +47,8 @@ import java.util.concurrent.Future;
  */
 public final class TinkerGraphComputer implements GraphComputer {
 
-    private Optional<ResultGraph> resultGraph = Optional.empty();
-    private Optional<Persist> persist = Optional.empty();
+    private ResultGraph resultGraph = null;
+    private Persist persist = null;
 
     private VertexProgram<?> vertexProgram;
     private final TinkerGraph graph;
@@ -66,13 +68,13 @@ public final class TinkerGraphComputer implements GraphComputer {
 
     @Override
     public GraphComputer result(final ResultGraph resultGraph) {
-        this.resultGraph = Optional.of(resultGraph);
+        this.resultGraph = resultGraph;
         return this;
     }
 
     @Override
     public GraphComputer persist(final Persist persist) {
-        this.persist = Optional.of(persist);
+        this.persist = persist;
         return this;
     }
 
@@ -90,11 +92,11 @@ public final class TinkerGraphComputer implements GraphComputer {
 
     @Override
     public Future<ComputerResult> submit() {
+        // a graph computer can only be executed once
         if (this.executed)
             throw Exceptions.computerHasAlreadyBeenSubmittedAVertexProgram();
         else
             this.executed = true;
-
         // it is not possible execute a computer if it has no vertex program nor mapreducers
         if (null == this.vertexProgram && this.mapReducers.isEmpty())
             throw GraphComputer.Exceptions.computerHasNoVertexProgramNorMapReducers();
@@ -103,14 +105,13 @@ public final class TinkerGraphComputer implements GraphComputer {
             GraphComputerHelper.validateProgramOnComputer(this, this.vertexProgram);
             this.mapReducers.addAll(this.vertexProgram.getMapReducers());
         }
+        // get the result graph and persist state to use for the computation
+        this.resultGraph = GraphComputerHelper.getResultGraphState(Optional.ofNullable(this.vertexProgram), Optional.ofNullable(this.resultGraph));
+        this.persist = GraphComputerHelper.getPersistState(Optional.ofNullable(this.vertexProgram), Optional.ofNullable(this.persist));
+        if (!this.features().supportsResultGraphPersistCombination(this.resultGraph, this.persist))
+            throw GraphComputer.Exceptions.resultGraphPersistCombinationNotSupported(this.resultGraph, this.persist);
 
-        if (!this.persist.isPresent())
-            this.persist = Optional.of(null == this.vertexProgram ? Persist.NOTHING : this.vertexProgram.getPreferredPersist());
-        if (!this.resultGraph.isPresent())
-            this.resultGraph = Optional.of(null == this.vertexProgram ? ResultGraph.ORIGINAL : this.vertexProgram.getPreferredResultGraph());
-        if (!this.features().supportsResultGraphPersistCombination(this.resultGraph.get(), this.persist.get()))
-            throw GraphComputer.Exceptions.resultGraphPersistCombinationNotSupported(this.resultGraph.get(), this.persist.get());
-
+        // initialize the memory
         this.memory = new TinkerMemory(this.vertexProgram, this.mapReducers);
         return CompletableFuture.<ComputerResult>supplyAsync(() -> {
             final long time = System.currentTimeMillis();
@@ -191,10 +192,34 @@ public final class TinkerGraphComputer implements GraphComputer {
                 // update runtime and return the newly computed graph
                 this.memory.setRuntime(System.currentTimeMillis() - time);
                 this.memory.complete();
-                if (Persist.NOTHING != this.persist.get() && ResultGraph.ORIGINAL == this.resultGraph.get()) {
-                    TinkerHelper.getGraphView(this.graph).addPropertiesToOriginalGraph();
+
+                // determine the resultant graph based on the result graph/persist state
+                final Graph resultGraph;
+                if (Persist.NOTHING == this.persist) {
+                    if (ResultGraph.ORIGINAL == this.resultGraph) {
+                        resultGraph = this.graph;
+                        TinkerHelper.dropGraphView(this.graph);
+                    } else {
+                        resultGraph = EmptyGraph.instance();
+                        TinkerHelper.dropGraphView(this.graph);
+                    }
+                } else if (Persist.VERTEX_PROPERTIES == this.persist) {
+                    if (ResultGraph.ORIGINAL == this.resultGraph) {
+                        TinkerHelper.getGraphView(this.graph).addPropertiesToOriginalGraph();
+                        resultGraph = this.graph;
+                    } else {
+                        TinkerHelper.getGraphView(this.graph).setHideEdges(true);
+                        resultGraph = this.graph;
+                    }
+                } else {  // Persist.EDGES
+                    if (ResultGraph.ORIGINAL == this.resultGraph) {
+                        TinkerHelper.getGraphView(this.graph).addPropertiesToOriginalGraph();
+                        resultGraph = this.graph;
+                    } else {
+                        resultGraph = this.graph;
+                    }
                 }
-                return new TinkerComputerResult(this.graph, this.memory.asImmutable());
+                return new TinkerComputerResult(resultGraph, this.memory.asImmutable());
 
             } catch (Exception ex) {
                 throw new RuntimeException(ex);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6faea903/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphView.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphView.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphView.java
index 607fde6..a32b589 100644
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphView.java
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphView.java
@@ -46,6 +46,7 @@ public final class TinkerGraphView {
     private final TinkerGraph graph;
     protected final Set<String> computeKeys;
     private Map<Element, Map<String, List<VertexProperty>>> computeProperties;
+    private boolean hideEdges = false;
 
     public TinkerGraphView(final TinkerGraph graph, final Set<String> computeKeys) {
         this.graph = graph;
@@ -136,4 +137,12 @@ public final class TinkerGraphView {
         });
         this.computeProperties.clear();
     }
+
+    public boolean getHideEdges() {
+        return this.hideEdges;
+    }
+
+    public void setHideEdges(final boolean hideEdges) {
+        this.hideEdges = hideEdges;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6faea903/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerVertex.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerVertex.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerVertex.java
index 525a793..2c59500 100644
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerVertex.java
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerVertex.java
@@ -84,7 +84,7 @@ public final class TinkerVertex extends TinkerElement implements Vertex {
 
     @Override
     public <V> VertexProperty<V> property(final String key, final V value, final Object... keyValues) {
-        return this.property(VertexProperty.Cardinality.single,key,value,keyValues);
+        return this.property(VertexProperty.Cardinality.single, key, value, keyValues);
     }
 
     @Override
@@ -151,12 +151,12 @@ public final class TinkerVertex extends TinkerElement implements Vertex {
 
     @Override
     public Iterator<Edge> edges(final Direction direction, final String... edgeLabels) {
-        return (Iterator) TinkerHelper.getEdges(this, direction, edgeLabels);
+        return TinkerHelper.inComputerMode(this.graph) && TinkerHelper.getGraphView(this.graph).getHideEdges() ? Collections.emptyIterator() : (Iterator) TinkerHelper.getEdges(this, direction, edgeLabels);
     }
 
     @Override
     public Iterator<Vertex> vertices(final Direction direction, final String... edgeLabels) {
-        return (Iterator) TinkerHelper.getVertices(this, direction, edgeLabels);
+        return TinkerHelper.inComputerMode(this.graph) && TinkerHelper.getGraphView(this.graph).getHideEdges() ? Collections.emptyIterator() : (Iterator) TinkerHelper.getVertices(this, direction, edgeLabels);
     }
 
     @Override