You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2020/12/26 12:47:49 UTC

svn commit: r1884815 [2/15] - in /tinkerpop/site: docs/3.5.0-SNAPSHOT/ docs/3.5.0-SNAPSHOT/dev/provider/ docs/3.5.0-SNAPSHOT/images/ docs/3.5.0-SNAPSHOT/recipes/ docs/3.5.0-SNAPSHOT/reference/ docs/3.5.0-SNAPSHOT/tutorials/getting-started/ docs/3.5.0-S...

Modified: tinkerpop/site/docs/3.5.0-SNAPSHOT/recipes/index.html
URL: http://svn.apache.org/viewvc/tinkerpop/site/docs/3.5.0-SNAPSHOT/recipes/index.html?rev=1884815&r1=1884814&r2=1884815&view=diff
==============================================================================
--- tinkerpop/site/docs/3.5.0-SNAPSHOT/recipes/index.html (original)
+++ tinkerpop/site/docs/3.5.0-SNAPSHOT/recipes/index.html Sat Dec 26 12:47:48 2020
@@ -829,6 +829,14 @@ table.CodeRay td.code>pre{padding:0}
 <li><a href="#edge-move">Moving an Edge</a></li>
 <li><a href="#element-existence">Element Existence</a></li>
 <li><a href="#if-then-based-grouping">If-Then Based Grouping</a></li>
+<li><a href="#looping">Looping</a>
+<ul class="sectlevel2">
+<li><a href="#_conditional_looping_with_max_depth">Conditional Looping with Max Depth</a></li>
+<li><a href="#_emitting_loop_depth">Emitting Loop Depth</a></li>
+<li><a href="#_optional_loop_depth">Optional Loop Depth</a></li>
+</ul>
+</li>
+<li><a href="#operating-on-dropped-elements">Operating on Dropped Elements</a></li>
 <li><a href="#pagination">Pagination</a></li>
 <li><a href="#recommendation">Recommendation</a></li>
 <li><a href="#shortest-path">Shortest Path</a></li>
@@ -914,10 +922,10 @@ provide some basic building blocks for v
 traversal on the paths found between them. Consider the following examples using the modern toy graph:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652680-1" type="radio" name="radio-set-1599652680-1" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652680-1" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652680-2" type="radio" name="radio-set-1599652680-1" class="tab-selector-2" />
-  <label for="tab-1599652680-2" class="tab-label-2">groovy</label>
+  <input id="tab-1608852841-1" type="radio" name="radio-set-1608852841-1" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608852841-1" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608852841-2" type="radio" name="radio-set-1608852841-1" class="tab-selector-2" />
+  <label for="tab-1608852841-2" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -992,10 +1000,10 @@ scenarios. For one such example, conside
 vertices:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652680-3" type="radio" name="radio-set-1599652680-3" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652680-3" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652680-4" type="radio" name="radio-set-1599652680-3" class="tab-selector-2" />
-  <label for="tab-1599652680-4" class="tab-label-2">groovy</label>
+  <input id="tab-1608852841-3" type="radio" name="radio-set-1608852841-3" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608852841-3" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608852841-4" type="radio" name="radio-set-1608852841-3" class="tab-selector-2" />
+  <label for="tab-1608852841-4" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -1044,10 +1052,10 @@ to extract the known job, the company th
 the known person completed an application.</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652680-5" type="radio" name="radio-set-1599652680-5" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652680-5" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652680-6" type="radio" name="radio-set-1599652680-5" class="tab-selector-2" />
-  <label for="tab-1599652680-6" class="tab-label-2">groovy</label>
+  <input id="tab-1608852841-5" type="radio" name="radio-set-1608852841-5" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608852841-5" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608852841-6" type="radio" name="radio-set-1608852841-5" class="tab-selector-2" />
+  <label for="tab-1608852841-6" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -1183,10 +1191,10 @@ demonstrate how some of these different
 edges associated to each vertex. The following examples use the modern toy graph:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652690-1" type="radio" name="radio-set-1599652690-1" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652690-1" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652690-2" type="radio" name="radio-set-1599652690-1" class="tab-selector-2" />
-  <label for="tab-1599652690-2" class="tab-label-2">groovy</label>
+  <input id="tab-1608854081-1" type="radio" name="radio-set-1608854081-1" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608854081-1" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608854081-2" type="radio" name="radio-set-1608854081-1" class="tab-selector-2" />
+  <label for="tab-1608854081-2" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -1281,10 +1289,10 @@ graph for demonstration purposes:</p>
 <p><span class="image"><img src="../images/betweeness-example.png" alt="betweeness example" width="600"></span></p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652690-3" type="radio" name="radio-set-1599652690-3" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652690-3" class="tab-label-1">console (groovy )</label>
-  <input id="tab-1599652690-4" type="radio" name="radio-set-1599652690-3" class="tab-selector-2" />
-  <label for="tab-1599652690-4" class="tab-label-2">groovy </label>
+  <input id="tab-1608854081-3" type="radio" name="radio-set-1608854081-3" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608854081-3" class="tab-label-1">console (groovy )</label>
+  <input id="tab-1608854081-4" type="radio" name="radio-set-1608854081-3" class="tab-selector-2" />
+  <label for="tab-1608854081-4" class="tab-label-2">groovy </label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -1397,7 +1405,7 @@ g.V().as(<span class="string"><span clas
 <td class="content">
 Since the betweeness centrality algorithm requires the shortest path between any pair of vertices in the graph,
 its practical applications are very limited. It&#8217;s recommended to use this algorithm only on small subgraphs (graphs like
-the <a href="https://tinkerpop.apache.org/docs/current/reference/#grateful-dead">Grateful Dead graph</a> with only 808 vertices
+the <a href="https://tinkerpop.apache.org/docs/3.5.0-SNAPSHOT/reference/#grateful-dead">Grateful Dead graph</a> with only 808 vertices
 and 8049 edges already require a massive amount of compute resources to determine the shortest paths between all vertex
 pairs).
 </td>
@@ -1412,10 +1420,10 @@ pairs).
 other reachable vertices in the graph. The following examples use the modern toy graph:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652690-5" type="radio" name="radio-set-1599652690-5" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652690-5" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652690-6" type="radio" name="radio-set-1599652690-5" class="tab-selector-2" />
-  <label for="tab-1599652690-6" class="tab-label-2">groovy</label>
+  <input id="tab-1608854081-5" type="radio" name="radio-set-1608854081-5" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608854081-5" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608854081-6" type="radio" name="radio-set-1608854081-5" class="tab-selector-2" />
+  <label for="tab-1608854081-6" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -1501,7 +1509,7 @@ other reachable vertices in the graph. T
 <td class="content">
 Since the closeness centrality algorithm requires the shortest path between any pair of vertices in the graph,
 its practical applications are very limited. It&#8217;s recommended to use this algorithm only on small subgraphs (graphs like
-the <a href="https://tinkerpop.apache.org/docs/current/reference/#grateful-dead">Grateful Dead graph</a> with only 808 vertices
+the <a href="https://tinkerpop.apache.org/docs/3.5.0-SNAPSHOT/reference/#grateful-dead">Grateful Dead graph</a> with only 808 vertices
 and 8049 edges already require a massive amount of compute resources to determine the shortest paths between all vertex
 pairs).
 </td>
@@ -1518,10 +1526,10 @@ relative importance of adjacent vertices
 give it the highest rank. Consider the following example using the Grateful Dead graph:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652690-7" type="radio" name="radio-set-1599652690-7" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652690-7" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652690-8" type="radio" name="radio-set-1599652690-7" class="tab-selector-2" />
-  <label for="tab-1599652690-8" class="tab-label-2">groovy</label>
+  <input id="tab-1608854081-7" type="radio" name="radio-set-1608854081-7" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608854081-7" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608854081-8" type="radio" name="radio-set-1608854081-7" class="tab-selector-2" />
+  <label for="tab-1608854081-8" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -1582,7 +1590,7 @@ time to converge on a solution. Calling
 </li>
 <li>
 <p>The previous examples can be expanded on a little bit by including a
-<a href="https://tinkerpop.apache.org/docs/current/reference/#timelimit-step">time limit</a>. The <code>timeLimit()</code> prevents the
+<a href="https://tinkerpop.apache.org/docs/3.5.0-SNAPSHOT/reference/#timelimit-step">time limit</a>. The <code>timeLimit()</code> prevents the
 traversal from taking longer than one hundred milliseconds to execute (the previous example takes considerably longer
 than that). While the answer provided with the <code>timeLimit()</code> is not the absolute ranking, it does provide a relative
 ranking that closely matches the absolute one. The use of <code>timeLimit()</code> in certain algorithms (e.g. recommendations)
@@ -1600,10 +1608,10 @@ can shorten the time required to get a r
 <code>GraphComputer</code> (OLAP) based traversals.</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652690-9" type="radio" name="radio-set-1599652690-9" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652690-9" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652690-10" type="radio" name="radio-set-1599652690-9" class="tab-selector-2" />
-  <label for="tab-1599652690-10" class="tab-label-2">groovy</label>
+  <input id="tab-1608854081-9" type="radio" name="radio-set-1608854081-9" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608854081-9" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608854081-10" type="radio" name="radio-set-1608854081-9" class="tab-selector-2" />
+  <label for="tab-1608854081-10" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -1611,10 +1619,10 @@ can shorten the time required to get a r
 <pre class="CodeRay highlight"><code data-lang="groovy">gremlin&gt; g = traversal().withEmbedded(graph).withComputer()
 ==&gt;graphtraversalsource[tinkergraph[<span class="key">vertices</span>:<span class="integer">6</span> <span class="key">edges</span>:<span class="integer">6</span>], graphcomputer]
 gremlin&gt; g.V().pageRank().with(PageRank.propertyName,<span class="string"><span class="delimiter">'</span><span class="content">pageRank</span><span class="delimiter">'</span></span>).values(<span class="string"><span class="delimiter">'</span><span class="content">pageRank</span><span class="delimiter">'</span></span>)
+==&gt;<span class="float">0.11375510357865538</span>
+==&gt;<span class="float">0.11375510357865538</span>
 ==&gt;<span class="float">0.14598540152719103</span>
 ==&gt;<span class="float">0.14598540152719103</span>
-==&gt;<span class="float">0.11375510357865537</span>
-==&gt;<span class="float">0.11375510357865537</span>
 ==&gt;<span class="float">0.1757988989970823</span>
 ==&gt;<span class="float">0.30472009079122486</span></code></pre>
 </div>
@@ -1645,7 +1653,7 @@ g.V().pageRank().with(PageRank.propertyN
 <p>Lists and maps form the basis for much of the processing in Gremlin traversals. They are core to how side-effects
 are typically held and how results are generally produced. Being able to pick them apart and reformat them is sometimes
 required. This need to shape the data within a traversal may arise both at the
-<a href="https://tinkerpop.apache.org/docs/current/reference/#terminal-steps">terminal step</a> of the traversal (technically
+<a href="https://tinkerpop.apache.org/docs/3.5.0-SNAPSHOT/reference/#terminal-steps">terminal step</a> of the traversal (technically
 just prior to the terminal step) or in the middle of a traversal. Considering the former, a transformation just prior
 to iteration will get the result into the form required by the application which would remove the need for additional
 application level manipulation. Moreover, a transformation at this stage may reduce the size of the payload being
@@ -1661,10 +1669,10 @@ patterns described in this section.</p>
 appear by way of some side-effect steps like <code>store()</code>:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652703-1" type="radio" name="radio-set-1599652703-1" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652703-1" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652703-2" type="radio" name="radio-set-1599652703-1" class="tab-selector-2" />
-  <label for="tab-1599652703-2" class="tab-label-2">groovy</label>
+  <input id="tab-1608855716-1" type="radio" name="radio-set-1608855716-1" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608855716-1" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608855716-2" type="radio" name="radio-set-1608855716-1" class="tab-selector-2" />
+  <label for="tab-1608855716-2" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -1693,10 +1701,10 @@ g.V().store(<span class="string"><span c
 similar fashion to lists:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652703-3" type="radio" name="radio-set-1599652703-3" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652703-3" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652703-4" type="radio" name="radio-set-1599652703-3" class="tab-selector-2" />
-  <label for="tab-1599652703-4" class="tab-label-2">groovy</label>
+  <input id="tab-1608855716-3" type="radio" name="radio-set-1608855716-3" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608855716-3" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608855716-4" type="radio" name="radio-set-1608855716-3" class="tab-selector-2" />
+  <label for="tab-1608855716-4" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -1729,10 +1737,10 @@ means than what is demonstrated.</p>
 <p>It may seem simple, but the most obvious choice to modifying what is in a list is to simply <code>unfold()</code> the <code>List</code>:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652703-5" type="radio" name="radio-set-1599652703-5" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652703-5" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652703-6" type="radio" name="radio-set-1599652703-5" class="tab-selector-2" />
-  <label for="tab-1599652703-6" class="tab-label-2">groovy</label>
+  <input id="tab-1608855716-5" type="radio" name="radio-set-1608855716-5" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608855716-5" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608855716-6" type="radio" name="radio-set-1608855716-5" class="tab-selector-2" />
+  <label for="tab-1608855716-6" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -1772,10 +1780,10 @@ traverser as it just flattens <code>List
 result, but consider what happens when there is more than one:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652703-7" type="radio" name="radio-set-1599652703-7" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652703-7" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652703-8" type="radio" name="radio-set-1599652703-7" class="tab-selector-2" />
-  <label for="tab-1599652703-8" class="tab-label-2">groovy</label>
+  <input id="tab-1608855716-7" type="radio" name="radio-set-1608855716-7" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608855716-7" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608855716-8" type="radio" name="radio-set-1608855716-7" class="tab-selector-2" />
+  <label for="tab-1608855716-8" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -1817,10 +1825,10 @@ While this approach may be acceptable, t
 structure of the <code>List</code> traversers "locally" <code>unfold()</code> the lists to transform them:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652703-9" type="radio" name="radio-set-1599652703-9" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652703-9" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652703-10" type="radio" name="radio-set-1599652703-9" class="tab-selector-2" />
-  <label for="tab-1599652703-10" class="tab-label-2">groovy</label>
+  <input id="tab-1608855716-9" type="radio" name="radio-set-1608855716-9" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608855716-9" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608855716-10" type="radio" name="radio-set-1608855716-9" class="tab-selector-2" />
+  <label for="tab-1608855716-10" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -1855,10 +1863,10 @@ thus maintaining two traverser results.<
 <p>This pattern for unfolding and folding <code>List</code> traversers ends up having other applications:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652703-11" type="radio" name="radio-set-1599652703-11" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652703-11" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652703-12" type="radio" name="radio-set-1599652703-11" class="tab-selector-2" />
-  <label for="tab-1599652703-12" class="tab-label-2">groovy</label>
+  <input id="tab-1608855716-11" type="radio" name="radio-set-1608855716-11" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608855716-11" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608855716-12" type="radio" name="radio-set-1608855716-11" class="tab-selector-2" />
+  <label for="tab-1608855716-12" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -1936,10 +1944,10 @@ especially in cases where the expected o
 form of a <code>List</code>. For example, consider the following three traversals:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652703-13" type="radio" name="radio-set-1599652703-13" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652703-13" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652703-14" type="radio" name="radio-set-1599652703-13" class="tab-selector-2" />
-  <label for="tab-1599652703-14" class="tab-label-2">groovy</label>
+  <input id="tab-1608855716-13" type="radio" name="radio-set-1608855716-13" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608855716-13" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608855716-14" type="radio" name="radio-set-1608855716-13" class="tab-selector-2" />
+  <label for="tab-1608855716-14" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -2020,10 +2028,10 @@ three results (i.e. triple) that could t
 the use of <code>store()</code> to aid in construction of this <code>List</code>:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652703-15" type="radio" name="radio-set-1599652703-15" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652703-15" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652703-16" type="radio" name="radio-set-1599652703-15" class="tab-selector-2" />
-  <label for="tab-1599652703-16" class="tab-label-2">groovy</label>
+  <input id="tab-1608855716-15" type="radio" name="radio-set-1608855716-15" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608855716-15" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608855716-16" type="radio" name="radio-set-1608855716-15" class="tab-selector-2" />
+  <label for="tab-1608855716-16" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -2134,10 +2142,10 @@ means that each traverser can effectivel
 vertices each:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652703-17" type="radio" name="radio-set-1599652703-17" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652703-17" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652703-18" type="radio" name="radio-set-1599652703-17" class="tab-selector-2" />
-  <label for="tab-1599652703-18" class="tab-label-2">groovy</label>
+  <input id="tab-1608855716-17" type="radio" name="radio-set-1608855716-17" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608855716-17" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608855716-18" type="radio" name="radio-set-1608855716-17" class="tab-selector-2" />
+  <label for="tab-1608855716-18" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -2164,10 +2172,10 @@ vertices each:</p>
 results.</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652703-19" type="radio" name="radio-set-1599652703-19" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652703-19" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652703-20" type="radio" name="radio-set-1599652703-19" class="tab-selector-2" />
-  <label for="tab-1599652703-20" class="tab-label-2">groovy</label>
+  <input id="tab-1608855716-19" type="radio" name="radio-set-1608855716-19" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608855716-19" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608855716-20" type="radio" name="radio-set-1608855716-19" class="tab-selector-2" />
+  <label for="tab-1608855716-20" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -2248,10 +2256,10 @@ need for the transformation, the explana
 to end up with a <code>Map</code> is with <code>valueMap()</code>:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652703-21" type="radio" name="radio-set-1599652703-21" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652703-21" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652703-22" type="radio" name="radio-set-1599652703-21" class="tab-selector-2" />
-  <label for="tab-1599652703-22" class="tab-label-2">groovy</label>
+  <input id="tab-1608855716-21" type="radio" name="radio-set-1608855716-21" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608855716-21" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608855716-22" type="radio" name="radio-set-1608855716-21" class="tab-selector-2" />
+  <label for="tab-1608855716-22" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -2278,10 +2286,10 @@ property stored as a <code>List</code>.
 by avoiding use of <code>valueMap()</code>:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652703-23" type="radio" name="radio-set-1599652703-23" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652703-23" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652703-24" type="radio" name="radio-set-1599652703-23" class="tab-selector-2" />
-  <label for="tab-1599652703-24" class="tab-label-2">groovy</label>
+  <input id="tab-1608855716-23" type="radio" name="radio-set-1608855716-23" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608855716-23" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608855716-24" type="radio" name="radio-set-1608855716-23" class="tab-selector-2" />
+  <label for="tab-1608855716-24" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -2311,10 +2319,10 @@ by avoiding use of <code>valueMap()</cod
 generally applicable to processing any <code>Map</code> instances with any sorts of values:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652703-25" type="radio" name="radio-set-1599652703-25" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652703-25" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652703-26" type="radio" name="radio-set-1599652703-25" class="tab-selector-2" />
-  <label for="tab-1599652703-26" class="tab-label-2">groovy</label>
+  <input id="tab-1608855716-25" type="radio" name="radio-set-1608855716-25" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608855716-25" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608855716-26" type="radio" name="radio-set-1608855716-25" class="tab-selector-2" />
+  <label for="tab-1608855716-26" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -2364,10 +2372,10 @@ desired output before taking this approa
 unavoidable extraneous keys in the output <code>Map</code>:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652703-27" type="radio" name="radio-set-1599652703-27" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652703-27" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652703-28" type="radio" name="radio-set-1599652703-27" class="tab-selector-2" />
-  <label for="tab-1599652703-28" class="tab-label-2">groovy</label>
+  <input id="tab-1608855716-27" type="radio" name="radio-set-1608855716-27" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608855716-27" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608855716-28" type="radio" name="radio-set-1608855716-27" class="tab-selector-2" />
+  <label for="tab-1608855716-28" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -2407,10 +2415,10 @@ every single vertex in the traversal str
 supplied. While this may be an acceptable output, it is possible to shape the <code>Map</code> to be "nicer":</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652703-29" type="radio" name="radio-set-1599652703-29" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652703-29" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652703-30" type="radio" name="radio-set-1599652703-29" class="tab-selector-2" />
-  <label for="tab-1599652703-30" class="tab-label-2">groovy</label>
+  <input id="tab-1608855716-29" type="radio" name="radio-set-1608855716-29" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608855716-29" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608855716-30" type="radio" name="radio-set-1608855716-29" class="tab-selector-2" />
+  <label for="tab-1608855716-30" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -2460,10 +2468,10 @@ prior to reconstructing the <code>Map</c
 earlier to flatten <code>List</code> values within a <code>Map</code>:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652703-31" type="radio" name="radio-set-1599652703-31" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652703-31" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652703-32" type="radio" name="radio-set-1599652703-31" class="tab-selector-2" />
-  <label for="tab-1599652703-32" class="tab-label-2">groovy</label>
+  <input id="tab-1608855716-31" type="radio" name="radio-set-1608855716-31" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608855716-31" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608855716-32" type="radio" name="radio-set-1608855716-31" class="tab-selector-2" />
+  <label for="tab-1608855716-32" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -2513,10 +2521,10 @@ here involves the use of a <code>union()
 reconstructed as a new <code>Map</code> that has been merged together:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652703-33" type="radio" name="radio-set-1599652703-33" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652703-33" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652703-34" type="radio" name="radio-set-1599652703-33" class="tab-selector-2" />
-  <label for="tab-1599652703-34" class="tab-label-2">groovy</label>
+  <input id="tab-1608855716-33" type="radio" name="radio-set-1608855716-33" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608855716-33" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608855716-34" type="radio" name="radio-set-1608855716-33" class="tab-selector-2" />
+  <label for="tab-1608855716-34" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -2530,7 +2538,7 @@ reconstructed as a new <code>Map</code>
            group().
              by(keys).
              by(select(values).unfold())
-==&gt;[<span class="key">degree</span>:<span class="integer">3</span>,<span class="key">name</span>:marko,<span class="key">id</span>:<span class="integer">1</span>,<span class="key">label</span>:person,<span class="key">age</span>:<span class="integer">29</span>]</code></pre>
+==&gt;[<span class="key">degree</span>:<span class="integer">3</span>,<span class="key">name</span>:marko,<span class="key">label</span>:person,<span class="key">id</span>:<span class="integer">1</span>,<span class="key">age</span>:<span class="integer">29</span>]</code></pre>
 </div>
 </div>
     </div>
@@ -2576,10 +2584,10 @@ a <code>List</code> back for all the val
 <code>List</code> instances when necessary:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652703-35" type="radio" name="radio-set-1599652703-35" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652703-35" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652703-36" type="radio" name="radio-set-1599652703-35" class="tab-selector-2" />
-  <label for="tab-1599652703-36" class="tab-label-2">groovy</label>
+  <input id="tab-1608855716-35" type="radio" name="radio-set-1608855716-35" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608855716-35" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608855716-36" type="radio" name="radio-set-1608855716-35" class="tab-selector-2" />
+  <label for="tab-1608855716-36" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -2596,7 +2604,7 @@ a <code>List</code> back for all the val
                 unfold().
                 fold().
                 choose(count(local).is(eq(<span class="integer">1</span>)), unfold()))
-==&gt;[<span class="key">name</span>:marko,<span class="key">id</span>:<span class="integer">1</span>,<span class="key">label</span>:person,<span class="key">age</span>:[<span class="integer">29</span>,<span class="integer">100</span>]]</code></pre>
+==&gt;[<span class="key">name</span>:marko,<span class="key">label</span>:person,<span class="key">id</span>:<span class="integer">1</span>,<span class="key">age</span>:[<span class="integer">29</span>,<span class="integer">100</span>]]</code></pre>
 </div>
 </div>
     </div>
@@ -2658,10 +2666,10 @@ component membership is stored in the gr
 <p><span class="image"><img src="../images/connected-components.png" alt="connected components" width="600"></span></p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652727-1" type="radio" name="radio-set-1599652727-1" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652727-1" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652727-2" type="radio" name="radio-set-1599652727-1" class="tab-selector-2" />
-  <label for="tab-1599652727-2" class="tab-label-2">groovy</label>
+  <input id="tab-1608860202-1" type="radio" name="radio-set-1608860202-1" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608860202-1" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608860202-2" type="radio" name="radio-set-1608860202-1" class="tab-selector-2" />
+  <label for="tab-1608860202-2" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -2707,10 +2715,10 @@ described in more detail in the
 The traversal looks like:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652727-3" type="radio" name="radio-set-1599652727-3" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652727-3" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652727-4" type="radio" name="radio-set-1599652727-3" class="tab-selector-2" />
-  <label for="tab-1599652727-4" class="tab-label-2">groovy</label>
+  <input id="tab-1608860202-3" type="radio" name="radio-set-1608860202-3" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608860202-3" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608860202-4" type="radio" name="radio-set-1608860202-3" class="tab-selector-2" />
+  <label for="tab-1608860202-4" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -2719,7 +2727,7 @@ The traversal looks like:</p>
              group().by(ConnectedComponent.component).
              select(values).unfold()
 ==&gt;[v[E],v[D]]
-==&gt;[v[B],v[C],v[A]]
+==&gt;[v[B],v[A],v[C]]
 ==&gt;[v[F]]</code></pre>
 </div>
 </div>
@@ -2754,10 +2762,10 @@ default property key within which the re
 <p>A straightforward way to detect the various subgraphs with an OLTP traversal is to do this:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652727-5" type="radio" name="radio-set-1599652727-5" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652727-5" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652727-6" type="radio" name="radio-set-1599652727-5" class="tab-selector-2" />
-  <label for="tab-1599652727-6" class="tab-label-2">groovy</label>
+  <input id="tab-1608860202-5" type="radio" name="radio-set-1608860202-5" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608860202-5" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608860202-6" type="radio" name="radio-set-1608860202-5" class="tab-selector-2" />
+  <label for="tab-1608860202-6" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -2895,10 +2903,10 @@ depicted below Gremlin could be use to d
 <p><span class="image"><img src="../images/graph-cycle.png" alt="graph cycle" width="250"></span></p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652736-1" type="radio" name="radio-set-1599652736-1" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652736-1" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652736-2" type="radio" name="radio-set-1599652736-1" class="tab-selector-2" />
-  <label for="tab-1599652736-2" class="tab-label-2">groovy</label>
+  <input id="tab-1608861256-1" type="radio" name="radio-set-1608861256-1" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608861256-1" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608861256-2" type="radio" name="radio-set-1608861256-1" class="tab-selector-2" />
+  <label for="tab-1608861256-2" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -2972,10 +2980,10 @@ It also respected the directionality of
 themselves). To do so, you would need to <code>.emit()</code> a Traverser before the repeat()-loop.</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652736-3" type="radio" name="radio-set-1599652736-3" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652736-3" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652736-4" type="radio" name="radio-set-1599652736-3" class="tab-selector-2" />
-  <label for="tab-1599652736-4" class="tab-label-2">groovy</label>
+  <input id="tab-1608861256-3" type="radio" name="radio-set-1608861256-3" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608861256-3" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608861256-4" type="radio" name="radio-set-1608861256-3" class="tab-selector-2" />
+  <label for="tab-1608861256-4" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -3038,10 +3046,10 @@ g.V().as(<span class="string"><span clas
 outgoing edges, in the modern graph?</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652736-5" type="radio" name="radio-set-1599652736-5" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652736-5" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652736-6" type="radio" name="radio-set-1599652736-5" class="tab-selector-2" />
-  <label for="tab-1599652736-6" class="tab-label-2">groovy</label>
+  <input id="tab-1608861256-5" type="radio" name="radio-set-1608861256-5" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608861256-5" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608861256-6" type="radio" name="radio-set-1608861256-5" class="tab-selector-2" />
+  <label for="tab-1608861256-6" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -3079,10 +3087,10 @@ that happens to have an eighth bridge (t
 <p>Gremlin can detect if such a cycle exists with:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652736-7" type="radio" name="radio-set-1599652736-7" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652736-7" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652736-8" type="radio" name="radio-set-1599652736-7" class="tab-selector-2" />
-  <label for="tab-1599652736-8" class="tab-label-2">groovy</label>
+  <input id="tab-1608861256-7" type="radio" name="radio-set-1608861256-7" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608861256-7" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608861256-8" type="radio" name="radio-set-1608861256-7" class="tab-selector-2" />
+  <label for="tab-1608861256-8" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -3164,10 +3172,10 @@ the first step above, which would mean t
 detected circuit can be displayed with:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652736-9" type="radio" name="radio-set-1599652736-9" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652736-9" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652736-10" type="radio" name="radio-set-1599652736-9" class="tab-selector-2" />
-  <label for="tab-1599652736-10" class="tab-label-2">groovy</label>
+  <input id="tab-1608861256-9" type="radio" name="radio-set-1608861256-9" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608861256-9" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608861256-10" type="radio" name="radio-set-1608861256-9" class="tab-selector-2" />
+  <label for="tab-1608861256-10" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -3217,10 +3225,10 @@ label and direction will be considered "
 that is duplicative of the "created" edge between vertex "1" and "3".</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652748-1" type="radio" name="radio-set-1599652748-1" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652748-1" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652748-2" type="radio" name="radio-set-1599652748-1" class="tab-selector-2" />
-  <label for="tab-1599652748-2" class="tab-label-2">groovy</label>
+  <input id="tab-1608862631-1" type="radio" name="radio-set-1608862631-1" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608862631-1" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608862631-2" type="radio" name="radio-set-1608862631-1" class="tab-selector-2" />
+  <label for="tab-1608862631-2" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -3248,10 +3256,10 @@ g.V(<span class="integer">1</span>).outE
 <p>One way to find the duplicate edges would be to do something like this:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652748-3" type="radio" name="radio-set-1599652748-3" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652748-3" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652748-4" type="radio" name="radio-set-1599652748-3" class="tab-selector-2" />
-  <label for="tab-1599652748-4" class="tab-label-2">groovy</label>
+  <input id="tab-1608862631-3" type="radio" name="radio-set-1608862631-3" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608862631-3" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608862631-4" type="radio" name="radio-set-1608862631-3" class="tab-selector-2" />
+  <label for="tab-1608862631-4" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -3314,10 +3322,10 @@ contain  duplicate.</p>
 that uses less memory might look like this:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652748-5" type="radio" name="radio-set-1599652748-5" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652748-5" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652748-6" type="radio" name="radio-set-1599652748-5" class="tab-selector-2" />
-  <label for="tab-1599652748-6" class="tab-label-2">groovy</label>
+  <input id="tab-1608862631-5" type="radio" name="radio-set-1608862631-5" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608862631-5" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608862631-6" type="radio" name="radio-set-1608862631-5" class="tab-selector-2" />
+  <label for="tab-1608862631-6" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -3386,10 +3394,10 @@ value.</p>
 <p>Note that the above traversal could also be written using <code>match</code> step:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652748-7" type="radio" name="radio-set-1599652748-7" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652748-7" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652748-8" type="radio" name="radio-set-1599652748-7" class="tab-selector-2" />
-  <label for="tab-1599652748-8" class="tab-label-2">groovy</label>
+  <input id="tab-1608862631-7" type="radio" name="radio-set-1608862631-7" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608862631-7" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608862631-8" type="radio" name="radio-set-1608862631-7" class="tab-selector-2" />
+  <label for="tab-1608862631-8" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -3438,10 +3446,10 @@ The previous examples invoke traversal s
 as a performance optimization.</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652748-9" type="radio" name="radio-set-1599652748-9" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652748-9" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652748-10" type="radio" name="radio-set-1599652748-9" class="tab-selector-2" />
-  <label for="tab-1599652748-10" class="tab-label-2">groovy</label>
+  <input id="tab-1608862631-9" type="radio" name="radio-set-1608862631-9" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608862631-9" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608862631-10" type="radio" name="radio-set-1608862631-9" class="tab-selector-2" />
+  <label for="tab-1608862631-10" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -3497,10 +3505,10 @@ example, a "duplicate" definition could
 demonstration, an additional edge is added to the "modern" graph:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652748-11" type="radio" name="radio-set-1599652748-11" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652748-11" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652748-12" type="radio" name="radio-set-1599652748-11" class="tab-selector-2" />
-  <label for="tab-1599652748-12" class="tab-label-2">groovy</label>
+  <input id="tab-1608862631-11" type="radio" name="radio-set-1608862631-11" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608862631-11" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608862631-12" type="radio" name="radio-set-1608862631-11" class="tab-selector-2" />
+  <label for="tab-1608862631-12" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -3531,10 +3539,10 @@ g.V(<span class="integer">1</span>).outE
 <p>To identify the duplicate with this revised definition, the previous traversal can be modified to:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652748-13" type="radio" name="radio-set-1599652748-13" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652748-13" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652748-14" type="radio" name="radio-set-1599652748-13" class="tab-selector-2" />
-  <label for="tab-1599652748-14" class="tab-label-2">groovy</label>
+  <input id="tab-1608862631-13" type="radio" name="radio-set-1608862631-13" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608862631-13" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608862631-14" type="radio" name="radio-set-1608862631-13" class="tab-selector-2" />
+  <label for="tab-1608862631-14" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -3584,10 +3592,10 @@ group for duplicates.</p>
 <p>Consider the following example with some duplicate vertices added to the "modern" graph:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652760-1" type="radio" name="radio-set-1599652760-1" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652760-1" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652760-2" type="radio" name="radio-set-1599652760-1" class="tab-selector-2" />
-  <label for="tab-1599652760-2" class="tab-label-2">groovy</label>
+  <input id="tab-1608864224-1" type="radio" name="radio-set-1608864224-1" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608864224-1" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608864224-2" type="radio" name="radio-set-1608864224-1" class="tab-selector-2" />
+  <label for="tab-1608864224-2" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -3633,10 +3641,10 @@ the <code>Map</code> provided by the <co
 match the feature. To extract just those vertices that contain duplicates an additional filter can be added:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652760-3" type="radio" name="radio-set-1599652760-3" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652760-3" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652760-4" type="radio" name="radio-set-1599652760-3" class="tab-selector-2" />
-  <label for="tab-1599652760-4" class="tab-label-2">groovy</label>
+  <input id="tab-1608864224-3" type="radio" name="radio-set-1608864224-3" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608864224-3" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608864224-4" type="radio" name="radio-set-1608864224-3" class="tab-selector-2" />
+  <label for="tab-1608864224-4" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -3685,10 +3693,10 @@ be created with the same properties and
 follows:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652766-1" type="radio" name="radio-set-1599652766-1" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652766-1" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652766-2" type="radio" name="radio-set-1599652766-1" class="tab-selector-2" />
-  <label for="tab-1599652766-2" class="tab-label-2">groovy</label>
+  <input id="tab-1608864754-1" type="radio" name="radio-set-1608864754-1" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608864754-1" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608864754-2" type="radio" name="radio-set-1608864754-1" class="tab-selector-2" />
+  <label for="tab-1608864754-2" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -3720,10 +3728,10 @@ follows:</p>
 the "peter" vertex in a single traversal:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652766-3" type="radio" name="radio-set-1599652766-3" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652766-3" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652766-4" type="radio" name="radio-set-1599652766-3" class="tab-selector-2" />
-  <label for="tab-1599652766-4" class="tab-label-2">groovy</label>
+  <input id="tab-1608864754-3" type="radio" name="radio-set-1608864754-3" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608864754-3" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608864754-4" type="radio" name="radio-set-1608864754-3" class="tab-selector-2" />
+  <label for="tab-1608864754-4" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -3794,10 +3802,10 @@ properties to transfer to the new "moved
 <p>Checking for whether or not a graph element is present in the graph is simple:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652774-1" type="radio" name="radio-set-1599652774-1" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652774-1" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652774-2" type="radio" name="radio-set-1599652774-1" class="tab-selector-2" />
-  <label for="tab-1599652774-2" class="tab-label-2">groovy</label>
+  <input id="tab-1608865325-1" type="radio" name="radio-set-1608865325-1" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608865325-1" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608865325-2" type="radio" name="radio-set-1608865325-1" class="tab-selector-2" />
+  <label for="tab-1608865325-2" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -3828,10 +3836,10 @@ determine whether or not to add a new ve
 entire operation can occur in a single traversal.</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652774-3" type="radio" name="radio-set-1599652774-3" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652774-3" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652774-4" type="radio" name="radio-set-1599652774-3" class="tab-selector-2" />
-  <label for="tab-1599652774-4" class="tab-label-2">groovy</label>
+  <input id="tab-1608865325-3" type="radio" name="radio-set-1608865325-3" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608865325-3" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608865325-4" type="radio" name="radio-set-1608865325-3" class="tab-selector-2" />
+  <label for="tab-1608865325-4" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -3886,10 +3894,10 @@ then the vertex does not exist and it is
 <p>This "get or create" logic can be expanded to be "upsert" like functionality as follows:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652774-5" type="radio" name="radio-set-1599652774-5" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652774-5" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652774-6" type="radio" name="radio-set-1599652774-5" class="tab-selector-2" />
-  <label for="tab-1599652774-6" class="tab-label-2">groovy</label>
+  <input id="tab-1608865325-5" type="radio" name="radio-set-1608865325-5" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608865325-5" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608865325-6" type="radio" name="radio-set-1608865325-5" class="tab-selector-2" />
+  <label for="tab-1608865325-6" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -3951,10 +3959,10 @@ execution.
 <p>It is possible to do similar sorts of operations with edges using the same pattern:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652774-7" type="radio" name="radio-set-1599652774-7" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652774-7" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652774-8" type="radio" name="radio-set-1599652774-7" class="tab-selector-2" />
-  <label for="tab-1599652774-8" class="tab-label-2">groovy</label>
+  <input id="tab-1608865325-7" type="radio" name="radio-set-1608865325-7" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608865325-7" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608865325-8" type="radio" name="radio-set-1608865325-7" class="tab-selector-2" />
+  <label for="tab-1608865325-8" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -3995,10 +4003,10 @@ found between these two vertices, then i
 <p>Consider the following traversal over the "modern" toy graph:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652783-1" type="radio" name="radio-set-1599652783-1" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652783-1" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652783-2" type="radio" name="radio-set-1599652783-1" class="tab-selector-2" />
-  <label for="tab-1599652783-2" class="tab-label-2">groovy</label>
+  <input id="tab-1608866345-1" type="radio" name="radio-set-1608866345-1" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608866345-1" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608866345-2" type="radio" name="radio-set-1608866345-1" class="tab-selector-2" />
+  <label for="tab-1608866345-2" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -4026,10 +4034,10 @@ different picture of the result. For exa
 a domain concept such as "young", "old" and "very old".</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652783-3" type="radio" name="radio-set-1599652783-3" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652783-3" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652783-4" type="radio" name="radio-set-1599652783-3" class="tab-selector-2" />
-  <label for="tab-1599652783-4" class="tab-label-2">groovy</label>
+  <input id="tab-1608866345-3" type="radio" name="radio-set-1608866345-3" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608866345-3" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608866345-4" type="radio" name="radio-set-1608866345-3" class="tab-selector-2" />
+  <label for="tab-1608866345-4" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -4081,10 +4089,10 @@ like the following in Java:</p>
 there is another option to consider with <code>coalesce</code>:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652783-5" type="radio" name="radio-set-1599652783-5" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652783-5" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652783-6" type="radio" name="radio-set-1599652783-5" class="tab-selector-2" />
-  <label for="tab-1599652783-6" class="tab-label-2">groovy</label>
+  <input id="tab-1608866345-5" type="radio" name="radio-set-1608866345-5" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608866345-5" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608866345-6" type="radio" name="radio-set-1608866345-5" class="tab-selector-2" />
+  <label for="tab-1608866345-6" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -4119,6 +4127,396 @@ there is another option to consider with
 </div>
 </div>
 <div class="sect1">
+<h2 id="looping">Looping</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>One common use case when working with Gremlin is to perform complex looping statements using the <code>repeat()</code> step.  While many of the common patterns for looping within traversals are discussed in the documentation there are several more complex patterns that include additional steps which are also commonly used.  This section attempts to demonstrate how to use some of these more complex measurements.</p>
+</div>
+<div class="paragraph">
+<p><span class="image" style="float: right"><img src="../images/tree-lca.png" alt="tree lca" width="230"></span> The following examples will use this graph depicted here:</p>
+</div>
+<section class="tabs tabs-2">
+  <input id="tab-1608867120-1" type="radio" name="radio-set-1608867120-1" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608867120-1" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608867120-2" type="radio" name="radio-set-1608867120-1" class="tab-selector-2" />
+  <label for="tab-1608867120-2" class="tab-label-2">groovy</label>
+  <div class="tabcontent">
+    <div class="tabcontent-1">
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">gremlin&gt; g.addV().property(id, <span class="string"><span class="delimiter">'</span><span class="content">A</span><span class="delimiter">'</span></span>).as(<span class="string"><span class="delimiter">'</span><span class="content">a</span><span class="delimiter">'</span></span>).
+           addV().property(id, <span class="string"><span class="delimiter">'</span><span class="content">B</span><span class="delimiter">'</span></span>).as(<span class="string"><span class="delimiter">'</span><span class="content">b</span><span class="delimiter">'</span></span>).
+           addV().property(id, <span class="string"><span class="delimiter">'</span><span class="content">C</span><span class="delimiter">'</span></span>).as(<span class="string"><span class="delimiter">'</span><span class="content">c</span><span class="delimiter">'</span></span>).
+           addV().property(id, <span class="string"><span class="delimiter">'</span><span class="content">D</span><span class="delimiter">'</span></span>).as(<span class="string"><span class="delimiter">'</span><span class="content">d</span><span class="delimiter">'</span></span>).
+           addV().property(id, <span class="string"><span class="delimiter">'</span><span class="content">E</span><span class="delimiter">'</span></span>).as(<span class="string"><span class="delimiter">'</span><span class="content">e</span><span class="delimiter">'</span></span>).
+           addV().property(id, <span class="string"><span class="delimiter">'</span><span class="content">F</span><span class="delimiter">'</span></span>).as(<span class="string"><span class="delimiter">'</span><span class="content">f</span><span class="delimiter">'</span></span>).
+           addV().property(id, <span class="string"><span class="delimiter">'</span><span class="content">G</span><span class="delimiter">'</span></span>).as(<span class="string"><span class="delimiter">'</span><span class="content">g</span><span class="delimiter">'</span></span>).
+           addE(<span class="string"><span class="delimiter">'</span><span class="content">hasParent</span><span class="delimiter">'</span></span>).from(<span class="string"><span class="delimiter">'</span><span class="content">a</span><span class="delimiter">'</span></span>).to(<span class="string"><span class="delimiter">'</span><span class="content">b</span><span class="delimiter">'</span></span>).
+           addE(<span class="string"><span class="delimiter">'</span><span class="content">hasParent</span><span class="delimiter">'</span></span>).from(<span class="string"><span class="delimiter">'</span><span class="content">b</span><span class="delimiter">'</span></span>).to(<span class="string"><span class="delimiter">'</span><span class="content">c</span><span class="delimiter">'</span></span>).
+           addE(<span class="string"><span class="delimiter">'</span><span class="content">hasParent</span><span class="delimiter">'</span></span>).from(<span class="string"><span class="delimiter">'</span><span class="content">d</span><span class="delimiter">'</span></span>).to(<span class="string"><span class="delimiter">'</span><span class="content">c</span><span class="delimiter">'</span></span>).
+           addE(<span class="string"><span class="delimiter">'</span><span class="content">hasParent</span><span class="delimiter">'</span></span>).from(<span class="string"><span class="delimiter">'</span><span class="content">c</span><span class="delimiter">'</span></span>).to(<span class="string"><span class="delimiter">'</span><span class="content">e</span><span class="delimiter">'</span></span>).
+           addE(<span class="string"><span class="delimiter">'</span><span class="content">hasParent</span><span class="delimiter">'</span></span>).from(<span class="string"><span class="delimiter">'</span><span class="content">e</span><span class="delimiter">'</span></span>).to(<span class="string"><span class="delimiter">'</span><span class="content">f</span><span class="delimiter">'</span></span>).
+           addE(<span class="string"><span class="delimiter">'</span><span class="content">hasParent</span><span class="delimiter">'</span></span>).from(<span class="string"><span class="delimiter">'</span><span class="content">g</span><span class="delimiter">'</span></span>).to(<span class="string"><span class="delimiter">'</span><span class="content">f</span><span class="delimiter">'</span></span>).iterate()</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+  <div class="tabcontent">
+    <div class="tabcontent-2">
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">g.addV().property(id, <span class="string"><span class="delimiter">'</span><span class="content">A</span><span class="delimiter">'</span></span>).as(<span class="string"><span class="delimiter">'</span><span class="content">a</span><span class="delimiter">'</span></span>).
+  addV().property(id, <span class="string"><span class="delimiter">'</span><span class="content">B</span><span class="delimiter">'</span></span>).as(<span class="string"><span class="delimiter">'</span><span class="content">b</span><span class="delimiter">'</span></span>).
+  addV().property(id, <span class="string"><span class="delimiter">'</span><span class="content">C</span><span class="delimiter">'</span></span>).as(<span class="string"><span class="delimiter">'</span><span class="content">c</span><span class="delimiter">'</span></span>).
+  addV().property(id, <span class="string"><span class="delimiter">'</span><span class="content">D</span><span class="delimiter">'</span></span>).as(<span class="string"><span class="delimiter">'</span><span class="content">d</span><span class="delimiter">'</span></span>).
+  addV().property(id, <span class="string"><span class="delimiter">'</span><span class="content">E</span><span class="delimiter">'</span></span>).as(<span class="string"><span class="delimiter">'</span><span class="content">e</span><span class="delimiter">'</span></span>).
+  addV().property(id, <span class="string"><span class="delimiter">'</span><span class="content">F</span><span class="delimiter">'</span></span>).as(<span class="string"><span class="delimiter">'</span><span class="content">f</span><span class="delimiter">'</span></span>).
+  addV().property(id, <span class="string"><span class="delimiter">'</span><span class="content">G</span><span class="delimiter">'</span></span>).as(<span class="string"><span class="delimiter">'</span><span class="content">g</span><span class="delimiter">'</span></span>).
+  addE(<span class="string"><span class="delimiter">'</span><span class="content">hasParent</span><span class="delimiter">'</span></span>).from(<span class="string"><span class="delimiter">'</span><span class="content">a</span><span class="delimiter">'</span></span>).to(<span class="string"><span class="delimiter">'</span><span class="content">b</span><span class="delimiter">'</span></span>).
+  addE(<span class="string"><span class="delimiter">'</span><span class="content">hasParent</span><span class="delimiter">'</span></span>).from(<span class="string"><span class="delimiter">'</span><span class="content">b</span><span class="delimiter">'</span></span>).to(<span class="string"><span class="delimiter">'</span><span class="content">c</span><span class="delimiter">'</span></span>).
+  addE(<span class="string"><span class="delimiter">'</span><span class="content">hasParent</span><span class="delimiter">'</span></span>).from(<span class="string"><span class="delimiter">'</span><span class="content">d</span><span class="delimiter">'</span></span>).to(<span class="string"><span class="delimiter">'</span><span class="content">c</span><span class="delimiter">'</span></span>).
+  addE(<span class="string"><span class="delimiter">'</span><span class="content">hasParent</span><span class="delimiter">'</span></span>).from(<span class="string"><span class="delimiter">'</span><span class="content">c</span><span class="delimiter">'</span></span>).to(<span class="string"><span class="delimiter">'</span><span class="content">e</span><span class="delimiter">'</span></span>).
+  addE(<span class="string"><span class="delimiter">'</span><span class="content">hasParent</span><span class="delimiter">'</span></span>).from(<span class="string"><span class="delimiter">'</span><span class="content">e</span><span class="delimiter">'</span></span>).to(<span class="string"><span class="delimiter">'</span><span class="content">f</span><span class="delimiter">'</span></span>).
+  addE(<span class="string"><span class="delimiter">'</span><span class="content">hasParent</span><span class="delimiter">'</span></span>).from(<span class="string"><span class="delimiter">'</span><span class="content">g</span><span class="delimiter">'</span></span>).to(<span class="string"><span class="delimiter">'</span><span class="content">f</span><span class="delimiter">'</span></span>).iterate()</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
+<div class="sect2">
+<h3 id="_conditional_looping_with_max_depth">Conditional Looping with Max Depth</h3>
+<div class="paragraph">
+<p>One common situation encountered when writing <code>repeat()</code> loop is the need to exit the loop when either a
+specific condition is met or a maximum depth is reached.  Given that graph above the following traversal
+demonstrates how to accomplish this type of complex exit condition.  In this example the traversal will
+start at vertex A and loop through all outgoing edges until it reaches vertex C or until it has
+completed 3 loops.</p>
+</div>
+<section class="tabs tabs-2">
+  <input id="tab-1608867120-3" type="radio" name="radio-set-1608867120-3" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608867120-3" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608867120-4" type="radio" name="radio-set-1608867120-3" class="tab-selector-2" />
+  <label for="tab-1608867120-4" class="tab-label-2">groovy</label>
+  <div class="tabcontent">
+    <div class="tabcontent-1">
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">gremlin&gt; g.V(<span class="string"><span class="delimiter">'</span><span class="content">A</span><span class="delimiter">'</span></span>).
+           repeat(out().simplePath()).
+             until(hasId(<span class="string"><span class="delimiter">'</span><span class="content">C</span><span class="delimiter">'</span></span>).or().loops().is(<span class="integer">3</span>))
+==&gt;v[C]</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+  <div class="tabcontent">
+    <div class="tabcontent-2">
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">g.V(<span class="string"><span class="delimiter">'</span><span class="content">A</span><span class="delimiter">'</span></span>).
+  repeat(out().simplePath()).
+    until(hasId(<span class="string"><span class="delimiter">'</span><span class="content">C</span><span class="delimiter">'</span></span>).or().loops().is(<span class="integer">3</span>))</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
+<div class="paragraph">
+<p>In the above case the traversal processes the <code>out().simplePath()</code> step once to move from vertex A to
+vertex B, a second time to move from vertex B to vertex C, and then exits the traversal because it
+satisfies the <code>hasId('C')</code> condition since it&#8217;s reached vertex C.  If we however change that exit condition
+to be vertex G, we will see that this traversal now will continue to process thorough vertex X and will
+exit based on reaching the maximum number of loops (3).</p>
+</div>
+<section class="tabs tabs-2">
+  <input id="tab-1608867120-5" type="radio" name="radio-set-1608867120-5" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608867120-5" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608867120-6" type="radio" name="radio-set-1608867120-5" class="tab-selector-2" />
+  <label for="tab-1608867120-6" class="tab-label-2">groovy</label>
+  <div class="tabcontent">
+    <div class="tabcontent-1">
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">gremlin&gt; g.V(<span class="string"><span class="delimiter">'</span><span class="content">A</span><span class="delimiter">'</span></span>).
+           repeat(out().simplePath()).
+             until(hasId(<span class="string"><span class="delimiter">'</span><span class="content">G</span><span class="delimiter">'</span></span>).or().loops().is(<span class="integer">3</span>))
+==&gt;v[E]</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+  <div class="tabcontent">
+    <div class="tabcontent-2">
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">g.V(<span class="string"><span class="delimiter">'</span><span class="content">A</span><span class="delimiter">'</span></span>).
+  repeat(out().simplePath()).
+    until(hasId(<span class="string"><span class="delimiter">'</span><span class="content">G</span><span class="delimiter">'</span></span>).or().loops().is(<span class="integer">3</span>))</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
+<div class="paragraph">
+<p>The key portion of the above traversal is the <code>until()</code> step.  This step is capable of accepting a <code>Traversal</code>
+object which continues the <code>repeat()</code> loop traversing until the evaluated output of the traversal is true, when
+the traverser exits the <code>repeat()</code> loop.  This methodology allows complex logical conditions
+to be used as the exit criteria.</p>
+</div>
+</div>
+<div class="sect2">
+<h3 id="_emitting_loop_depth">Emitting Loop Depth</h3>
+<div class="paragraph">
+<p>Another common situation encountered when using <code>repeat()</code> loops is the desire to emit not only the value
+of the traverser at each step, but also to emit the depth of that element in the repeat loop.  Below are
+several different recipes for accomplishing this task based on what the desired output:</p>
+</div>
+<div class="paragraph">
+<p>If the desired output is to get each vertex and its associated depth this can be accomplished using this traversal.</p>
+</div>
+<section class="tabs tabs-2">
+  <input id="tab-1608867120-7" type="radio" name="radio-set-1608867120-7" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608867120-7" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608867120-8" type="radio" name="radio-set-1608867120-7" class="tab-selector-2" />
+  <label for="tab-1608867120-8" class="tab-label-2">groovy</label>
+  <div class="tabcontent">
+    <div class="tabcontent-1">
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">gremlin&gt; g.withSack(<span class="integer">1</span>).V(<span class="string"><span class="delimiter">'</span><span class="content">A</span><span class="delimiter">'</span></span>).
+           repeat(both().simplePath().
+             sack(assign).by(loops())
+           ).emit().
+           project(<span class="string"><span class="delimiter">'</span><span class="content">vertex</span><span class="delimiter">'</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">depth</span><span class="delimiter">'</span></span>).
+             by().
+             by(sack())
+==&gt;[<span class="key">vertex</span>:v[B],<span class="key">depth</span>:<span class="integer">0</span>]
+==&gt;[<span class="key">vertex</span>:v[C],<span class="key">depth</span>:<span class="integer">1</span>]
+==&gt;[<span class="key">vertex</span>:v[E],<span class="key">depth</span>:<span class="integer">2</span>]
+==&gt;[<span class="key">vertex</span>:v[D],<span class="key">depth</span>:<span class="integer">2</span>]
+==&gt;[<span class="key">vertex</span>:v[F],<span class="key">depth</span>:<span class="integer">3</span>]
+==&gt;[<span class="key">vertex</span>:v[G],<span class="key">depth</span>:<span class="integer">4</span>]</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+  <div class="tabcontent">
+    <div class="tabcontent-2">
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">g.withSack(<span class="integer">1</span>).V(<span class="string"><span class="delimiter">'</span><span class="content">A</span><span class="delimiter">'</span></span>).
+  repeat(both().simplePath().
+    sack(assign).by(loops())
+  ).emit().
+  project(<span class="string"><span class="delimiter">'</span><span class="content">vertex</span><span class="delimiter">'</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">depth</span><span class="delimiter">'</span></span>).
+    by().
+    by(sack())</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
+<div class="paragraph">
+<p>However, if the desired output is to get a single result per level containing all the vertices at that level
+this can be accomplished with this traversal.</p>
+</div>
+<section class="tabs tabs-2">
+  <input id="tab-1608867120-9" type="radio" name="radio-set-1608867120-9" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608867120-9" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608867120-10" type="radio" name="radio-set-1608867120-9" class="tab-selector-2" />
+  <label for="tab-1608867120-10" class="tab-label-2">groovy</label>
+  <div class="tabcontent">
+    <div class="tabcontent-1">
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">gremlin&gt; g.V(<span class="string"><span class="delimiter">'</span><span class="content">A</span><span class="delimiter">'</span></span>).
+           repeat(both().simplePath().group(<span class="string"><span class="delimiter">'</span><span class="content">x</span><span class="delimiter">'</span></span>).
+             by(loops())
+           ).emit().times(<span class="integer">3</span>).
+           cap(<span class="string"><span class="delimiter">'</span><span class="content">x</span><span class="delimiter">'</span></span>)
+==&gt;[<span class="integer">0</span>:[v[B]],<span class="integer">1</span>:[v[C]],<span class="integer">2</span>:[v[E],v[D]]]</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+  <div class="tabcontent">
+    <div class="tabcontent-2">
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">g.V(<span class="string"><span class="delimiter">'</span><span class="content">A</span><span class="delimiter">'</span></span>).
+  repeat(both().simplePath().group(<span class="string"><span class="delimiter">'</span><span class="content">x</span><span class="delimiter">'</span></span>).
+    by(loops())
+  ).emit().times(<span class="integer">3</span>).
+  cap(<span class="string"><span class="delimiter">'</span><span class="content">x</span><span class="delimiter">'</span></span>)</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
+</div>
+<div class="sect2">
+<h3 id="_optional_loop_depth">Optional Loop Depth</h3>
+<div class="paragraph">
+<p>A third common use of <code>repeat()</code> loops is to loop through a series of steps a certain number of times or
+until there are no additional edges to traverse.  The examples below demonstrate how this loop termination can
+be accomplished.</p>
+</div>
+<div class="paragraph">
+<p>The first method, is an extension of our "Conditional Looping with Max Depth" pattern above where the condition
+in the <code>until()</code> checking for a vertex with a degree of zero.</p>
+</div>
+<section class="tabs tabs-2">
+  <input id="tab-1608867120-11" type="radio" name="radio-set-1608867120-11" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608867120-11" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608867120-12" type="radio" name="radio-set-1608867120-11" class="tab-selector-2" />
+  <label for="tab-1608867120-12" class="tab-label-2">groovy</label>
+  <div class="tabcontent">
+    <div class="tabcontent-1">
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">gremlin&gt; g.V(<span class="string"><span class="delimiter">'</span><span class="content">A</span><span class="delimiter">'</span></span>).
+           repeat(out().simplePath()).
+             until(outE().count().is(<span class="integer">0</span>).or().loops().is(<span class="integer">5</span>))
+==&gt;v[F]</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+  <div class="tabcontent">
+    <div class="tabcontent-2">
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">g.V(<span class="string"><span class="delimiter">'</span><span class="content">A</span><span class="delimiter">'</span></span>).
+  repeat(out().simplePath()).
+    until(outE().count().is(<span class="integer">0</span>).or().loops().is(<span class="integer">5</span>))</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
+<div class="paragraph">
+<p>Another way to accomplish this requirement is to use the <code>optional()</code> step.  Here use the <code>optional()</code> step
+within a <code>repeat().times()</code> loop.  In the example below we start at vertex A and traverse all <code>out()</code> edges
+up to a maximum of 5 times.</p>
+</div>
+<section class="tabs tabs-2">
+  <input id="tab-1608867120-13" type="radio" name="radio-set-1608867120-13" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608867120-13" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608867120-14" type="radio" name="radio-set-1608867120-13" class="tab-selector-2" />
+  <label for="tab-1608867120-14" class="tab-label-2">groovy</label>
+  <div class="tabcontent">
+    <div class="tabcontent-1">
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">gremlin&gt; g.V(<span class="string"><span class="delimiter">'</span><span class="content">A</span><span class="delimiter">'</span></span>).repeat(optional(out())).times(<span class="integer">5</span>)
+==&gt;v[F]</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+  <div class="tabcontent">
+    <div class="tabcontent-2">
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">g.V(<span class="string"><span class="delimiter">'</span><span class="content">A</span><span class="delimiter">'</span></span>).repeat(optional(out())).times(<span class="integer">5</span>)</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
+<div class="paragraph">
+<p>Each of these patterns can be combined with any variety of other steps to satisfy more complex traversal requirements.
+For example, we can first use a more traditional <code>repeat()</code> loop to start at vertex A, traverse all <code>both()</code>
+edges two times, and then traverse <code>out()</code> edges up to five times.</p>
+</div>
+<section class="tabs tabs-2">
+  <input id="tab-1608867120-15" type="radio" name="radio-set-1608867120-15" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608867120-15" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608867120-16" type="radio" name="radio-set-1608867120-15" class="tab-selector-2" />
+  <label for="tab-1608867120-16" class="tab-label-2">groovy</label>
+  <div class="tabcontent">
+    <div class="tabcontent-1">
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">gremlin&gt; g.V(<span class="string"><span class="delimiter">'</span><span class="content">A</span><span class="delimiter">'</span></span>).repeat(both()).times(<span class="integer">2</span>).repeat(optional(out())).times(<span class="integer">5</span>)
+==&gt;v[F]
+==&gt;v[F]</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+  <div class="tabcontent">
+    <div class="tabcontent-2">
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">g.V(<span class="string"><span class="delimiter">'</span><span class="content">A</span><span class="delimiter">'</span></span>).repeat(both()).times(<span class="integer">2</span>).repeat(optional(out())).times(<span class="integer">5</span>)</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
+</div>
+</div>
+</div>
+<div class="sect1">
+<h2 id="operating-on-dropped-elements">Operating on Dropped Elements</h2>
+<div class="sectionbody">
+<div class="paragraph">
+<p>One common scenario that happens when dropping elements using a traversal is the desire to perform
+some sort of operation on the elements being removed.  This simplest is returning
+the number of elements being dropped from the traversal, which is shown in the example below from the
+"modern" graph.</p>
+</div>
+<section class="tabs tabs-2">
+  <input id="tab-1608868759-1" type="radio" name="radio-set-1608868759-1" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608868759-1" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608868759-2" type="radio" name="radio-set-1608868759-1" class="tab-selector-2" />
+  <label for="tab-1608868759-2" class="tab-label-2">groovy</label>
+  <div class="tabcontent">
+    <div class="tabcontent-1">
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">gremlin&gt; g.V().has(<span class="string"><span class="delimiter">'</span><span class="content">lang</span><span class="delimiter">'</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">java</span><span class="delimiter">'</span></span>).sideEffect(drop()).count()
+==&gt;<span class="integer">2</span></code></pre>
+</div>
+</div>
+    </div>
+  </div>
+  <div class="tabcontent">
+    <div class="tabcontent-2">
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">g.V().has(<span class="string"><span class="delimiter">'</span><span class="content">lang</span><span class="delimiter">'</span></span>, <span class="string"><span class="delimiter">'</span><span class="content">java</span><span class="delimiter">'</span></span>).sideEffect(drop()).count()</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
+<div class="paragraph">
+<p>While this may seem a bit counterintuitive, what is occurring in this recipe is that the <code>sideEffect()</code>
+step is performing the <code>drop()</code> while each of the input traverser is still passed along to the remainder
+of the traversal, which in this case is a <code>count()</code> operation.  This pattern can be extended beyond a
+simple count to perform a variety of more complex traversals based on the dropped traversal such as
+removing child nodes in the case of a tree or setting properties on adjacent vertices.</p>
+</div>
+<div class="admonitionblock warning">
+<table>
+<tr>
+<td class="icon">
+<div class="title">Warning</div>
+</td>
+<td class="content">
+Some graph implementations may not behave in the same manner as TinkerGraph when using
+side effects, such as the <code>sideEffect(drop())</code>.  While the specified pattern works for TinkerGraph, we
+recommend that this pattern be tested on your chosen implementation to ensure that it functions in the
+same manner.
+</td>
+</tr>
+</table>
+</div>
+</div>
+</div>
+<div class="sect1">
 <h2 id="pagination">Pagination</h2>
 <div class="sectionbody">
 <div class="paragraph">
@@ -4133,10 +4531,10 @@ second ten records and so on, until pote
 <p>In Gremlin, a basic approach to paging would look something like the following:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652792-1" type="radio" name="radio-set-1599652792-1" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652792-1" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652792-2" type="radio" name="radio-set-1599652792-1" class="tab-selector-2" />
-  <label for="tab-1599652792-2" class="tab-label-2">groovy</label>
+  <input id="tab-1608869094-1" type="radio" name="radio-set-1608869094-1" class="tab-selector-1" checked="checked" />
+  <label for="tab-1608869094-1" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1608869094-2" type="radio" name="radio-set-1608869094-1" class="tab-selector-2" />
+  <label for="tab-1608869094-2" class="tab-label-2">groovy</label>
   <div class="tabcontent">
     <div class="tabcontent-1">
 <div class="listingblock">
@@ -4202,10 +4600,10 @@ to getting a total count without doing a
 removed then the traversals become more simple:</p>
 </div>
 <section class="tabs tabs-2">
-  <input id="tab-1599652792-3" type="radio" name="radio-set-1599652792-3" class="tab-selector-1" checked="checked" />
-  <label for="tab-1599652792-3" class="tab-label-1">console (groovy)</label>
-  <input id="tab-1599652792-4" type="radio" name="radio-set-1599652792-3" class="tab-selector-2" />
-  <label for="tab-1599652792-4" class="tab-label-2">groovy</label>

[... 1296 lines stripped ...]