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 15:37:09 UTC

incubator-tinkerpop git commit: went through the intro section of the documentation with a fine toothed comb and have it clean and proper with TraversalSource and lambda discussions.

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


went through the intro section of the documentation with a fine toothed comb and have it clean and proper with TraversalSource and lambda discussions.


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

Branch: refs/heads/master
Commit: f520e6dbe0b78c8ef2b136741f564d7c442e7ae8
Parents: a4f0aa2
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Fri Mar 20 08:36:40 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Fri Mar 20 08:36:59 2015 -0600

----------------------------------------------------------------------
 docs/src/intro.asciidoc                    |  75 ++++++-------
 docs/static/images/tinkerpop3.graffle      | 142 ++++++++++++------------
 docs/static/images/traversal-mechanics.png | Bin 136799 -> 138828 bytes
 3 files changed, 107 insertions(+), 110 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f520e6db/docs/src/intro.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/intro.asciidoc b/docs/src/intro.asciidoc
index ac947c5..cf8422c 100644
--- a/docs/src/intro.asciidoc
+++ b/docs/src/intro.asciidoc
@@ -46,9 +46,9 @@ TinkerPop3 is the third incarnation of the TinkerPop graph computing framework.
   ** `VertexProperty<V>`: a string key associated with a `V` value as well as a collection of `Property<U>` properties (*vertices only*)
 
 .Primary components of the TinkerPop3 *process* API
- * `TraversalContext`: a generator of traversals for a particular graph, domain specific language, and execution engine.
- * `Traversal<S,E>`: a functional data flow process transforming objects of type `S` to type `E`.
-  ** `GraphTraversal`: a traversal that is oriented towards the semantics of the raw graph (i.e. vertices, edges, etc.).
+ * `TraversalSource`: a generator of traversals for a particular graph, link:http://en.wikipedia.org/wiki/Domain-specific_language[domain specific language] (DSL), and execution engine.
+ ** `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.
@@ -57,7 +57,7 @@ IMPORTANT: TinkerPop3 is licensed under the popular link:http://www.apache.org/l
 
 image:tinkerpop-enabled.png[width=135,float=left] When a graph vendor implements the TinkerPop3 structure and process link:http://en.wikipedia.org/wiki/Application_programming_interface[APIs], their technology is considered _TinkerPop3-enabled_ and becomes nearly indistinguishable from any other TinkerPop-enabled graph system save for their respective time and space complexity. The purpose of this documentation is to describe the structure/process dichotomy at length and in doing so, explain how to leverage TinkerPop3 for the sole purpose of vendor-agnostic graph computing. Before deep-diving into the various structure/process APIs, a short introductory review of both APIs is provided.
 
-NOTE: The TinkerPop3 API rides a fine line between providing concise "query language" method names and respecting Java method naming standards. The general convention used throughout TinkerPop3 is that if a method is "user exposed," then a concise name is provided (e.g. `out()`, `path()`, `values()`). If the method is primarily for vendors, then the standard Java naming convention is followed (e.g. `getNextStep()`, `getSteps()`, `getElementComputeKeys()`).
+NOTE: The TinkerPop3 API rides a fine line between providing concise "query language" method names and respecting Java method naming standards. The general convention used throughout TinkerPop3 is that if a method is "user exposed," then a concise name is provided (e.g. `out()`, `path()`, `repeat()`). If the method is primarily for vendors, then the standard Java naming convention is followed (e.g. `getNextStep()`, `getSteps()`, `getElementComputeKeys()`).
 
 The Graph Structure
 -------------------
@@ -92,22 +92,21 @@ NOTE: In TinkerPop3, vertices are allowed a single immutable string label (simil
 Mutating the Graph
 ~~~~~~~~~~~~~~~~~~
 
-Below is a sequence of basic graph mutation operations represented in Java8. One of the major differences between TinkerPop2 and TinkerPop3 is that in TinkerPop3, the Java convention of using setters and getters has been abandoned in favor of a syntax that is more aligned with the syntax of Gremlin-Groovy in TinkerPop2. Given that Gremlin-Java8 and Gremlin-Groovy are nearly identical due to the inclusion of Java8 lambdas, a big efforts was made to ensure that both languages are as similar as possible. 
+Below is a sequence of basic graph mutation operations represented in Java8. One of the major differences between TinkerPop2 and TinkerPop3 is that in TinkerPop3, the Java convention of using setters and getters has been abandoned in favor of a syntax that is more aligned with the syntax of Gremlin-Groovy in TinkerPop2. Given that Gremlin-Java8 and Gremlin-Groovy are nearly identical due to the inclusion of Java8 lambdas, a big efforts was made to ensure that both languages are as similar as possible.
 
 CAUTION: In the code examples presented throughout this documentation, either Gremlin-Java8 or Gremlin-Groovy is used. It is possible to determine which derivative of Gremlin is being used by "mousing over" on the code block and see either "JAVA" or "GROOVY" pop up in the top right corner of the code block.
 
-image:basic-mutation.png[width=240,float=right] 
+image:basic-mutation.png[width=240,float=right]
 [source,java]
 // create a new graph
 Graph graph = TinkerGraph.open();
-GraphTraversalContext g = graph.traversal(standard);
 // add a software vertex with a name property
 Vertex gremlin = graph.addVertex(T.label, "software",
                              "name", "gremlin"); <1>
 // only one vertex should exist
-assert(g.V().count() == 1)
+assert(IteratorUtils.count(graph.vertices()) == 1)
 // no edges should exist as none have been created
-assert(g.E().count() == 0)
+assert(IteratorUtils.count(graph.edges()) == 0)
 // add a new property
 gremlin.property("created",2009) <2>
 // add a new software vertex to the graph
@@ -116,22 +115,22 @@ Vertex blueprints = graph.addVertex(T.label, "software",
 // connect gremlin to blueprints via a dependsOn-edge
 gremlin.addEdge("dependsOn",blueprints); <4>
 // now there are two vertices and one edge
-assert(g.V().count() == 2)
-assert(g.E().count() == 1)
+assert(IteratorUtils.count(graph.vertices()) == 2)
+assert(IteratorUtils.count(graph.edges()) == 1)
 // add a property to blueprints
 blueprints.property("created",2010) <5>
 // remove that property
 blueprints.property("created").remove() <6>
 // connect gremlin to blueprints via encapsulates
 gremlin.addEdge("encapsulates",blueprints) <7>
-assert(g.V().count() == 2)
-assert(g.E().count() == 2)
+assert(IteratorUtils.count(graph.vertices()) == 2)
+assert(IteratorUtils.count(graph.edges()) == 2)
 // removing a vertex removes all its incident edges as well
 blueprints.remove() <8>
 gremlin.remove() <9>
 // the graph is now empty
-assert(g.V().count() == 0)
-assert(g.E().count() == 0)
+assert(IteratorUtils.count(graph.vertices()) == 0)
+assert(IteratorUtils.count(graph.edges()) == 0)
 // tada!
 
 IMPORTANT: image:groovy-logo.png[width=175,float=left] Gremlin-Groovy leverages the link:http://groovy.codehaus.org/[Groovy 2.x language] to express Gremlin traversals. One of the major benefits of Groovy is the inclusion of a runtime console that makes it easy for developers to practice with the Gremlin language and for production users to connect to their graph and execute traversals in an interactive manner. Moreover, Gremlin-Groovy provides various syntax simplifications.
@@ -181,10 +180,10 @@ image:gremlin-running.png[width=125,float=left] The primary way in which graphs
  . Move from those friend-vertices to software-vertices via created-edges.
  . Finally, select the name-property value of the current software-vertices.
 
-Traversals in Gremlin are spawned from a `TraversalContext`. The `GraphTraversalContext` is the typical "graph-oriented" DSL used throughout the documentation. The GraphTraversalContext provides two traversal methods.
+Traversals in Gremlin are spawned from a `TraversalSource`. The `GraphTraversalSource` is the typical "graph-oriented" DSL used throughout the documentation and will most likely be the most used DSL in a TinkerPop application. `GraphTraversalSource` provides two traversal methods.
 
- . `GraphTraversalContext.V(Object... ids)`: generates a traversal starting at vertices in the graph (if no ids are provided, all vertices).
- . `GraphTraversalContext.E(Object... ids)`: generates a traversal starting at edges in the graph (if no ids are provided, all edges).
+ . `GraphTraversalSource.V(Object... ids)`: generates a traversal starting at vertices in the graph (if no ids are provided, all vertices).
+ . `GraphTraversalSource.E(Object... ids)`: generates a traversal starting at edges in the graph (if no ids are provided, all edges).
 
 The return type of `V()` and `E()` is a `GraphTraversal`. A GraphTraversal maintains numerous methods that return GraphTraversal. In this way, a GraphTraversal supports function composition. Each method of GraphTraversal is called a step and each step modulates the results of the previous step in one of five general ways.
 
@@ -194,11 +193,9 @@ The return type of `V()` and `E()` is a `GraphTraversal`. A GraphTraversal maint
  . `sideEffect`: allow the traverser to proceed unchanged, but yield some computational sideEffect in the process (S &rarrlp; S).
  . `branch`: split the traverser and send each to an arbitrary location in the traversal (S &rArr; S~1~, S~2~, ..., S~n~).
 
-Nearly every step in GraphTraversal either extends `MapStep`, `FlatMapStep`, `FilterStep`, `SideEffectStep`, or `BranchStep` (for more information, see <<lambda-steps,lambda steps>>).
+Nearly every step in GraphTraversal either extends `MapStep`, `FlatMapStep`, `FilterStep`, `SideEffectStep`, or `BranchStep`.
 
-IMPORTANT: The steps `map()`, `flatMap()`, `filter()`, `sideEffect()`, and `branch()` all take a link:http://en.wikipedia.org/wiki/Anonymous_function[lambda function] (i.e. an anonymous function or closure). For `map()`, the function must return an object. For `flatMap()`, the function must return an iterator of objects. For `filter()`, the function is a predicate that returns either true or false. For `sideEffect()`, the function is a consumer that simply returns void. For `branch()`, the function returns a collection of traversal step-labels. The lambdas introduced by Java8 are supported in TinkerPop3.
-
-TIP: `GraphTraversal` is a link:http://en.wikipedia.org/wiki/Monoid[monoid] in that it is an algebraic structure that has a single binary operation that is associative. The binary operation is function composition (i.e. method chaining) and its identity is the step `identity()`. This is related to a link:http://en.wikipedia.org/wiki/Monad_(functional_programming)[monad] as popularized by the functional programming community. 
+TIP: `GraphTraversal` is a link:http://en.wikipedia.org/wiki/Monoid[monoid] in that it is an algebraic structure that has a single binary operation that is associative. The binary operation is function composition (i.e. method chaining) and its identity is the step `identity()`. This is related to a link:http://en.wikipedia.org/wiki/Monad_(functional_programming)[monad] as popularized by the functional programming community.
 
 Given the TinkerPop graph, the following query will return the names of all the people that the marko-vertex knows. The following query is demonstrated using Gremlin-Groovy.
 
@@ -209,15 +206,22 @@ $ bin/gremlin.sh
          \,,,/
          (o o)
 -----oOOo-(3)-oOOo-----
-gremlin> graph = TinkerFactory.createModern()
+gremlin> graph = TinkerFactory.createModern() // <1>
 ==>tinkergraph[vertices:6 edges:6]
-gremlin> g = graph.traversal(standard)
-==>graphtraversalcontext[tinkergraph[vertices:6 edges:6], standard]
-gremlin> g.V().has('name','marko').out('knows').values('name')
+gremlin> g = graph.traversal(standard)        // <2>
+==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
+gremlin> g.V().has('name','marko').out('knows').values('name') // <3>
 ==>vadas
 ==>josh
 ----
 
+<1> Open the toy graph and reference it by the variable `graph`.
+<2> Create a graph traversal source from the graph using the standard, OLTP traversal engine.
+<3> Spawn a traversal off the traversal source that determines the names of the people that the marko-vertex knows.
+
+.The Name of The People That Marko Knows
+image::tinkerpop-classic-ex1.png[width=500]
+
 Or, if the marko-vertex is already realized with a direct reference pointer (i.e. a variable), then the traversal can be spawned off that vertex.
 
 [gremlin-groovy,modern]
@@ -231,11 +235,6 @@ g.V(marko).out('knows').values('name') <2>
 <2> Get the vertices that are outgoing adjacent to the marko-vertex via knows-edges.
 <3> Get the names of the marko-vertex's friends.
 
-.The Name of The People That Marko Knows
-image::tinkerpop-classic-ex1.png[width=500]
-
-NOTE: Gremlin-Java is much more aligned with Gremlin-Groovy in TinkerPop3 than it ever was before. In TinkerPop0 through TinkerPop2, Gremlin-Java was extremely verbose due to the simulation of lambdas via anonymous inner classes.  
-
 The Traverser
 ~~~~~~~~~~~~~
 
@@ -243,30 +242,28 @@ When a traversal is executed, the source of the traversal is on the left of the
 
 image::traversal-mechanics.png[width=500]
 
-In TinkerPop3, the objects propagating through the traversal are wrapped in a `Traverser<T>`. The traverser concept is new to TinkerPop3 and provides the means by which steps remain stateless. A traverser maintains all the metadata about the traversal -- e.g., how many times the traverser has gone through a loop, the path history of the traverser, the current object being traversed, etc. Traverser metadata may be accessed by a step. A classic example is the `path()`-step.
+In TinkerPop3, the objects propagating through the traversal are wrapped in a `Traverser<T>`. The traverser concept is new to TinkerPop3 and provides the means by which steps remain stateless. A traverser maintains all the metadata about the traversal -- e.g., how many times the traverser has gone through a loop, the path history of the traverser, the current object being traversed, etc. Traverser metadata may be accessed by a step. A classic example is the <<path-step,`path()`>>-step.
 
 [gremlin-groovy,modern]
 ----
 g.V(marko).out('knows').values('name').path()
 ----
 
-CAUTION: Path calculation is costly in terms of space as an array of previously seen objects is stored in each path of the respective traverser. Thus, traversal optimizers analyze the traversal to determine if path metadata is accessed. If not, then path calculations are turned off.
+CAUTION: Path calculation is costly in terms of space as an array of previously seen objects is stored in each path of the respective traverser. Thus, a traversal strategy analyzes the traversal to determine if path metadata is required. If not, then path calculations are turned off.
 
-Another example is the `repeat()`-step which takes into account the number of times the traverser has gone through a particular section of the traversal expression.
+Another example is the <<repeat-step,`repeat()`>>-step which takes into account the number of times the traverser has gone through a particular section of the traversal expression (i.e. a loop).
 
 [gremlin-groovy,modern]
 ----
 g.V(marko).repeat(out()).times(2).values('name')
 ----
 
-NOTE: In TinkerPop2, the `repeat()`-step was called `loop()`. Repeat has been generalized to support both do-while and while-do semantics which is explained in <<repeat-step,Repeat Step>>.
-
-CAUTION: A Traversal's result are never ordered unless explicitly by means of <<order-step,`order()`>>. Thus, never rely on the iteration order between TinkerPop3 releases and even within a release (as compiler optimizations may alter the flow).
+CAUTION: A Traversal's result are never ordered unless explicitly by means of <<order-step,`order()`>>-step. Thus, never rely on the iteration order between TinkerPop3 releases and even within a release (as traversal optimizations may alter the flow).
 
 On Gremlin Language Variants
 ----------------------------
 
-Gremlin is written in Java8. There are various language variants of Gremlin such as Gremlin-Groovy (packaged with TinkerPop3), Gremlin-Scala, Gremlin-JavaScript, Gremlin-Clojure, etc. It is best to think of Gremlin as a style of graph traversing that is no bound to a particular programming language per se. Within a programming language familiar to the developer, there is a Gremlin variant that they can use that leverages the idioms of that language. At minimum, a programming language providing a Gremlin implementation must support link:http://en.wikipedia.org/wiki/Method_chaining[function chaining] and link:http://en.wikipedia.org/wiki/Anonymous_function[lambdas/anonymous functions].
+Gremlin is written in Java8. There are various language variants of Gremlin such as Gremlin-Groovy (packaged with TinkerPop3), Gremlin-Scala, Gremlin-JavaScript, Gremlin-Clojure, etc. It is best to think of Gremlin as a style of graph traversing that is not bound to a particular programming language per se. Within a programming language familiar to the developer, there is a Gremlin variant that they can use that leverages the idioms of that language. At minimum, a programming language providing a Gremlin implementation must support link:http://en.wikipedia.org/wiki/Method_chaining[function chaining] (with link:http://en.wikipedia.org/wiki/Anonymous_function[lambdas/anonymous functions] being a "nice to have" if the variants wishes to offer arbitrary computations beyond the provided Gremlin steps).
 
 Throughout the documentation, the examples provided are primarily written in Gremlin-Groovy. The reason for this is the <<gremlin-console,Gremlin Console>> whereby an interactive programming environment exists that does not require code compilation. For learning TinkerPop3 and interacting with a live graph system in an ad hoc manner, the Gremlin Console is invaluable. However, for developers interested in working with Gremlin-Java, a few Groovy-to-Java patterns are presented below.
 
@@ -292,4 +289,4 @@ g.V().as("person").out("knows").as("friend").select().by((Function<Vertex, Integ
 Vendor Integration
 ------------------
 
-image:vendor-integration.png[width=395,float=right] TinkerPop is a framework composed of various interoperable components. At the foundation there is the <<graph,core TinkerPop3 API>> which defines what a `Graph`, `Vertex`, `Edge`, etc. are. At minimum a vendor must implement the core API. Once implemented, the Gremlin <<traversal,traversal language>> is available to the vendor's users. However, the vendor can go further and provide specific <<traversalstrategy,`TraversalStrategy`>> optimizations that allow the vendor to inspect a Gremlin query at runtime and optimize it for their particular implementation (e.g. index lookups, step reordering). If the vendor's graph system is a graph processor (or provides OLAP capabilities to its graph database), the vendor must implement the <<graphcomputer,`GraphComputer`>> API. This API defines how messages/traversers are passed between communicating workers (i.e. threads and/or machines). Once implemented, the same Gremlin traversals execute ag
 ainst both the graph database (OLTP) and the graph processor (OLAP). Note that the Gremlin language interprets the graph in terms of vertices and edges -- i.e. Gremlin is a graph-based domain specific language. Users can create their own domain specific languages to process the graph in terms of higher-order constructs such as people, companies, and their various relationships. Finally, <<gremlin-server,Gremlin Server>> can be leveraged to allow over the wire communication with the TinkerPop-enabled graph system. Gremlin Server provides a configurable communication interface along with metrics and monitoring capabilities. In total, this is The TinkerPop.
\ No newline at end of file
+image:vendor-integration.png[width=395,float=right] TinkerPop is a framework composed of various interoperable components. At the foundation there is the <<graph,core TinkerPop3 API>> which defines what a `Graph`, `Vertex`, `Edge`, etc. are. At minimum a vendor must implement the core API. Once implemented, the Gremlin <<traversal,traversal language>> is available to the vendor's users. However, the vendor can go further and provide specific <<traversalstrategy,`TraversalStrategy`>> optimizations that allow the vendor to inspect a Gremlin query at runtime and optimize it for their particular implementation (e.g. index lookups, step reordering). If the vendor's graph system is a graph processor (i.e. provides OLAP capabilities), the vendor can implement the <<graphcomputer,`GraphComputer`>> API. This API defines how messages/traversers are passed between communicating workers (i.e. threads and/or machines). Once implemented, the same Gremlin traversals execute against both the graph 
 database (OLTP) and the graph processor (OLAP). Note that the Gremlin language interprets the graph in terms of vertices and edges -- i.e. Gremlin is a graph-based domain specific language. Users can create their own domain specific languages to process the graph in terms of higher-order constructs such as people, companies, and their various relationships. Finally, <<gremlin-server,Gremlin Server>> can be leveraged to allow over the wire communication with the TinkerPop-enabled graph system. Gremlin Server provides a configurable communication interface along with metrics and monitoring capabilities. In total, this is The TinkerPop.

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f520e6db/docs/static/images/tinkerpop3.graffle
----------------------------------------------------------------------
diff --git a/docs/static/images/tinkerpop3.graffle b/docs/static/images/tinkerpop3.graffle
index 1c42aeb..93c6ac3 100644
--- a/docs/static/images/tinkerpop3.graffle
+++ b/docs/static/images/tinkerpop3.graffle
@@ -148438,7 +148438,7 @@
 	<key>MasterSheets</key>
 	<array/>
 	<key>ModificationDate</key>
-	<string>2015-03-04 15:40:19 +0000</string>
+	<string>2015-03-20 14:24:01 +0000</string>
 	<key>Modifier</key>
 	<string>Marko Rodriguez</string>
 	<key>NotesVisible</key>
@@ -212521,8 +212521,8 @@ lang:java}</string>
 					<integer>154</integer>
 					<key>Points</key>
 					<array>
-						<string>{411.12995833633272, 249.17537096233991}</string>
-						<string>{393.34156685592802, 263.82463264639244}</string>
+						<string>{411.12995833633278, 249.17537096233991}</string>
+						<string>{393.34156685592797, 263.8246326463925}</string>
 					</array>
 					<key>Style</key>
 					<dict>
@@ -215488,7 +215488,7 @@ Program}</string>
 				</dict>
 				<dict>
 					<key>Bounds</key>
-					<string>{{156.5, 111}, {238, 14}}</string>
+					<string>{{138.5, 111}, {274, 14}}</string>
 					<key>Class</key>
 					<string>ShapedGraphic</string>
 					<key>FitText</key>
@@ -215527,7 +215527,7 @@ Program}</string>
 {\colortbl;\red255\green255\blue255;}
 \pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\pardirnatural\qc
 
-\f0\fs24 \cf0 marko.out("knows").values("name")}</string>
+\f0\fs24 \cf0 g.V(marko).out("knows").values("name")}</string>
 						<key>VerticalPad</key>
 						<integer>0</integer>
 					</dict>
@@ -217507,8 +217507,8 @@ lang:java}</string>
 							<integer>142</integer>
 							<key>Points</key>
 							<array>
-								<string>{432.31558180663797, 157.68958738721889}</string>
-								<string>{428.44294795917938, 154.48274935358785}</string>
+								<string>{432.31558180663802, 157.68958738721889}</string>
+								<string>{428.44294795917938, 154.48274935358782}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -228423,8 +228423,8 @@ endTime:2001}</string>
 					<integer>48</integer>
 					<key>Points</key>
 					<array>
-						<string>{207.56428733349856, 306.90079234700102}</string>
-						<string>{275.56067070483158, 339.75387073893654}</string>
+						<string>{207.56428733349856, 306.90079234700096}</string>
+						<string>{275.56067070483152, 339.75387073893648}</string>
 					</array>
 					<key>Style</key>
 					<dict>
@@ -247345,8 +247345,8 @@ endTime:2001}</string>
 							<integer>833</integer>
 							<key>Points</key>
 							<array>
-								<string>{105.52240071844524, 208.31001890112481}</string>
-								<string>{105.63735579580813, 212.65601073725625}</string>
+								<string>{105.52240363132498, 208.31001882455422}</string>
+								<string>{105.63736081573391, 212.65601060529553}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247378,8 +247378,8 @@ endTime:2001}</string>
 							<integer>834</integer>
 							<key>Points</key>
 							<array>
-								<string>{93.331422140760893, 215.7013554490882}</string>
-								<string>{98.654531470446258, 217.66213856496285}</string>
+								<string>{93.331422238964919, 215.70135518196386}</string>
+								<string>{98.654531765362918, 217.66213776276132}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247411,8 +247411,8 @@ endTime:2001}</string>
 							<integer>835</integer>
 							<key>Points</key>
 							<array>
-								<string>{89.348688700496226, 217.225289665547}</string>
-								<string>{84.798174407471578, 225.8188603186718}</string>
+								<string>{89.34868870042699, 217.2252896655103}</string>
+								<string>{84.798174407164595, 225.81886031850914}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247444,8 +247444,8 @@ endTime:2001}</string>
 							<integer>836</integer>
 							<key>Points</key>
 							<array>
-								<string>{100.21217967049391, 238.89697600666904}</string>
-								<string>{105.91488366893917, 245.27828249573341}</string>
+								<string>{100.2121796730972, 238.89697600433846}</string>
+								<string>{105.91488367643969, 245.27828248901847}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247477,8 +247477,8 @@ endTime:2001}</string>
 							<integer>837</integer>
 							<key>Points</key>
 							<array>
-								<string>{120.05187007938419, 243.600612058406}</string>
-								<string>{113.08567167448749, 246.78077004274016}</string>
+								<string>{120.05186756900372, 243.60060655736257}</string>
+								<string>{113.08566790439255, 246.78076178123922}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247510,8 +247510,8 @@ endTime:2001}</string>
 							<integer>838</integer>
 							<key>Points</key>
 							<array>
-								<string>{130.57075957553371, 262.18129561801635}</string>
-								<string>{125.06911394289449, 263.81727999881826}</string>
+								<string>{130.57075907366357, 262.18129392480813}</string>
+								<string>{125.06911280792269, 263.81727616964878}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247543,8 +247543,8 @@ endTime:2001}</string>
 							<integer>839</integer>
 							<key>Points</key>
 							<array>
-								<string>{116.15985323772283, 260.40897172306654}</string>
-								<string>{111.32857270515926, 252.54707494028733}</string>
+								<string>{116.15985324685002, 260.40897171744717}</string>
+								<string>{111.32857272829683, 252.54707492604206}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247576,8 +247576,8 @@ endTime:2001}</string>
 							<integer>840</integer>
 							<key>Points</key>
 							<array>
-								<string>{107.28622204223238, 264.95973627295916}</string>
-								<string>{108.48506035802596, 253.19631346968981}</string>
+								<string>{107.28622204221796, 264.95973627295768}</string>
+								<string>{108.48506035797406, 253.19631346968453}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247609,8 +247609,8 @@ endTime:2001}</string>
 							<integer>841</integer>
 							<key>Points</key>
 							<array>
-								<string>{108.63067853287563, 291.16607222408868}</string>
-								<string>{114.28915499943878, 297.78906313886347}</string>
+								<string>{108.63067853348323, 291.16607222356834}</string>
+								<string>{114.28915500092704, 297.78906313758915}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247642,8 +247642,8 @@ endTime:2001}</string>
 							<integer>842</integer>
 							<key>Points</key>
 							<array>
-								<string>{118.22300926356239, 298.03660848988955}</string>
-								<string>{123.67765031202353, 293.07492100615679}</string>
+								<string>{118.22300919026833, 298.03660840944104}</string>
+								<string>{123.67765004785741, 293.07492071620453}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247675,8 +247675,8 @@ endTime:2001}</string>
 							<integer>843</integer>
 							<key>Points</key>
 							<array>
-								<string>{105.45810348181614, 280.6305971184841}</string>
-								<string>{106.27117033250194, 274.00116182888917}</string>
+								<string>{105.45810337253421, 280.63059710515711}</string>
+								<string>{106.27117010178024, 274.00116180075253}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247708,8 +247708,8 @@ endTime:2001}</string>
 							<integer>844</integer>
 							<key>Points</key>
 							<array>
-								<string>{102.04876562027994, 226.96183583445892}</string>
-								<string>{99.43352159305293, 231.55141003326344}</string>
+								<string>{102.04876111557721, 226.96183326405119}</string>
+								<string>{99.433513980778059, 231.5514056896485}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247741,8 +247741,8 @@ endTime:2001}</string>
 							<integer>845</integer>
 							<key>Points</key>
 							<array>
-								<string>{93.502859609034445, 287.0746511498624}</string>
-								<string>{98.721662379279508, 286.85224075390204}</string>
+								<string>{93.502859595386354, 287.07465082762741}</string>
+								<string>{98.72166234045288, 286.85223983719624}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247774,8 +247774,8 @@ endTime:2001}</string>
 							<integer>846</integer>
 							<key>Points</key>
 							<array>
-								<string>{159.43729496946088, 205.84689654858235}</string>
-								<string>{162.35511682212422, 208.67374581586213}</string>
+								<string>{159.43731226123461, 205.84687871149382}</string>
+								<string>{162.35514580216218, 208.67371592161845}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247807,8 +247807,8 @@ endTime:2001}</string>
 							<integer>847</integer>
 							<key>Points</key>
 							<array>
-								<string>{161.23890229300022, 213.05815862409349}</string>
-								<string>{155.15923222256782, 214.74885574971066}</string>
+								<string>{161.23890210397573, 213.05815794194064}</string>
+								<string>{155.15923177138015, 214.74885412146384}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247840,8 +247840,8 @@ endTime:2001}</string>
 							<integer>848</integer>
 							<key>Points</key>
 							<array>
-								<string>{162.56243434615519, 222.634824447829}</string>
-								<string>{166.19628760632531, 223.00536197237886}</string>
+								<string>{162.56243929926637, 222.63477565048129}</string>
+								<string>{166.19629898950103, 223.00525022947221}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247873,8 +247873,8 @@ endTime:2001}</string>
 							<integer>849</integer>
 							<key>Points</key>
 							<array>
-								<string>{168.74925612066465, 215.14346548963599}</string>
-								<string>{169.54979093889287, 215.98945594579453}</string>
+								<string>{168.77330143877259, 215.12052650314371}</string>
+								<string>{169.57949605656933, 215.96012705523117}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247906,8 +247906,8 @@ endTime:2001}</string>
 							<integer>850</integer>
 							<key>Points</key>
 							<array>
-								<string>{183.93591369453469, 233.83562032755631}</string>
-								<string>{184.79430344183157, 235.15662407834361}</string>
+								<string>{183.94052683915714, 233.83261484435059}</string>
+								<string>{184.79953879759927, 235.15319459445098}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247939,8 +247939,8 @@ endTime:2001}</string>
 							<integer>851</integer>
 							<key>Points</key>
 							<array>
-								<string>{175.24920651962063, 235.44082373783573}</string>
-								<string>{174.40171267608611, 239.40565665957135}</string>
+								<string>{175.24914644198216, 235.4408109538891}</string>
+								<string>{174.40163145871466, 239.40563937131643}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -247972,8 +247972,8 @@ endTime:2001}</string>
 							<integer>852</integer>
 							<key>Points</key>
 							<array>
-								<string>{173.92627528653674, 248.37919271894123}</string>
-								<string>{174.71179865656063, 255.85018469343584}</string>
+								<string>{173.92627548812354, 248.37919269786892}</string>
+								<string>{174.7117991910215, 255.85018463756748}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -248425,8 +248425,8 @@ endTime:2001}</string>
 							<integer>865</integer>
 							<key>Points</key>
 							<array>
-								<string>{162.31406161294416, 239.75189222692973}</string>
-								<string>{170.482633331638, 257.03200725640994}</string>
+								<string>{162.31406161317727, 239.75189222681954}</string>
+								<string>{170.48263333261232, 257.0320072559494}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -248458,8 +248458,8 @@ endTime:2001}</string>
 							<integer>866</integer>
 							<key>Points</key>
 							<array>
-								<string>{144.52746492244782, 248.24228457467933}</string>
-								<string>{148.15840363261998, 252.00545136430679}</string>
+								<string>{144.52787243496229, 248.24189108251144}</string>
+								<string>{148.15895078626158, 252.00492296182625}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -248491,8 +248491,8 @@ endTime:2001}</string>
 							<integer>867</integer>
 							<key>Points</key>
 							<array>
-								<string>{153.47501853757723, 265.16923519721695}</string>
-								<string>{153.47510726500519, 274.70012851650972}</string>
+								<string>{153.47501853757871, 265.16923519721695}</string>
+								<string>{153.47510726500843, 274.70012851650972}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -248524,8 +248524,8 @@ endTime:2001}</string>
 							<integer>868</integer>
 							<key>Points</key>
 							<array>
-								<string>{151.67980349361781, 286.44727023050422}</string>
-								<string>{149.2520640173118, 294.20494479324282}</string>
+								<string>{151.67980343245586, 286.44727021142035}</string>
+								<string>{149.2520638734448, 294.20494474835317}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -248662,8 +248662,8 @@ endTime:2001}</string>
 							<integer>872</integer>
 							<key>Points</key>
 							<array>
-								<string>{158.3037578429381, 284.29024556592418}</string>
-								<string>{162.57828050926429, 287.45938005563374}</string>
+								<string>{158.30376788972234, 284.29023204424362}</string>
+								<string>{162.5782994221355, 287.45935454321295}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -248695,8 +248695,8 @@ endTime:2001}</string>
 							<integer>873</integer>
 							<key>Points</key>
 							<array>
-								<string>{172.11695509488618, 281.36101442951093}</string>
-								<string>{171.04959919239056, 284.72249366343362}</string>
+								<string>{172.11559365179079, 281.3605832149122}</string>
+								<string>{171.04787136067287, 284.72194584554188}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -248761,8 +248761,8 @@ endTime:2001}</string>
 							<integer>875</integer>
 							<key>Points</key>
 							<array>
-								<string>{143.63685851384628, 202.97409113291181}</string>
-								<string>{149.14898665675139, 202.34589980758446}</string>
+								<string>{143.63683462440187, 202.97388035493671}</string>
+								<string>{149.14895260386092, 202.34559975335731}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -248794,8 +248794,8 @@ endTime:2001}</string>
 							<integer>876</integer>
 							<key>Points</key>
 							<array>
-								<string>{112.29025455584838, 216.18316729404324}</string>
-								<string>{119.58824633061367, 211.51541312654672}</string>
+								<string>{112.29024585808686, 216.18315372400392}</string>
+								<string>{119.58822779223138, 211.51538420353791}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -248827,8 +248827,8 @@ endTime:2001}</string>
 							<integer>877</integer>
 							<key>Points</key>
 							<array>
-								<string>{120.86899520559021, 229.37866289030109}</string>
-								<string>{112.39566501990872, 224.26520038734978}</string>
+								<string>{120.86900103934117, 229.37865324050776}</string>
+								<string>{112.39567463713111, 224.26518447924732}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -248860,8 +248860,8 @@ endTime:2001}</string>
 							<integer>878</integer>
 							<key>Points</key>
 							<array>
-								<string>{82.683862237556298, 237.1012752199446}</string>
-								<string>{83.628227888568802, 245.16711282256222}</string>
+								<string>{82.683863172152613, 237.10127511114501}</string>
+								<string>{83.628230085938725, 245.1671125667585}</string>
 							</array>
 							<key>Style</key>
 							<dict>
@@ -249614,11 +249614,11 @@ endTime:2001}</string>
 	<key>WindowInfo</key>
 	<dict>
 		<key>CurrentSheet</key>
-		<integer>42</integer>
+		<integer>29</integer>
 		<key>ExpandedCanvases</key>
 		<array/>
 		<key>Frame</key>
-		<string>{{1259, 298}, {1049, 900}}</string>
+		<string>{{966, 313}, {1049, 900}}</string>
 		<key>ListView</key>
 		<true/>
 		<key>OutlineWidth</key>

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f520e6db/docs/static/images/traversal-mechanics.png
----------------------------------------------------------------------
diff --git a/docs/static/images/traversal-mechanics.png b/docs/static/images/traversal-mechanics.png
index 6b52e86..4f0af98 100644
Binary files a/docs/static/images/traversal-mechanics.png and b/docs/static/images/traversal-mechanics.png differ