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

incubator-tinkerpop git commit: spruced up the-graph section of the documentation. AddPropertyStep now also takes cardinality and multiple key-value pairs for dealing with VertexProperties -- GraphTraversal updated to reflect this.

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/master f520e6dbe -> 7b922831c


spruced up the-graph section of the documentation. AddPropertyStep now also takes cardinality and multiple key-value pairs for dealing with VertexProperties -- GraphTraversal updated to reflect this.


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

Branch: refs/heads/master
Commit: 7b922831c4032530251f91f47f8264e1efe202f9
Parents: f520e6d
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Fri Mar 20 09:57:37 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Fri Mar 20 09:57:37 2015 -0600

----------------------------------------------------------------------
 docs/src/intro.asciidoc                         |  4 +-
 docs/src/the-graph.asciidoc                     | 89 +++++++-------------
 .../traversal/dsl/graph/GraphTraversal.java     | 31 ++++---
 .../gremlin/process/traversal/dsl/graph/__.java |  9 +-
 .../step/sideEffect/AddPropertyStep.java        | 19 ++++-
 5 files changed, 76 insertions(+), 76 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/7b922831/docs/src/intro.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/intro.asciidoc b/docs/src/intro.asciidoc
index cf8422c..2d72499 100644
--- a/docs/src/intro.asciidoc
+++ b/docs/src/intro.asciidoc
@@ -50,8 +50,8 @@ TinkerPop3 is the third incarnation of the TinkerPop graph computing framework.
  ** `Traversal<S,E>`: a functional data flow process transforming objects of type `S` into object of type `E`.
  *** `GraphTraversal`: a traversal DSL that is oriented towards the semantics of the raw graph (i.e. vertices, edges, etc.).
  * `GraphComputer`: a system that processes the graph in parallel and potentially, distributed over a multi-machine cluster.
- ** `VertexProgram`: a piece of code executed at all vertices in a logically parallel fashion with intercommunication between code via message passing.
- ** `MapReduce`: a process that analyzes all vertices in the graph in parallel and reduces the isolated analyses into a single reduced result.
+ ** `VertexProgram`: code executed at all vertices in a logically parallel manner with intercommunication via message passing.
+ ** `MapReduce`: a computations that analyzes all vertices in the graph in parallel and yields a single reduced result.
 
 IMPORTANT: TinkerPop3 is licensed under the popular link:http://www.apache.org/licenses/LICENSE-2.0.html[Apache2] free software license. However, note that the underlying graph engine used with TinkerPop3 may have a difference license. Thus, be sure to respect the license caveats of the vendor product.
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/7b922831/docs/src/the-graph.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/the-graph.asciidoc b/docs/src/the-graph.asciidoc
index b5cb150..775903e 100644
--- a/docs/src/the-graph.asciidoc
+++ b/docs/src/the-graph.asciidoc
@@ -77,66 +77,41 @@ A collection of use cases are itemized below:
 
 A running example using vertex properties is provided below to demonstrate and explain the API.
 
-[source,groovy]
-gremlin> graph = TinkerGraph.open()
-==>tinkergraph[vertices:0 edges:0]
-gremlin> g = graph.traversal(standard)
-==>graphtraversalcontext[tinkergraph[vertices:0 edges:0], standard]
-gremlin> vertex = graph.addVertex('name','marko','name','marko a. rodriguez')
-==>v[0]
-gremlin> g.V(vertex).properties().count()
-==>2
-gremlin> g.V(vertex).properties('name').count() <1>
-==>2
-gremlin> vertex.property('name') <2>
-Multiple properties exist for the provided key, use Vertex.properties(name)
-Display stack trace? [yN]
-gremlin> vertex.properties()
-==>vp[name->marko]
-==>vp[name->marko a. rodriguez]
-gremlin> vertex.properties('name')
-==>vp[name->marko]
-==>vp[name->marko a. rodriguez]
-gremlin> vertexProperty = g.V(vertex).properties('name').hasValue('marko').next()
-==>vp[name->marko]
-gremlin> vertexProperty.property('acl','private') <3>
-==>p[acl->private]
-gremlin> vertexProperty = g.V(vertex).properties('name').hasValue('marko a. rodriguez').next()
-==>vp[name->marko a. rodriguez]
-gremlin> vertexProperty.property('acl','public')
-==>p[acl->public]
-gremlin> g.V(vertex).properties('name').has('acl','public').value()
-==>marko a. rodriguez
-gremlin> g.V(vertex).properties('name').has('acl','public').remove() <4>
-==>null
-gremlin> g.V(vertex).properties('name').has('acl','public').value()
-gremlin> g.V(vertex).properties('name').has('acl','private').value()
-==>marko
-gremlin> vertexProperty = vertex.properties().next()
-==>vp[name->marko]
-gremlin> vertexProperty.properties()
-==>p[acl->private]
-gremlin> vertexProperty.property('date',2014) <5>
-==>p[date->2014]
-gremlin> vertexProperty.property('creator','stephen')
-==>p[creator->stephen]
-gremlin> vertexProperty.properties()
-==>p[date->2014]
-==>p[creator->stephen]
-==>p[acl->private]
-gremlin> g.V(vertex).properties('name').valueMap()
-==>[date:2014, creator:stephen, acl:private]
-gremlin> vertex.property(single, 'name','okram') <6>
-==>vp[name->okram]
-gremlin> vertex.property('name')
-==>vp[name->okram]
+[gremlin-groovy]
+----
+graph = TinkerGraph.open()
+g = graph.traversal(standard)
+v = g.addV('name','marko','name','marko a. rodriguez').next()
+g.V(v).properties().count()
+g.V(v).properties('name').count() <1>
+g.V(v).properties()
+g.V(v).properties('name')
+g.V(v).properties('name').hasValue('marko')
+g.V(v).properties('name').hasValue('marko').property('acl','private') <2>
+g.V(v).properties('name').hasValue('marko a. rodriguez')
+g.V(v).properties('name').hasValue('marko a. rodriguez').property('acl','public')
+g.V(v).properties('name').has('acl','public').value()
+g.V(v).properties('name').has('acl','public').remove() <3>
+g.V(v).properties('name').has('acl','public').value()
+g.V(v).properties('name').has('acl','private').value()
+g.V(v).properties()
+g.V(v).properties().properties() <4>
+g.V(v).properties().property('date',2014) <5>
+g.V(v).properties().property('creator','stephen')
+g.V(v).properties().properties()
+g.V(v).properties('name').valueMap()
+g.V(v).property(single, 'name','okram') <6>
+g.V(v).properties('name')
+g.V(v).values('name') <7>
+----
 
 <1> A vertex can have zero or more properties with the same key associated with it.
-<2> If a vertex has multiple vertex properties for the same key, then `Vertex.property()` is not allowed.
-<3> A vertex property can have standard key/value properties attached to it.
-<4> Vertex property removal is identical to property removal.
+<2> A vertex property can have standard key/value properties attached to it.
+<3> Vertex property removal is identical to property removal.
+<4> It is property to get the properties of a vertex property.
 <5> A vertex property can have any number of key/value properties attached to it.
-<6> `Vertex.property(single, ...)` is a helper method that will remove all existing key'd properties before adding the new single property.
+<6> `property(single, ...)` will remove all existing key'd properties before adding the new single property (see `VertexProperty.Cardinality`).
+<7> If only the value of a property is needed, then `values()` can be used.
 
 If the concept of vertex properties is difficult to grasp, then it may be best to think of vertex properties in terms of "literal vertices." A vertex can have an edge to a "literal vertex" that has a single value key/value -- e.g. "value=okram." The edge that points to that literal vertex has an edge-label of "name." The properties on the edge represent the literal vertex's properties. The "literal vertex" can not have any other edges to it (only one from the associated vertex).
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/7b922831/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 50e1fd8..64bdf26 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
@@ -24,9 +24,17 @@ import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.T;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.ElementValueTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.FilterTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.FilterTraverserTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.lambda.LoopTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.MapTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.MapTraverserTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.TrueTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.step.ComparatorHolder;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.branch.BranchStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.branch.ChooseStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.branch.LocalStep;
@@ -105,20 +113,12 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StoreStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SubgraphStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.TreeSideEffectStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.CollectingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.PathIdentityStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.ElementValueTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.FilterTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.FilterTraverserTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.MapTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.MapTraverserTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.TrueTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ElementFunctionComparator;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ElementValueComparator;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.PathIdentityStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.TraversalComparator;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
 import org.apache.tinkerpop.gremlin.structure.Compare;
 import org.apache.tinkerpop.gremlin.structure.Contains;
@@ -129,6 +129,7 @@ import org.apache.tinkerpop.gremlin.structure.Order;
 import org.apache.tinkerpop.gremlin.structure.Property;
 import org.apache.tinkerpop.gremlin.structure.PropertyType;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.VertexProperty;
 import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
 
 import java.util.Arrays;
@@ -413,8 +414,12 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
         return this.addE(Direction.OUT, edgeLabel, otherVertices, propertyKeyValues);
     }
 
-    public default GraphTraversal<S, E> property(final String key, final Object value) {
-        return this.asAdmin().addStep(new AddPropertyStep(this.asAdmin(), key, value));
+    public default GraphTraversal<S, E> property(final String key, final Object value, final Object... keyValues) {
+        return this.asAdmin().addStep(new AddPropertyStep(this.asAdmin(), key, value, keyValues));
+    }
+
+    public default GraphTraversal<S, E> property(final VertexProperty.Cardinality cardinality, final String key, final Object value, final Object... keyValues) {
+        return this.asAdmin().addStep(new AddPropertyStep(this.asAdmin(), cardinality, key, value, keyValues));
     }
 
     ///////////////////// FILTER STEPS /////////////////////

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/7b922831/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
index 7946e5c..67ade05 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
@@ -28,6 +28,7 @@ import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Property;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.VertexProperty;
 import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
 
 import java.util.Collection;
@@ -276,8 +277,12 @@ public class __ {
         return __.<A>start().addOutE(edgeLabel, stepLabel, propertyKeyValues);
     }
 
-    public static <A> GraphTraversal<A, A> property(final String key, final Object value) {
-        return __.<A>start().property(key, value);
+    public static <A> GraphTraversal<A, A> property(final String key, final Object value, final Object... keyValues) {
+        return __.<A>start().property(key, value, keyValues);
+    }
+
+    public static <A> GraphTraversal<A, A> property(final VertexProperty.Cardinality cardinality, final String key, final Object value, final Object... keyValues) {
+        return __.<A>start().property(cardinality, key, value, keyValues);
     }
 
     ///////////////////// FILTER STEPS /////////////////////

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/7b922831/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 f79ed92..7d25dc2 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
@@ -22,6 +22,8 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.VertexProperty;
 
 import java.util.EnumSet;
 import java.util.Set;
@@ -33,18 +35,31 @@ public final class AddPropertyStep<S extends Element> extends SideEffectStep<S>
 
     private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.OBJECT);
 
+    private final VertexProperty.Cardinality cardinality;
     private final String key;
     private final Object value;
+    private final Object[] vertexPropertyKeyValues;
+    private final boolean asVertex;
 
-    public AddPropertyStep(final Traversal.Admin traversal, final String key, final Object value) {
+    public AddPropertyStep(final Traversal.Admin traversal, final VertexProperty.Cardinality cardinality, final String key, final Object value, final Object... vertexPropertyKeyValues) {
         super(traversal);
         this.key = key;
         this.value = value;
+        this.vertexPropertyKeyValues = vertexPropertyKeyValues;
+        this.asVertex = null != cardinality || this.vertexPropertyKeyValues.length > 0;
+        this.cardinality = null == cardinality ? VertexProperty.Cardinality.list : cardinality;
+    }
+
+    public AddPropertyStep(final Traversal.Admin traversal, final String key, final Object value, final Object... vertexPropertyKeyValues) {
+        this(traversal, null, key, value, vertexPropertyKeyValues);
     }
 
     @Override
     protected void sideEffect(final Traverser.Admin<S> traverser) {
-        traverser.get().property(this.key, this.value);
+        if (this.asVertex)
+            ((Vertex) traverser.get()).property(this.cardinality, this.key, this.value, this.vertexPropertyKeyValues);
+        else
+            traverser.get().property(this.key, this.value);
     }
 
     @Override