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/08/26 18:49:13 UTC

incubator-tinkerpop git commit: fixed a bug with meta-properties and property(). Added more test cases. Updated the docs with the new model. Some cool examples added.

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/mutating_traverser 0d0ba7b5c -> 7beb36981


fixed a bug with meta-properties and property(). Added more test cases. Updated the docs with the new model. Some cool examples added.


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

Branch: refs/heads/mutating_traverser
Commit: 7beb369811a979e61e967050e632e7f7da8648b5
Parents: 0d0ba7b
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed Aug 26 10:49:02 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Aug 26 10:49:02 2015 -0600

----------------------------------------------------------------------
 docs/src/the-traversal.asciidoc                 | 46 ++++++++++++++------
 .../traversal/dsl/graph/GraphTraversal.java     |  5 ---
 .../process/traversal/step/map/AddEdgeStep.java | 19 ++++----
 .../step/sideEffect/AddPropertyStep.java        | 30 ++++++-------
 .../tinkerpop/gremlin/structure/Graph.java      |  2 +-
 .../traversal/dsl/graph/GraphTraversalTest.java |  2 +-
 .../traversal/step/map/GroovyAddEdgeTest.groovy |  8 ++--
 .../step/map/GroovyAddVertexTest.groovy         |  5 +++
 .../process/traversal/step/map/AddEdgeTest.java | 33 ++++++++++++--
 .../traversal/step/map/AddVertexTest.java       | 29 ++++++++++++
 10 files changed, 127 insertions(+), 52 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/7beb3698/docs/src/the-traversal.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/the-traversal.asciidoc b/docs/src/the-traversal.asciidoc
index adf65d3..784a852 100644
--- a/docs/src/the-traversal.asciidoc
+++ b/docs/src/the-traversal.asciidoc
@@ -123,16 +123,27 @@ image::addedge-step.png[width=450]
 
 [gremlin-groovy,modern]
 ----
-g.V(1).as('a').out('created').in('created').where(neq('a')).addOutE('co-developer','a','year',2009) <1>
-g.withSideEffect('a',g.V(3,5).toList()).V(4).addInE('createdBy','a') <2>
-g.V().as('a').out('created').as('b').select('a','b').addOutE('b','createdBy','a','acl','public') <3>
-g.V(1).as('a').out('knows').addInE('livesNear','a','year',2009).inV().inE('livesNear').values('year') <4>
+g.V(1).as('a').out('created').in('created').where(neq('a')).
+  addE('co-developer').from('a').property('year',2009) <1>
+g.V(3,4,5).aggregate('x').has('name','josh').as('a').select('x').unfold().hasLabel('software').addE('createdBy').to('a') <2>
+g.V().as('a').out('created').addE('createdBy').to('a').property('acl','public') <3>
+g.V(1).as('a').out('knows').
+  addE('livesNear').from('a').property('year',2009).
+  inV().inE('livesNear').values('year') <4>
+g.V().match(
+        __.as('a').out('knows').as('b'),
+        __.as('a').out('created').as('c'),
+        __.as('b').out('created').as('c')).
+      addE('friendlyCollaborator').from('a').to('b').
+        property(id,13).property('project',select('c').values('name')) <5>
+g.E(13).valueMap()
 ----
 
 <1> Add a co-developer edge with a year-property between marko and his collaborators.
 <2> Add incoming createdBy edges from the josh-vertex to the lop- and ripple-vertices.
-<3> It is possible to pull the vertices from a select-projection.
+<3> Add an inverse createdBy edge for all created edges.
 <4> The newly created edge is a traversable object.
+<5> Two arbitrary bindings in a traversal can be joined `from()`->`to()`, where `id` can be provided for graphs that supports user provided ids.
 
 [[addvertex-step]]
 AddVertex Step
@@ -142,9 +153,9 @@ The `addV()`-step is used to add vertices to the graph (*map*/*sideEffect*). For
 
 [gremlin-groovy,modern]
 ----
-g.addV(label,'person','name','stephen')
+g.addV('person').property('name','stephen')
 g.V().values('name')
-g.V().outE('knows').addV('name','nothing')
+g.V().outE('knows').addV().property('name','nothing')
 g.V().has('name','nothing')
 g.V().has('name','nothing').bothE()
 ----
@@ -153,16 +164,23 @@ g.V().has('name','nothing').bothE()
 AddProperty Step
 ~~~~~~~~~~~~~~~~
 
-The `property()`-step is used to add properties to the elements of the graph (*sideEffect*). Unlike `addV()` and `addE()`, `property()` is a full sideEffect step in that it does not return the property it created, but the element that streamed into it.
+The `property()`-step is used to add properties to the elements of the graph (*sideEffect*). Unlike `addV()` and `addE()`, `property()` is a full sideEffect step in that it does not return the property it created, but the element that streamed into it. Moreover, if `property()` follows an `addV()` or `addE()`, then it is "folded" into the previous step to enable vertex and edge creation with all its properties in one creation operation.
 
 [gremlin-groovy,modern]
 ----
 g.V(1).property('country','usa')
 g.V(1).property('city','santa fe').property('state','new mexico').valueMap()
-g.V(1).property(list,'age',35)
+g.V(1).property(list,'age',35)  <1>
 g.V(1).valueMap()
+g.V(1).property('friendWeight',outE('knows').values('weight').sum(),'acl','private') <2>
+g.V(1).properties('friendWeight').valueMap() <3>
 ----
 
+<1> For vertices, a cardinality can be provided for <<vertex properties,vertex-properties>>.
+<2> It is possible to select the property value (as well as key) via a traversal.
+<3> For vertices, the `property()`-step can add meta-properties.
+
+
 [[aggregate-step]]
 Aggregate Step
 ~~~~~~~~~~~~~~
@@ -804,7 +822,7 @@ g.V().match(
         __.as('a').out('created').has('name','lop').as('b'), <1>
         __.as('b').in('created').has('age', 29).as('c'),
         __.as('c').repeat(out()).times(2)). <2>
-          select('c').out('knows').dedup().values('name') <3>
+      select('c').out('knows').dedup().values('name') <3>
 ----
 
 <1> *Patterns of arbitrary complexity*: `match()` is not restricted to triple patterns or property paths.
@@ -819,10 +837,10 @@ g.V().match(
         __.as('a').out('knows').as('b'),
         __.as('b').out('created').has('name','lop')).
       select('b').out('created').
-          match(
-            __.as('x').in('created').as('y'),
-            __.as('y').out('knows').as('z')).
-          select('z').values('name')
+        match(
+          __.as('x').in('created').as('y'),
+          __.as('y').out('knows').as('z')).
+      select('z').values('name')
 ----
 
 IMPORTANT: The `match()`-step is stateless. The variable bindings of the traversal patterns are stored in the path history of the traverser. As such, the variables used over all `match()`-steps within a traversal are globally unique. A benefit of this is that subsequent `where()`, `select()`, `match()`, etc. steps can leverage the same variables in their analysis.

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/7beb3698/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
index 2fad998..f4a0374 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
@@ -677,11 +677,6 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
         return this;
     }
 
-    public default GraphTraversal<S, E> id(final Object elementId) {
-        ((Mutating) this.asAdmin().getEndStep()).addPropertyMutations(T.id, elementId);
-        return this;
-    }
-
     /**
      * @deprecated As of release 3.1.0, replaced by {@link #addE(String)}
      */

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/7beb3698/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java
index 6a83a59..91f3c05 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java
@@ -34,7 +34,9 @@ import org.apache.tinkerpop.gremlin.structure.T;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
+import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
 
@@ -83,14 +85,15 @@ public final class AddEdgeStep<S> extends MapStep<S, Edge> implements Mutating<E
 
     @Override
     protected Edge map(final Traverser.Admin<S> traverser) {
-        final Edge edge =
-                this.parameters.get(traverser, FROM, () -> (Vertex) traverser.get()).
-                        addEdge(this.parameters.get(traverser, T.label, () -> Edge.DEFAULT_LABEL),
-                                this.parameters.get(traverser, TO, () -> (Vertex) traverser.get()), this.parameters.getKeyValues(traverser, TO, FROM, T.label));
-        if (callbackRegistry != null) {
-            final Event.EdgeAddedEvent vae = new Event.EdgeAddedEvent(DetachedFactory.detach(edge, true));
-            callbackRegistry.getCallbacks().forEach(c -> c.accept(vae));
-        }
+        final Vertex toVertex = this.parameters.get(traverser, TO, () -> (Vertex) traverser.get());
+        final Vertex fromVertex = this.parameters.get(traverser, FROM, () -> (Vertex) traverser.get());
+        final String edgeLabel = this.parameters.get(traverser, T.label, () -> Edge.DEFAULT_LABEL);
+
+        final Edge edge = fromVertex.addEdge(edgeLabel, toVertex, this.parameters.getKeyValues(traverser, TO, FROM, T.label));
+            if (callbackRegistry != null) {
+                final Event.EdgeAddedEvent vae = new Event.EdgeAddedEvent(DetachedFactory.detach(edge, true));
+                callbackRegistry.getCallbacks().forEach(c -> c.accept(vae));
+            }
         return edge;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/7beb3698/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
index ccae521..3405ce9 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
@@ -83,31 +83,31 @@ public final class AddPropertyStep<S extends Element> extends SideEffectStep<S>
         });
         final Object[] vertexPropertyKeyValues = this.parameters.getKeyValues(traverser, T.key, T.value);
 
+        final Element element = traverser.get();
+        final boolean runtimeAsVertex = element instanceof Vertex;
+
         if (this.callbackRegistry != null) {
-            final Element currentElement = traverser.get();
             final Property currentProperty = traverser.get().property(key);
-
-            // todo: have to do a runtime check until TINKERPOP3-783 is done - asVertex is not reliable
-            final boolean runtimeAsVertex = currentElement instanceof Vertex;
             final boolean newProperty = runtimeAsVertex ? currentProperty == VertexProperty.empty() : currentProperty == Property.empty();
-
-            Event.ElementPropertyChangedEvent evt;
-            if (currentElement instanceof Vertex)
-                evt = new Event.VertexPropertyChangedEvent(DetachedFactory.detach((Vertex) currentElement, true), newProperty ? null : DetachedFactory.detach((VertexProperty) currentProperty, true), value, vertexPropertyKeyValues);
-            else if (currentElement instanceof Edge)
-                evt = new Event.EdgePropertyChangedEvent(DetachedFactory.detach((Edge) currentElement, true), newProperty ? null : DetachedFactory.detach(currentProperty), value);
-            else if (currentElement instanceof VertexProperty)
-                evt = new Event.VertexPropertyPropertyChangedEvent(DetachedFactory.detach((VertexProperty) currentElement, true), newProperty ? null : DetachedFactory.detach(currentProperty), value);
+            final Event.ElementPropertyChangedEvent evt;
+            if (element instanceof Vertex)
+                evt = new Event.VertexPropertyChangedEvent(DetachedFactory.detach((Vertex) element, true), newProperty ? null : DetachedFactory.detach((VertexProperty) currentProperty, true), value, vertexPropertyKeyValues);
+            else if (element instanceof Edge)
+                evt = new Event.EdgePropertyChangedEvent(DetachedFactory.detach((Edge) element, true), newProperty ? null : DetachedFactory.detach(currentProperty), value);
+            else if (element instanceof VertexProperty)
+                evt = new Event.VertexPropertyPropertyChangedEvent(DetachedFactory.detach((VertexProperty) element, true), newProperty ? null : DetachedFactory.detach(currentProperty), value);
             else
-                throw new IllegalStateException(String.format("The incoming object cannot be processed by change eventing in %s:  %s", AddPropertyStep.class.getName(), currentElement));
+                throw new IllegalStateException(String.format("The incoming object cannot be processed by change eventing in %s:  %s", AddPropertyStep.class.getName(), element));
 
             this.callbackRegistry.getCallbacks().forEach(c -> c.accept(evt));
         }
 
         if (null != this.cardinality)
-            ((Vertex) traverser.get()).property(this.cardinality, key, value, vertexPropertyKeyValues);
+            ((Vertex) element).property(this.cardinality, key, value, vertexPropertyKeyValues);
+        else if(runtimeAsVertex)
+            ((Vertex)element).property(key,value,vertexPropertyKeyValues);
         else
-            traverser.get().property(key, value);
+            element.property(key, value);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/7beb3698/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Graph.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Graph.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Graph.java
index 432197d..a9b3dc2 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Graph.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Graph.java
@@ -175,7 +175,7 @@ public interface Graph extends AutoCloseable, Host {
      * <ul>
      *     <li>g.vertices(v.id())</li>
      * </ul>
-     * <p/>
+     * <p/>                                                                                                         
      * If the graph return {@code true} for {@link Features.VertexFeatures#supportsStringIds()} ()} then it should support
      * filters as with:
      * <ul>

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/7beb3698/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalTest.java
index 174a97e..e0e224f 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalTest.java
@@ -34,7 +34,7 @@ import java.util.Set;
  */
 public class GraphTraversalTest {
 
-    private static Set<String> NO_GRAPH = new HashSet<>(Arrays.asList("asAdmin", "by", "option", "iterate", "to", "from", "id"));
+    private static Set<String> NO_GRAPH = new HashSet<>(Arrays.asList("asAdmin", "by", "option", "iterate", "to", "from"));
     private static Set<String> NO_ANONYMOUS = new HashSet<>(Arrays.asList("start", "__"));
 
     @Test

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/7beb3698/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddEdgeTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddEdgeTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddEdgeTest.groovy
index 91b61fb..15c5286 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddEdgeTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddEdgeTest.groovy
@@ -41,10 +41,10 @@ public abstract class GroovyAddEdgeTest {
             TraversalScriptHelper.compute("g.V(${v1Id}).as('a').out('created').addE('createdBy').to('a').property('weight', 2)", g, "v1Id", v1Id)
         }
 
-        /*@Override
-        public Traversal<Vertex, Edge> get_g_withSideEffectXx__g_V_toListX_addOutEXexistsWith_x_time_nowX() {
-            return g.withSideEffect("x", g.V().toList()).V().addE("existsWith").to(__.select("x")).property("time", "now");
-        }*/
+        @Override
+        public Traversal<Vertex, Edge> get_g_V_aggregateXxX_asXaX_selectXxX_unfold_addEXexistsWithX_toXaX_propertyXtime_nowX() {
+            TraversalScriptHelper.compute("g.V.aggregate('x').as('a').select('x').unfold.addE('existsWith').to('a').property('time', 'now')", g)
+        }
 
         @Override
         public Traversal<Vertex, Edge> get_g_V_asXaX_outXcreatedX_inXcreatedX_whereXneqXaXX_asXbX_addEXcodeveloperX_fromXaX_toXbX_propertyXyear_2009X() {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/7beb3698/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddVertexTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddVertexTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddVertexTest.groovy
index cffaaff..7ec2866 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddVertexTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddVertexTest.groovy
@@ -46,6 +46,11 @@ public abstract class GroovyAddVertexTest {
             TraversalScriptHelper.compute("g.addV(label, 'person', 'name', 'stephen')", g)
         }
 
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_hasXname_markoX_propertyXfriendWeight_outEXknowsX_weight_sum__acl_privateX() {
+            TraversalScriptHelper.compute("g.V.has('name', 'marko').property('friendWeight', outE('knows').weight.sum(), 'acl', 'private')", g)
+        }
+
         ///////// DEPRECATED BELOW
 
         @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/7beb3698/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeTest.java
index 15eab91..37e59fd 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeTest.java
@@ -48,6 +48,8 @@ public abstract class AddEdgeTest extends AbstractGremlinProcessTest {
 
     public abstract Traversal<Vertex, Edge> get_g_VX1X_asXaX_outXcreatedX_addEXcreatedByX_toXaX_propertyXweight_2X(final Object v1Id);
 
+    public abstract Traversal<Vertex, Edge> get_g_V_aggregateXxX_asXaX_selectXxX_unfold_addEXexistsWithX_toXaX_propertyXtime_nowX();
+
     public abstract Traversal<Vertex, Edge> get_g_V_asXaX_outXcreatedX_inXcreatedX_whereXneqXaXX_asXbX_addEXcodeveloperX_fromXaX_toXbX_propertyXyear_2009X();
 
     public abstract Traversal<Vertex, Edge> get_g_V_asXaX_inXcreatedX_addEXcreatedByX_fromXaX_propertyXyear_2009X_propertyXacl_publicX();
@@ -177,6 +179,29 @@ public abstract class AddEdgeTest extends AbstractGremlinProcessTest {
 
     @Test
     @LoadGraphWith(MODERN)
+    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES)
+    public void g_V_aggregateXxX_asXaX_selectXxX_unfold_addEXexistsWithX_toXaX_propertyXtime_nowX() {
+        final Traversal<Vertex, Edge> traversal = get_g_V_aggregateXxX_asXaX_selectXxX_unfold_addEXexistsWithX_toXaX_propertyXtime_nowX();
+        printTraversalForm(traversal);
+        int count = 0;
+        while (traversal.hasNext()) {
+            final Edge edge = traversal.next();
+            assertEquals("existsWith", edge.label());
+            assertEquals("now", edge.value("time"));
+            assertEquals(1, IteratorUtils.count(edge.properties()));
+            count++;
+        }
+        assertEquals(36, count);
+        assertEquals(42, IteratorUtils.count(graph.edges()));
+        for (final Vertex vertex : IteratorUtils.list(graph.vertices())) {
+            assertEquals(6, IteratorUtils.count(vertex.edges(Direction.OUT, "existsWith")));
+            assertEquals(6, IteratorUtils.count(vertex.edges(Direction.IN, "existsWith")));
+        }
+        assertEquals(6, IteratorUtils.count(graph.vertices()));
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
     @Deprecated
     @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES)
     public void g_V_asXaX_outXcreatedX_inXcreatedX_whereXneqXaXX_asXbX_selectXa_bX_addInEXa_codeveloper_b_year_2009X() {
@@ -289,10 +314,10 @@ public abstract class AddEdgeTest extends AbstractGremlinProcessTest {
             return g.V(v1Id).as("a").out("created").addE("createdBy").to("a").property("weight", 2);
         }
 
-        /*@Override
-        public Traversal<Vertex, Edge> get_g_withSideEffectXx__g_V_toListX_addOutEXexistsWith_x_time_nowX() {
-            return g.withSideEffect("x", g.V().toList()).V().addE("existsWith").to(__.select("x")).property("time", "now");
-        }*/
+        @Override
+        public Traversal<Vertex, Edge> get_g_V_aggregateXxX_asXaX_selectXxX_unfold_addEXexistsWithX_toXaX_propertyXtime_nowX() {
+            return g.V().aggregate("x").as("a").select("x").unfold().addE("existsWith").to("a").property("time", "now");
+        }
 
         @Override
         public Traversal<Vertex, Edge> get_g_V_asXaX_outXcreatedX_inXcreatedX_whereXneqXaXX_asXbX_addEXcodeveloperX_fromXaX_toXbX_propertyXyear_2009X() {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/7beb3698/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexTest.java
index fad1519..4019995 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexTest.java
@@ -47,6 +47,8 @@ public abstract class AddVertexTest extends AbstractGremlinTest {
 
     public abstract Traversal<Vertex, Vertex> get_g_addVXpersonX_propertyXname_stephenX();
 
+    public abstract Traversal<Vertex, Vertex> get_g_V_hasXname_markoX_propertyXfriendWeight_outEXknowsX_weight_sum__acl_privateX();
+
     // 3.0.0 DEPRECATIONS
     @Deprecated
     public abstract Traversal<Vertex, Vertex> get_g_V_addVXlabel_animal_age_0X();
@@ -57,6 +59,7 @@ public abstract class AddVertexTest extends AbstractGremlinTest {
     @Test
     @LoadGraphWith(MODERN)
     @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
+    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_PROPERTY)
     public void g_V_addVXanimalX_propertyXage_selectXaX_byXageXX_propertyXname_puppyX() {
         final Traversal<Vertex, Vertex> traversal = get_g_VX1X_addVXanimalX_propertyXage_selectXaX_byXageXX_propertyXname_puppyX(convertToVertexId(graph, "marko"));
         printTraversalForm(traversal);
@@ -72,6 +75,7 @@ public abstract class AddVertexTest extends AbstractGremlinTest {
     @Test
     @LoadGraphWith(MODERN)
     @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
+    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_PROPERTY)
     public void g_V_addVXanimalX_propertyXage_0X() {
         final Traversal<Vertex, Vertex> traversal = get_g_V_addVXanimalX_propertyXage_0X();
         printTraversalForm(traversal);
@@ -90,6 +94,7 @@ public abstract class AddVertexTest extends AbstractGremlinTest {
     @Test
     @LoadGraphWith(MODERN)
     @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
+    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_PROPERTY)
     public void g_addVXpersonX_propertyXname_stephenX() {
         final Traversal<Vertex, Vertex> traversal = get_g_addVXpersonX_propertyXname_stephenX();
         printTraversalForm(traversal);
@@ -101,11 +106,29 @@ public abstract class AddVertexTest extends AbstractGremlinTest {
         assertEquals(7, IteratorUtils.count(graph.vertices()));
     }
 
+    @Test
+    @LoadGraphWith(MODERN)
+    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
+    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_PROPERTY)
+    public void g_V_hasXname_markoX_addVXmetaPersonX_propertyXname_nameX_propertyXfriendWeight_outEXknowsX_weight_sum__acl_privateX() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_hasXname_markoX_propertyXfriendWeight_outEXknowsX_weight_sum__acl_privateX();
+        printTraversalForm(traversal);
+        final Vertex marko = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals("person", marko.label());
+        assertEquals("marko", marko.value("name"));
+        assertEquals(1.5, marko.value("friendWeight"), 0.01);
+        assertEquals("private", marko.property("friendWeight").value("acl"));
+        assertEquals(3, IteratorUtils.count(marko.properties()));
+        assertEquals(1, IteratorUtils.count(marko.property("friendWeight").properties()));
+    }
+
     /////
 
     @Test
     @LoadGraphWith(MODERN)
     @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
+    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_PROPERTY)
     public void g_V_addVXlabel_animal_age_0X() {
         final Traversal<Vertex, Vertex> traversal = get_g_V_addVXlabel_animal_age_0X();
         printTraversalForm(traversal);
@@ -124,6 +147,7 @@ public abstract class AddVertexTest extends AbstractGremlinTest {
     @Test
     @LoadGraphWith(MODERN)
     @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
+    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_PROPERTY)
     public void g_addVXlabel_person_name_stephenX() {
         final Traversal<Vertex, Vertex> traversal = get_g_addVXlabel_person_name_stephenX();
         printTraversalForm(traversal);
@@ -154,6 +178,11 @@ public abstract class AddVertexTest extends AbstractGremlinTest {
         }
 
         @Override
+        public Traversal<Vertex, Vertex> get_g_V_hasXname_markoX_propertyXfriendWeight_outEXknowsX_weight_sum__acl_privateX() {
+            return g.V().has("name", "marko").property("friendWeight", __.outE("knows").values("weight").sum(), "acl", "private");
+        }
+
+        @Override
         public Traversal<Vertex, Vertex> get_g_V_addVXlabel_animal_age_0X() {
             return g.V().addV(T.label, "animal", "age", 0);
         }