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 2018/10/12 12:19:01 UTC

svn commit: r1843656 [6/50] - in /tinkerpop/site: docs/3.3.4-SNAPSHOT/ docs/3.3.4-SNAPSHOT/dev/developer/ docs/3.3.4-SNAPSHOT/dev/future/ docs/3.3.4-SNAPSHOT/dev/io/ docs/3.3.4-SNAPSHOT/dev/provider/ docs/3.3.4-SNAPSHOT/images/ docs/3.3.4-SNAPSHOT/logs...

Modified: tinkerpop/site/docs/3.3.4-SNAPSHOT/tutorials/the-gremlin-console/index.html
URL: http://svn.apache.org/viewvc/tinkerpop/site/docs/3.3.4-SNAPSHOT/tutorials/the-gremlin-console/index.html?rev=1843656&r1=1843655&r2=1843656&view=diff
==============================================================================
--- tinkerpop/site/docs/3.3.4-SNAPSHOT/tutorials/the-gremlin-console/index.html (original)
+++ tinkerpop/site/docs/3.3.4-SNAPSHOT/tutorials/the-gremlin-console/index.html Fri Oct 12 12:18:57 2018
@@ -701,6 +701,7 @@ table.tableblock.grid-all th.tableblock,
 #footer { background-color: #465158; padding: 2em; }
 
 #footer-text { color: #eee; font-size: 0.8em; text-align: center; }
+.tabs{position:relative;margin:40px auto;width:1024px;max-width:100%;overflow:hidden;padding-top:10px;margin-bottom:60px}.tabs input{position:absolute;z-index:1000;height:50px;left:0;top:0;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";filter:alpha(opacity=0);cursor:pointer;margin:0}.tabs input:hover+label{background:#e08f24}.tabs label{background:#e9ffe9;color:#1a1a1a;font-size:15px;line-height:50px;height:60px;position:relative;top:0;padding:0 20px;float:left;display:block;letter-spacing:1px;text-transform:uppercase;font-weight:bold;text-align:center;box-shadow:2px 0 2px rgba(0,0,0,0.1),-2px 0 2px rgba(0,0,0,0.1);box-sizing:border-box;-webkit-transition:all 150ms ease 0s;transition:all 150ms ease 0s}.tabs label:hover{cursor:pointer}.tabs label:after{content:'';background:#609060;position:absolute;bottom:-2px;left:0;width:100%;height:2px;display:block}.tabs-2 input{width:50%}.tabs-2 input.tab-selector-1{left:0%}.tabs-2 input.tab-selector-2{left:50%}.tabs-
 2 label{width:50%}.tabs-3 input{width:33.33333%}.tabs-3 input.tab-selector-1{left:0%}.tabs-3 input.tab-selector-2{left:33.33333%}.tabs-3 input.tab-selector-3{left:66.66667%}.tabs-3 label{width:33.33333%}.tabs-4 input{width:25%}.tabs-4 input.tab-selector-1{left:0%}.tabs-4 input.tab-selector-2{left:25%}.tabs-4 input.tab-selector-3{left:50%}.tabs-4 input.tab-selector-4{left:75%}.tabs-4 label{width:25%}.tabs label:first-of-type{z-index:4}.tab-label-2{z-index:4}.tab-label-3{z-index:3}.tab-label-4{z-index:2}.tabs input:checked+label{background:#609060;color:#fefefe;z-index:6}.clear-shadow{clear:both}.tabcontent{height:auto;width:100%;float:left;position:relative;z-index:5;background:#eee;top:-10px;box-sizing:border-box}.tabcontent>div{position:relative;float:left;width:0;height:0;box-sizing:border-box;top:0;left:0;z-index:1;opacity:0;background:#eee}.tabcontent .CodeRay{background-color:#fefefe}.tabs .tab-selector-1:checked ~ .tabcontent .tabcontent-1{z-index:100;-ms-filter:"progid:DXImag
 eTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);opacity:1;width:100%;height:auto;width:100%;height:auto;padding-top:30px}.tabs .tab-selector-2:checked ~ .tabcontent .tabcontent-2{z-index:100;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);opacity:1;width:100%;height:auto;width:100%;height:auto;padding-top:30px}.tabs .tab-selector-3:checked ~ .tabcontent .tabcontent-3{z-index:100;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);opacity:1;width:100%;height:auto;width:100%;height:auto;padding-top:30px}.tabs .tab-selector-4:checked ~ .tabcontent .tabcontent-4{z-index:100;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)";filter:alpha(opacity=100);opacity:1;width:100%;height:auto;width:100%;height:auto;padding-top:30px}
 
 .invisible {color: rgba(0,0,0,0); font-size: 0;}
 </style>
@@ -918,6 +919,13 @@ faster you can advance your knowledge.</
 graph database that is easy to use and does not have a lot of configuration options to be concerned with. You can
 create an empty TinkerGraph as follows:</p>
 </div>
+<section class="tabs tabs-2">
+  <input id="tab-1539344439-1" type="radio" name="radio-set-1539344439-1" class="tab-selector-1" checked="checked" />
+  <label for="tab-1539344439-1" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1539344439-2" type="radio" name="radio-set-1539344439-1" class="tab-selector-2" />
+  <label for="tab-1539344439-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; graph = TinkerGraph.open() <span class="invisible">//</span><b class="conum">1</b><span class="invisible">\</span>
@@ -926,6 +934,19 @@ gremlin&gt; g = graph.traversal() <span
 ==&gt;graphtraversalsource[tinkergraph[<span class="key">vertices</span>:<span class="integer">0</span> <span class="key">edges</span>:<span class="integer">0</span>], standard]</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">graph = TinkerGraph.open() <span class="invisible">//</span><b class="conum">1</b><span class="invisible">\</span>
+g = graph.traversal()        <span class="invisible">//</span><b class="conum">2</b></code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
 <div class="colist arabic">
 <ol>
 <li>
@@ -976,6 +997,13 @@ labels are defined and the "weight" edge
 </li>
 </ul>
 </div>
+<section class="tabs tabs-2">
+  <input id="tab-1539344439-3" type="radio" name="radio-set-1539344439-3" class="tab-selector-1" checked="checked" />
+  <label for="tab-1539344439-3" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1539344439-4" type="radio" name="radio-set-1539344439-3" class="tab-selector-2" />
+  <label for="tab-1539344439-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; graph = TinkerFactory.createModern()
@@ -984,6 +1012,19 @@ gremlin&gt; g = graph.traversal()
 ==&gt;graphtraversalsource[tinkergraph[<span class="key">vertices</span>:<span class="integer">6</span> <span class="key">edges</span>:<span class="integer">6</span>], standard]</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">graph = TinkerFactory.createModern()
+g = graph.traversal()</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
 <div class="paragraph">
 <p><span class="image" style="float: right"><img src="../../images/grateful-gremlin.png" alt="grateful gremlin" width="110"></span> As you might have noticed from the diagrams of these graphs or from
 the output of the Gremlin Console itself, these toy graphs are small (only a few vertices and edges each). It is nice
@@ -992,15 +1033,34 @@ though these graphs are "small", they ar
 However, if you find that a larger graph might be helpful, there is another option: The Grateful Dead
 (<a href="http://tinkerpop.apache.org/docs/3.3.4-SNAPSHOT/images/grateful-dead-schema.png">schema</a>).</p>
 </div>
+<section class="tabs tabs-2">
+  <input id="tab-1539344439-5" type="radio" name="radio-set-1539344439-5" class="tab-selector-1" checked="checked" />
+  <label for="tab-1539344439-5" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1539344439-6" type="radio" name="radio-set-1539344439-5" class="tab-selector-2" />
+  <label for="tab-1539344439-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; graph = TinkerGraph.open()
-==&gt;tinkergraph[<span class="key">vertices</span>:<span class="integer">0</span> <span class="key">edges</span>:<span class="integer">0</span>]
-gremlin&gt; graph.io(gryo()).readGraph(<span class="string"><span class="delimiter">'</span><span class="content">data/grateful-dead.kryo</span><span class="delimiter">'</span></span>)
-gremlin&gt; graph
-==&gt;tinkergraph[<span class="key">vertices</span>:<span class="integer">808</span> <span class="key">edges</span>:<span class="integer">8049</span>]</code></pre>
+<pre class="CodeRay highlight"><code data-lang="groovy">gremlin&gt; graph = TinkerFactory.createGratefulDead()
+==&gt;tinkergraph[<span class="key">vertices</span>:<span class="integer">808</span> <span class="key">edges</span>:<span class="integer">8049</span>]
+gremlin&gt; g = graph.traversal()
+==&gt;graphtraversalsource[tinkergraph[<span class="key">vertices</span>:<span class="integer">808</span> <span class="key">edges</span>:<span class="integer">8049</span>], standard]</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">graph = TinkerFactory.createGratefulDead()
+g = graph.traversal()</code></pre>
 </div>
 </div>
+    </div>
+  </div>
+</section>
 <div class="paragraph">
 <p>The Grateful Dead graph ships with the Gremlin Console and the data can be found in several formats (along with the
 other toy graphs previously mentioned) in the console&#8217;s <code>data</code> directory.</p>
@@ -1030,6 +1090,13 @@ console works or performing a particular
 <a href="http://tinkerpop.apache.org/docs/3.3.4-SNAPSHOT/reference/#_console_commands">reference documentation</a>, but they can also
 be accessed within the console itself with the <code>:help</code> command.</p>
 </div>
+<section class="tabs tabs-2">
+  <input id="tab-1539344439-7" type="radio" name="radio-set-1539344439-7" class="tab-selector-1" checked="checked" />
+  <label for="tab-1539344439-7" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1539344439-8" type="radio" name="radio-set-1539344439-7" class="tab-selector-2" />
+  <label for="tab-1539344439-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; :help
@@ -1068,11 +1135,30 @@ For help on a specific command <span cla
     :help command</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">:help</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
 <div class="paragraph">
 <p>The <code>:help</code> command shows a list of all the commands registered to the console and as this console is based on the
 <a href="http://www.groovy-lang.org/groovysh.html">Groovy Shell</a>, you will see commands that are inherited from there in
 addition to the ones provided by TinkerPop. You can also request help on a specific command:</p>
 </div>
+<section class="tabs tabs-2">
+  <input id="tab-1539344439-9" type="radio" name="radio-set-1539344439-9" class="tab-selector-1" checked="checked" />
+  <label for="tab-1539344439-9" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1539344439-10" type="radio" name="radio-set-1539344439-9" class="tab-selector-2" />
+  <label for="tab-1539344439-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; :help :remote
@@ -1082,6 +1168,18 @@ addition to the ones provided by TinkerP
 Define and manage remote connections to use <span class="keyword">in</span> conjunction with the :submit command, which will send Gremlin scripts to the specified remote agent <span class="keyword">for</span> processing.</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">:help :remote</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
 <div class="paragraph">
 <p>The Gremlin Console can also provide you with code help via auto-complete functionality. Use the <code>&lt;TAB&gt;</code> key to
 trigger a search of possible method names that might complete what you&#8217;ve typed to that point.</p>
@@ -1195,6 +1293,13 @@ key, which only has one vertex associate
 <p>As you have the Gremlin Console open you decide to debug the problem there.  You copy your Gremlin code from
 the IDE and execute it in the console and confirm the failure:</p>
 </div>
+<section class="tabs tabs-2">
+  <input id="tab-1539344439-11" type="radio" name="radio-set-1539344439-11" class="tab-selector-1" checked="checked" />
+  <label for="tab-1539344439-11" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1539344439-12" type="radio" name="radio-set-1539344439-11" class="tab-selector-2" />
+  <label for="tab-1539344439-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="integer">1</span>).outE().
@@ -1204,6 +1309,21 @@ the IDE and execute it in the console an
 ==&gt;[<span class="key">created</span>:v[<span class="integer">3</span>],<span class="key">knows</span>:v[<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.V(<span class="integer">1</span>).outE().
+  group().
+    by(label).
+    by(inV())</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
 <div class="paragraph">
 <p>Note that <code>next()</code> is removed here. The Gremlin Console automatically tries to iterate all results from a line of
 execution. In the above case, that line returns a <code>Traversal</code>.  A <code>Traversal</code> is an <code>Iterator</code> and when the console
@@ -1212,6 +1332,13 @@ detects that type it steps through each
 <div class="paragraph">
 <p>Trying it with the use of <code>next()</code> produces the following:</p>
 </div>
+<section class="tabs tabs-2">
+  <input id="tab-1539344439-13" type="radio" name="radio-set-1539344439-13" class="tab-selector-1" checked="checked" />
+  <label for="tab-1539344439-13" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1539344439-14" type="radio" name="radio-set-1539344439-13" class="tab-selector-2" />
+  <label for="tab-1539344439-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="integer">1</span>).outE().
@@ -1222,12 +1349,34 @@ detects that type it steps through each
 ==&gt;knows=v[<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.V(<span class="integer">1</span>).outE().
+  group().
+    by(label).
+    by(inV()).next()</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
 <div class="paragraph">
 <p>In this case, the line of execution does not return a <code>Traversal</code>.  It returns the first item in the <code>Traversal</code> with
 the call to <code>next()</code>.  This first item is a <code>Map</code>.  When the console detects that it is a <code>Map</code>, it iterates the
 <code>entrySet()</code> and prints each <code>Map.Entry</code> to the screen. It is possible to "prevent" auto-iteration, which is useful
 when you want to work with a <code>Traversal</code> as a variable. You can do this with a clever use of a semi-colon:</p>
 </div>
+<section class="tabs tabs-2">
+  <input id="tab-1539344439-15" type="radio" name="radio-set-1539344439-15" class="tab-selector-1" checked="checked" />
+  <label for="tab-1539344439-15" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1539344439-16" type="radio" name="radio-set-1539344439-15" class="tab-selector-2" />
+  <label for="tab-1539344439-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; t = g.V(<span class="integer">1</span>).outE().
@@ -1239,6 +1388,22 @@ gremlin&gt; t.next()
 ==&gt;knows=v[<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">t = g.V(<span class="integer">1</span>).outE().
+      group().
+        by(label).
+        by(inV());<span class="predefined-constant">null</span>
+t.next()</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
 <div class="admonitionblock tip">
 <table>
 <tr>
@@ -1287,6 +1452,13 @@ script.  It only iterates the result of
 benefit, and as such, <code>inV()</code> only has <code>next()</code> called upon it pulling a single vertex from the "knows" edges. You
 can remedy that by adding <code>fold()</code> to <code>inV()</code> as follows:</p>
 </div>
+<section class="tabs tabs-2">
+  <input id="tab-1539344439-17" type="radio" name="radio-set-1539344439-17" class="tab-selector-1" checked="checked" />
+  <label for="tab-1539344439-17" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1539344439-18" type="radio" name="radio-set-1539344439-17" class="tab-selector-2" />
+  <label for="tab-1539344439-18" 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="integer">1</span>).outE().
@@ -1297,6 +1469,21 @@ can remedy that by adding <code>fold()</
 ==&gt;knows=[v[<span class="integer">2</span>], v[<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.V(<span class="integer">1</span>).outE().
+  group().
+    by(label).
+    by(inV().fold()).next()</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
 <div class="paragraph">
 <p>You can now see that your result is as expected and you can modify your Java class to reflect the change:</p>
 </div>
@@ -1326,6 +1513,13 @@ can remedy that by adding <code>fold()</
 <p>Result iteration represents the most common "simple" bug that users encounter. It&#8217;s all too easy to write a traversal
 as follows:</p>
 </div>
+<section class="tabs tabs-2">
+  <input id="tab-1539344439-19" type="radio" name="radio-set-1539344439-19" class="tab-selector-1" checked="checked" />
+  <label for="tab-1539344439-19" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1539344439-20" type="radio" name="radio-set-1539344439-19" class="tab-selector-2" />
+  <label for="tab-1539344439-20" 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">name</span><span class="delimiter">'</span></span>,<span class="string"><span class="delimiter">'</span><span class="content">marko</span><span class="delimiter">'</span></span>).drop()
@@ -1333,6 +1527,19 @@ gremlin&gt; g.V().has(<span class="strin
 ==&gt;<span class="integer">0</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">name</span><span class="delimiter">'</span></span>,<span class="string"><span class="delimiter">'</span><span class="content">marko</span><span class="delimiter">'</span></span>).drop()
+g.V().has(<span class="string"><span class="delimiter">'</span><span class="content">name</span><span class="delimiter">'</span></span>,<span class="string"><span class="delimiter">'</span><span class="content">marko</span><span class="delimiter">'</span></span>).count()</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
 <div class="paragraph">
 <p>As you can see, the first traversal removes vertices with the "name" field of "marko" and the second traversal verifies
 that there are no vertices named "marko" after the first is executed.  After seeing success like that in the console,
@@ -1353,7 +1560,7 @@ it is all too tempting to copy and paste
 </div>
 <div class="paragraph">
 <p>Of course, this won&#8217;t work and you will likely be left wondering why your unit test for "removeByName" is failing, but
-the identical line of code in the console is doing what is expected.  The <code>drop()</code> step is not some special form
+the identical line of code in the console is doing what is expected.  The <code>drop()</code>-step is not some special form
 of terminating step that iterates the traversal - it is just one more step that vertices will pass through.  Outside
 of the console you must add <code>iterate()</code> as follows:</p>
 </div>
@@ -1404,6 +1611,13 @@ classes and functions available at the p
 analysis on where people live and when they lived there. You decide to start simple and just get a basic feeling for
 the data of the "person" vertices in the graph:</p>
 </div>
+<section class="tabs tabs-2">
+  <input id="tab-1539344439-21" type="radio" name="radio-set-1539344439-21" class="tab-selector-1" checked="checked" />
+  <label for="tab-1539344439-21" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1539344439-22" type="radio" name="radio-set-1539344439-21" class="tab-selector-2" />
+  <label for="tab-1539344439-22" 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; graph = TinkerFactory.createTheCrew()
@@ -1418,12 +1632,34 @@ gremlin&gt; g.V().hasLabel(<span class="
 ==&gt;[<span class="key">name</span>:[daniel],<span class="key">location</span>:[spremberg,kaiserslautern,aachen]]</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">graph = TinkerFactory.createTheCrew()
+g = graph.traversal()
+
+g.V().hasLabel(<span class="string"><span class="delimiter">'</span><span class="content">person</span><span class="delimiter">'</span></span>).valueMap()</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
 <div class="paragraph">
 <p>You can see from the output above that there are four "person" vertices and each has a "name" property and a "location"
 property.  The "location" is actually a <a href="http://tinkerpop.apache.org/docs/3.3.4-SNAPSHOT/reference/#vertex-properties">multi-property</a>,
 where "location" does not have one value, but several. If you look a bit closer you can also see that each "location"
 has <a href="http://tinkerpop.apache.org/docs/3.3.4-SNAPSHOT/reference/#vertex-properties">meta-properties</a> as well:</p>
 </div>
+<section class="tabs tabs-2">
+  <input id="tab-1539344439-23" type="radio" name="radio-set-1539344439-23" class="tab-selector-1" checked="checked" />
+  <label for="tab-1539344439-23" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1539344439-24" type="radio" name="radio-set-1539344439-23" class="tab-selector-2" />
+  <label for="tab-1539344439-24" 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().hasLabel(<span class="string"><span class="delimiter">'</span><span class="content">person</span><span class="delimiter">'</span></span>).as(<span class="string"><span class="delimiter">'</span><span class="content">person</span><span class="delimiter">'</span></span>).
@@ -1445,6 +1681,20 @@ has <a href="http://tinkerpop.apache.org
 ==&gt;[<span class="key">person</span>:daniel,<span class="key">location</span>:[<span class="key">startTime</span>:<span class="integer">2009</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().hasLabel(<span class="string"><span class="delimiter">'</span><span class="content">person</span><span class="delimiter">'</span></span>).as(<span class="string"><span class="delimiter">'</span><span class="content">person</span><span class="delimiter">'</span></span>).
+      properties(<span class="string"><span class="delimiter">'</span><span class="content">location</span><span class="delimiter">'</span></span>).as(<span class="string"><span class="delimiter">'</span><span class="content">location</span><span class="delimiter">'</span></span>).
+      select(<span class="string"><span class="delimiter">'</span><span class="content">person</span><span class="delimiter">'</span></span>,<span class="string"><span class="delimiter">'</span><span class="content">location</span><span class="delimiter">'</span></span>).by(<span class="string"><span class="delimiter">'</span><span class="content">name</span><span class="delimiter">'</span></span>).by(valueMap())</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
 <div class="paragraph">
 <p>You are pleased.  You like that you have the basic data present to achieve your goal, but you see a couple of problems.
 First, given a quick glance at the data, you can see that the data doesn&#8217;t uniformly start at a particular time.
@@ -1461,6 +1711,13 @@ data in two separate traversals and the
 <p>As a first step to solving your problems, you first need to determine the earliest "startTime" that is common to all
 the "person" vertices, as this will be the main filter for the data you intend to retrieve:</p>
 </div>
+<section class="tabs tabs-2">
+  <input id="tab-1539344439-25" type="radio" name="radio-set-1539344439-25" class="tab-selector-1" checked="checked" />
+  <label for="tab-1539344439-25" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1539344439-26" type="radio" name="radio-set-1539344439-25" class="tab-selector-2" />
+  <label for="tab-1539344439-26" 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; firstYear = g.V().hasLabel(<span class="string"><span class="delimiter">'</span><span class="content">person</span><span class="delimiter">'</span></span>).
@@ -1469,6 +1726,20 @@ the "person" vertices, as this will be t
 ==&gt;<span class="integer">2004</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">firstYear = g.V().hasLabel(<span class="string"><span class="delimiter">'</span><span class="content">person</span><span class="delimiter">'</span></span>).
+                  local(properties(<span class="string"><span class="delimiter">'</span><span class="content">location</span><span class="delimiter">'</span></span>).values(<span class="string"><span class="delimiter">'</span><span class="content">startTime</span><span class="delimiter">'</span></span>).min()).
+                  max().next()</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
 <div class="paragraph">
 <p>You store that result in a variable called "firstYear", as you will need that later to help filter results in the
 traversal that ultimately gets the data. In this way, all "person" vertices can be compared from the same start time.
@@ -1495,6 +1766,13 @@ settings in <code>bin/gremlin.sh</code>
 <div class="paragraph">
 <p>In an attempt to test things out, you take a naive approach at the traversal with your filter for "firstYear" applied:</p>
 </div>
+<section class="tabs tabs-2">
+  <input id="tab-1539344439-27" type="radio" name="radio-set-1539344439-27" class="tab-selector-1" checked="checked" />
+  <label for="tab-1539344439-27" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1539344439-28" type="radio" name="radio-set-1539344439-27" class="tab-selector-2" />
+  <label for="tab-1539344439-28" 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; firstYear = g.V().hasLabel(<span class="string"><span class="delimiter">'</span><span class="content">person</span><span class="delimiter">'</span></span>).
@@ -1518,12 +1796,37 @@ gremlin&gt; l = g.V().hasLabel(<span cla
 ==&gt;[<span class="key">person</span>:daniel,<span class="key">location</span>:aachen,<span class="key">times</span>:[<span class="key">startTime</span>:<span class="integer">2009</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">firstYear = g.V().hasLabel(<span class="string"><span class="delimiter">'</span><span class="content">person</span><span class="delimiter">'</span></span>).
+                  local(properties(<span class="string"><span class="delimiter">'</span><span class="content">location</span><span class="delimiter">'</span></span>).values(<span class="string"><span class="delimiter">'</span><span class="content">startTime</span><span class="delimiter">'</span></span>).min()).
+                  max().next()
+l = g.V().hasLabel(<span class="string"><span class="delimiter">'</span><span class="content">person</span><span class="delimiter">'</span></span>).as(<span class="string"><span class="delimiter">'</span><span class="content">person</span><span class="delimiter">'</span></span>).
+          properties(<span class="string"><span class="delimiter">'</span><span class="content">location</span><span class="delimiter">'</span></span>).or(has(<span class="string"><span class="delimiter">'</span><span class="content">endTime</span><span class="delimiter">'</span></span>,gt(firstYear)),hasNot(<span class="string"><span class="delimiter">'</span><span class="content">endTime</span><span class="delimiter">'</span></span>)).as(<span class="string"><span class="delimiter">'</span><span class="content">location</span><span class="delimiter">'</span></span>).
+          valueMap().as(<span class="string"><span class="delimiter">'</span><span class="content">times</span><span class="delimiter">'</span></span>).
+          select(<span class="string"><span class="delimiter">'</span><span class="content">person</span><span class="delimiter">'</span></span>,<span class="string"><span class="delimiter">'</span><span class="content">location</span><span class="delimiter">'</span></span>,<span class="string"><span class="delimiter">'</span><span class="content">times</span><span class="delimiter">'</span></span>).by(<span class="string"><span class="delimiter">'</span><span class="content">name</span><span class="delimiter">'</span></span>).by(value).by().toList()</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
 <div class="paragraph">
 <p>As you scan through the data, you can see that it appears to cover the range of time you were looking for. Of course,
 you still have the problem of the format of the data. Recalling that the Gremlin Console is an extension of the Groovy
 Console, you decide to just process "l" with some Groovy syntax to coerce it into the format that you would like to
 see for your rows and columns style output:</p>
 </div>
+<section class="tabs tabs-2">
+  <input id="tab-1539344439-29" type="radio" name="radio-set-1539344439-29" class="tab-selector-1" checked="checked" />
+  <label for="tab-1539344439-29" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1539344439-30" type="radio" name="radio-set-1539344439-29" class="tab-selector-2" />
+  <label for="tab-1539344439-30" 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; firstYear = g.V().hasLabel(<span class="string"><span class="delimiter">'</span><span class="content">person</span><span class="delimiter">'</span></span>).
@@ -1602,6 +1905,27 @@ gremlin&gt; l.collect{
 ==&gt;[<span class="key">person</span>:daniel,<span class="key">location</span>:aachen,<span class="key">year</span>:<span class="integer">2016</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">firstYear = g.V().hasLabel(<span class="string"><span class="delimiter">'</span><span class="content">person</span><span class="delimiter">'</span></span>).
+                  local(properties(<span class="string"><span class="delimiter">'</span><span class="content">location</span><span class="delimiter">'</span></span>).values(<span class="string"><span class="delimiter">'</span><span class="content">startTime</span><span class="delimiter">'</span></span>).min()).
+                  max().next()
+l = g.V().hasLabel(<span class="string"><span class="delimiter">'</span><span class="content">person</span><span class="delimiter">'</span></span>).as(<span class="string"><span class="delimiter">'</span><span class="content">person</span><span class="delimiter">'</span></span>).
+          properties(<span class="string"><span class="delimiter">'</span><span class="content">location</span><span class="delimiter">'</span></span>).or(has(<span class="string"><span class="delimiter">'</span><span class="content">endTime</span><span class="delimiter">'</span></span>,gt(firstYear)),hasNot(<span class="string"><span class="delimiter">'</span><span class="content">endTime</span><span class="delimiter">'</span></span>)).as(<span class="string"><span class="delimiter">'</span><span class="content">location</span><span class="delimiter">'</span></span>).
+          valueMap().as(<span class="string"><span class="delimiter">'</span><span class="content">times</span><span class="delimiter">'</span></span>).
+          select(<span class="string"><span class="delimiter">'</span><span class="content">person</span><span class="delimiter">'</span></span>,<span class="string"><span class="delimiter">'</span><span class="content">location</span><span class="delimiter">'</span></span>,<span class="string"><span class="delimiter">'</span><span class="content">times</span><span class="delimiter">'</span></span>).by(<span class="string"><span class="delimiter">'</span><span class="content">name</span><span class="delimiter">'</span></span>).by(value).by().toList()
+l.collect{
+  row-&gt;((<span class="predefined-type">Math</span>.max(row.times.startTime,firstYear))..((row.times.endTime?:<span class="integer">2017</span>)-<span class="integer">1</span>)).collect{
+    year-&gt;[<span class="key">person</span>:row.person,<span class="key">location</span>:row.location,<span class="key">year</span>:year]}}.flatten()</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
 <div class="paragraph">
 <p>You had to apply a bit of brute force, but now you have the rows and columns you wanted, with the data normalized and
 flattened in such a way that each year since "2004" is represented all the way up to "2016".</p>
@@ -1620,22 +1944,49 @@ using <code>java.time.Year</code>. This
 similar to what happens when you decide to use a particular class in a Java file.  You must "import" the classes that
 you wish to use. To do this, you need to use the <code>import</code> command:</p>
 </div>
+<section class="tabs tabs-2">
+  <input id="tab-1539344439-31" type="radio" name="radio-set-1539344439-31" class="tab-selector-1" checked="checked" />
+  <label for="tab-1539344439-31" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1539344439-32" type="radio" name="radio-set-1539344439-31" class="tab-selector-2" />
+  <label for="tab-1539344439-32" 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; <span class="keyword">import</span> <span class="include">java.time.Year</span>
-==&gt;org.apache.tinkerpop.gremlin.structure.*, org.apache.tinkerpop.gremlin.structure.util.*, org.apache.tinkerpop.gremlin.process.traversal.*, org.apache.tinkerpop.gremlin.process.traversal.step.*, org.apache.tinkerpop.gremlin.process.remote.*, org.apache.tinkerpop.gremlin.structure.util.empty.*, org.apache.tinkerpop.gremlin.structure.io.*, org.apache.tinkerpop.gremlin.structure.io.graphml.*, org.apache.tinkerpop.gremlin.structure.io.graphson.*, org.apache.tinkerpop.gremlin.structure.io.gryo.*, org.apache.commons.configuration.*, org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.*, org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.*, org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.*, org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.*, org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.*, org.apache.tinkerpop.gremlin.process.traversal.util.*, org.apache.tinkerpop.gremlin.process.computer.*, org.apach
 e.tinkerpop.gremlin.process.computer.bulkdumping.*, org.apache.tinkerpop.gremlin.process.computer.bulkloading.*, org.apache.tinkerpop.gremlin.process.computer.clustering.peerpressure.*, org.apache.tinkerpop.gremlin.process.computer.traversal.*, org.apache.tinkerpop.gremlin.process.computer.ranking.pagerank.*, org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.optimization.*, org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.*, org.apache.tinkerpop.gremlin.util.*, org.apache.tinkerpop.gremlin.util.iterator.*, org.apache.tinkerpop.gremlin.util.function.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.structure.io.IoCore.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.P.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.computer.Computer.*, <span class="directi
 ve">static</span> org.apache.tinkerpop.gremlin.util.TimeUtil.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.util.function.Lambda.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.SackFunctions.Barrier.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.structure.VertexProperty.Cardinality.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.structure.Column.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.structure.Direction.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.Operator.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.Order.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.Pop.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.Scope.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.stru
 cture.T.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent.Pick.*, org.apache.tinkerpop.gremlin.driver.*, org.apache.tinkerpop.gremlin.driver.exception.*, org.apache.tinkerpop.gremlin.driver.message.*, org.apache.tinkerpop.gremlin.driver.ser.*, org.apache.tinkerpop.gremlin.driver.remote.*, groovyx.gbench.*, groovyx.gprof.*, <span class="directive">static</span> groovyx.gprof.ProfileStaticExtension.*, org.apache.tinkerpop.gremlin.groovy.jsr223.dsl.credential.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.groovy.jsr223.dsl.credential.CredentialGraph.*, org.apache.hadoop.conf.*, org.apache.hadoop.hdfs.*, org.apache.hadoop.fs.*, org.apache.hadoop.util.*, org.apache.hadoop.io.*, org.apache.hadoop.io.compress.*, org.apache.hadoop.mapreduce.lib.input.*, org.apache.hadoop.mapreduce.lib.output.*, org.apache.tinkerpop.gremlin.hadoop.*, org.apache.tinkerpop.gremlin.hadoop.structure.*, org.apache.tinkerpop.gr
 emlin.hadoop.structure.util.*, org.apache.tinkerpop.gremlin.hadoop.structure.io.*, org.apache.tinkerpop.gremlin.hadoop.structure.io.graphson.*, org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.*, org.apache.tinkerpop.gremlin.hadoop.structure.io.script.*, org.apache.tinkerpop.gremlin.hadoop.process.computer.mapreduce.*, org.apache.tinkerpop.gremlin.giraph.process.computer.*, org.apache.tinkerpop.gremlin.neo4j.structure.*, org.apache.tinkerpop.gremlin.neo4j.process.traversal.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.neo4j.process.traversal.LabelP.*, org.apache.tinkerpop.gremlin.spark.process.computer.*, org.apache.tinkerpop.gremlin.spark.structure.*, org.apache.tinkerpop.gremlin.spark.structure.io.*, org.apache.tinkerpop.gremlin.tinkergraph.structure.*, org.apache.tinkerpop.gremlin.tinkergraph.process.computer.*, java.time.Year
+==&gt;org.apache.tinkerpop.gremlin.structure.*, org.apache.tinkerpop.gremlin.structure.util.*, org.apache.tinkerpop.gremlin.process.traversal.*, org.apache.tinkerpop.gremlin.process.traversal.step.*, org.apache.tinkerpop.gremlin.process.remote.*, org.apache.tinkerpop.gremlin.structure.util.empty.*, org.apache.tinkerpop.gremlin.structure.io.*, org.apache.tinkerpop.gremlin.structure.io.graphml.*, org.apache.tinkerpop.gremlin.structure.io.graphson.*, org.apache.tinkerpop.gremlin.structure.io.gryo.*, org.apache.commons.configuration.*, org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.*, org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.*, org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.*, org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.*, org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.*, org.apache.tinkerpop.gremlin.process.traversal.util.*, org.apache.tinkerpop.gremlin.process.computer.*, org.apach
 e.tinkerpop.gremlin.process.computer.clone.*, org.apache.tinkerpop.gremlin.process.computer.bulkdumping.*, org.apache.tinkerpop.gremlin.process.computer.bulkloading.*, org.apache.tinkerpop.gremlin.process.computer.clustering.peerpressure.*, org.apache.tinkerpop.gremlin.process.computer.traversal.*, org.apache.tinkerpop.gremlin.process.computer.ranking.pagerank.*, org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.optimization.*, org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.*, org.apache.tinkerpop.gremlin.util.*, org.apache.tinkerpop.gremlin.util.iterator.*, org.apache.tinkerpop.gremlin.util.function.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.structure.io.IoCore.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.P.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*, <span class="directive">static</span> org.apache.tinkerpop.gr
 emlin.process.computer.Computer.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.util.TimeUtil.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.util.function.Lambda.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.SackFunctions.Barrier.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.structure.VertexProperty.Cardinality.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.structure.Column.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.structure.Direction.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.Operator.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.Order.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.Pop.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.Scope.*, <span class="dir
 ective">static</span> org.apache.tinkerpop.gremlin.structure.T.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent.Pick.*, org.apache.tinkerpop.gremlin.driver.*, org.apache.tinkerpop.gremlin.driver.exception.*, org.apache.tinkerpop.gremlin.driver.message.*, org.apache.tinkerpop.gremlin.driver.ser.*, org.apache.tinkerpop.gremlin.driver.remote.*, groovyx.gbench.*, groovyx.gprof.*, <span class="directive">static</span> groovyx.gprof.ProfileStaticExtension.*, org.apache.tinkerpop.gremlin.groovy.jsr223.dsl.credential.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.groovy.jsr223.dsl.credential.CredentialGraph.*, org.apache.hadoop.conf.*, org.apache.hadoop.hdfs.*, org.apache.hadoop.fs.*, org.apache.hadoop.util.*, org.apache.hadoop.io.*, org.apache.hadoop.io.compress.*, org.apache.hadoop.mapreduce.lib.input.*, org.apache.hadoop.mapreduce.lib.output.*, org.apache.tinkerpop.gremlin.hadoop.*, org.apache.tinker
 pop.gremlin.hadoop.structure.*, org.apache.tinkerpop.gremlin.hadoop.structure.util.*, org.apache.tinkerpop.gremlin.hadoop.structure.io.*, org.apache.tinkerpop.gremlin.hadoop.structure.io.graphson.*, org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.*, org.apache.tinkerpop.gremlin.hadoop.structure.io.script.*, org.apache.tinkerpop.gremlin.hadoop.process.computer.mapreduce.*, org.apache.tinkerpop.gremlin.giraph.process.computer.*, org.apache.tinkerpop.gremlin.neo4j.structure.*, org.apache.tinkerpop.gremlin.neo4j.process.traversal.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.neo4j.process.traversal.LabelP.*, org.apache.tinkerpop.gremlin.spark.process.computer.*, org.apache.tinkerpop.gremlin.spark.structure.*, org.apache.tinkerpop.gremlin.spark.structure.io.*, org.apache.tinkerpop.gremlin.tinkergraph.structure.*, org.apache.tinkerpop.gremlin.tinkergraph.process.computer.*, java.time.Year
 gremlin&gt; Year.now()
 ==&gt;<span class="integer">2018</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"><span class="keyword">import</span> <span class="include">java.time.Year</span>
+Year.now()</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
 <div class="paragraph">
 <p>You can now use <code>Year</code> with the <a href="http://tinkerpop.apache.org/docs/3.3.4-SNAPSHOT/reference/#constant-step">constant()</a> step,
 to produce the set of years to have for each person up to the current year:</p>
 </div>
+<section class="tabs tabs-2">
+  <input id="tab-1539344439-33" type="radio" name="radio-set-1539344439-33" class="tab-selector-1" checked="checked" />
+  <label for="tab-1539344439-33" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1539344439-34" type="radio" name="radio-set-1539344439-33" class="tab-selector-2" />
+  <label for="tab-1539344439-34" 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; <span class="keyword">import</span> <span class="include">java.time.Year</span>
-==&gt;org.apache.tinkerpop.gremlin.structure.*, org.apache.tinkerpop.gremlin.structure.util.*, org.apache.tinkerpop.gremlin.process.traversal.*, org.apache.tinkerpop.gremlin.process.traversal.step.*, org.apache.tinkerpop.gremlin.process.remote.*, org.apache.tinkerpop.gremlin.structure.util.empty.*, org.apache.tinkerpop.gremlin.structure.io.*, org.apache.tinkerpop.gremlin.structure.io.graphml.*, org.apache.tinkerpop.gremlin.structure.io.graphson.*, org.apache.tinkerpop.gremlin.structure.io.gryo.*, org.apache.commons.configuration.*, org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.*, org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.*, org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.*, org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.*, org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.*, org.apache.tinkerpop.gremlin.process.traversal.util.*, org.apache.tinkerpop.gremlin.process.computer.*, org.apach
 e.tinkerpop.gremlin.process.computer.bulkdumping.*, org.apache.tinkerpop.gremlin.process.computer.bulkloading.*, org.apache.tinkerpop.gremlin.process.computer.clustering.peerpressure.*, org.apache.tinkerpop.gremlin.process.computer.traversal.*, org.apache.tinkerpop.gremlin.process.computer.ranking.pagerank.*, org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.optimization.*, org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.*, org.apache.tinkerpop.gremlin.util.*, org.apache.tinkerpop.gremlin.util.iterator.*, org.apache.tinkerpop.gremlin.util.function.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.structure.io.IoCore.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.P.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.computer.Computer.*, <span class="directi
 ve">static</span> org.apache.tinkerpop.gremlin.util.TimeUtil.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.util.function.Lambda.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.SackFunctions.Barrier.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.structure.VertexProperty.Cardinality.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.structure.Column.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.structure.Direction.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.Operator.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.Order.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.Pop.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.Scope.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.stru
 cture.T.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent.Pick.*, org.apache.tinkerpop.gremlin.driver.*, org.apache.tinkerpop.gremlin.driver.exception.*, org.apache.tinkerpop.gremlin.driver.message.*, org.apache.tinkerpop.gremlin.driver.ser.*, org.apache.tinkerpop.gremlin.driver.remote.*, groovyx.gbench.*, groovyx.gprof.*, <span class="directive">static</span> groovyx.gprof.ProfileStaticExtension.*, org.apache.tinkerpop.gremlin.groovy.jsr223.dsl.credential.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.groovy.jsr223.dsl.credential.CredentialGraph.*, org.apache.hadoop.conf.*, org.apache.hadoop.hdfs.*, org.apache.hadoop.fs.*, org.apache.hadoop.util.*, org.apache.hadoop.io.*, org.apache.hadoop.io.compress.*, org.apache.hadoop.mapreduce.lib.input.*, org.apache.hadoop.mapreduce.lib.output.*, org.apache.tinkerpop.gremlin.hadoop.*, org.apache.tinkerpop.gremlin.hadoop.structure.*, org.apache.tinkerpop.gr
 emlin.hadoop.structure.util.*, org.apache.tinkerpop.gremlin.hadoop.structure.io.*, org.apache.tinkerpop.gremlin.hadoop.structure.io.graphson.*, org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.*, org.apache.tinkerpop.gremlin.hadoop.structure.io.script.*, org.apache.tinkerpop.gremlin.hadoop.process.computer.mapreduce.*, org.apache.tinkerpop.gremlin.giraph.process.computer.*, org.apache.tinkerpop.gremlin.neo4j.structure.*, org.apache.tinkerpop.gremlin.neo4j.process.traversal.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.neo4j.process.traversal.LabelP.*, org.apache.tinkerpop.gremlin.spark.process.computer.*, org.apache.tinkerpop.gremlin.spark.structure.*, org.apache.tinkerpop.gremlin.spark.structure.io.*, org.apache.tinkerpop.gremlin.tinkergraph.structure.*, org.apache.tinkerpop.gremlin.tinkergraph.process.computer.*, java.time.Year
+==&gt;org.apache.tinkerpop.gremlin.structure.*, org.apache.tinkerpop.gremlin.structure.util.*, org.apache.tinkerpop.gremlin.process.traversal.*, org.apache.tinkerpop.gremlin.process.traversal.step.*, org.apache.tinkerpop.gremlin.process.remote.*, org.apache.tinkerpop.gremlin.structure.util.empty.*, org.apache.tinkerpop.gremlin.structure.io.*, org.apache.tinkerpop.gremlin.structure.io.graphml.*, org.apache.tinkerpop.gremlin.structure.io.graphson.*, org.apache.tinkerpop.gremlin.structure.io.gryo.*, org.apache.commons.configuration.*, org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.*, org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.*, org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.*, org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.*, org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.*, org.apache.tinkerpop.gremlin.process.traversal.util.*, org.apache.tinkerpop.gremlin.process.computer.*, org.apach
 e.tinkerpop.gremlin.process.computer.clone.*, org.apache.tinkerpop.gremlin.process.computer.bulkdumping.*, org.apache.tinkerpop.gremlin.process.computer.bulkloading.*, org.apache.tinkerpop.gremlin.process.computer.clustering.peerpressure.*, org.apache.tinkerpop.gremlin.process.computer.traversal.*, org.apache.tinkerpop.gremlin.process.computer.ranking.pagerank.*, org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.optimization.*, org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.*, org.apache.tinkerpop.gremlin.util.*, org.apache.tinkerpop.gremlin.util.iterator.*, org.apache.tinkerpop.gremlin.util.function.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.structure.io.IoCore.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.P.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*, <span class="directive">static</span> org.apache.tinkerpop.gr
 emlin.process.computer.Computer.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.util.TimeUtil.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.util.function.Lambda.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.SackFunctions.Barrier.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.structure.VertexProperty.Cardinality.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.structure.Column.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.structure.Direction.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.Operator.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.Order.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.Pop.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.Scope.*, <span class="dir
 ective">static</span> org.apache.tinkerpop.gremlin.structure.T.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent.Pick.*, org.apache.tinkerpop.gremlin.driver.*, org.apache.tinkerpop.gremlin.driver.exception.*, org.apache.tinkerpop.gremlin.driver.message.*, org.apache.tinkerpop.gremlin.driver.ser.*, org.apache.tinkerpop.gremlin.driver.remote.*, groovyx.gbench.*, groovyx.gprof.*, <span class="directive">static</span> groovyx.gprof.ProfileStaticExtension.*, org.apache.tinkerpop.gremlin.groovy.jsr223.dsl.credential.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.groovy.jsr223.dsl.credential.CredentialGraph.*, org.apache.hadoop.conf.*, org.apache.hadoop.hdfs.*, org.apache.hadoop.fs.*, org.apache.hadoop.util.*, org.apache.hadoop.io.*, org.apache.hadoop.io.compress.*, org.apache.hadoop.mapreduce.lib.input.*, org.apache.hadoop.mapreduce.lib.output.*, org.apache.tinkerpop.gremlin.hadoop.*, org.apache.tinker
 pop.gremlin.hadoop.structure.*, org.apache.tinkerpop.gremlin.hadoop.structure.util.*, org.apache.tinkerpop.gremlin.hadoop.structure.io.*, org.apache.tinkerpop.gremlin.hadoop.structure.io.graphson.*, org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.*, org.apache.tinkerpop.gremlin.hadoop.structure.io.script.*, org.apache.tinkerpop.gremlin.hadoop.process.computer.mapreduce.*, org.apache.tinkerpop.gremlin.giraph.process.computer.*, org.apache.tinkerpop.gremlin.neo4j.structure.*, org.apache.tinkerpop.gremlin.neo4j.process.traversal.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.neo4j.process.traversal.LabelP.*, org.apache.tinkerpop.gremlin.spark.process.computer.*, org.apache.tinkerpop.gremlin.spark.structure.*, org.apache.tinkerpop.gremlin.spark.structure.io.*, org.apache.tinkerpop.gremlin.tinkergraph.structure.*, org.apache.tinkerpop.gremlin.tinkergraph.process.computer.*, java.time.Year
 gremlin&gt; firstYear = g.V().hasLabel(<span class="string"><span class="delimiter">'</span><span class="content">person</span><span class="delimiter">'</span></span>).
                            local(properties(<span class="string"><span class="delimiter">'</span><span class="content">location</span><span class="delimiter">'</span></span>).values(<span class="string"><span class="delimiter">'</span><span class="content">startTime</span><span class="delimiter">'</span></span>).min()).
                            max().next()
@@ -1705,13 +2056,38 @@ gremlin&gt; g.V().hasLabel(<span class="
 ==&gt;[<span class="key">person</span>:daniel,<span class="key">year</span>:<span class="integer">2018</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"><span class="keyword">import</span> <span class="include">java.time.Year</span>
+firstYear = g.V().hasLabel(<span class="string"><span class="delimiter">'</span><span class="content">person</span><span class="delimiter">'</span></span>).
+                  local(properties(<span class="string"><span class="delimiter">'</span><span class="content">location</span><span class="delimiter">'</span></span>).values(<span class="string"><span class="delimiter">'</span><span class="content">startTime</span><span class="delimiter">'</span></span>).min()).
+                  max().next()
+g.V().hasLabel(<span class="string"><span class="delimiter">&quot;</span><span class="content">person</span><span class="delimiter">&quot;</span></span>).as(<span class="string"><span class="delimiter">&quot;</span><span class="content">person</span><span class="delimiter">&quot;</span></span>).
+      constant((firstYear..(Year.now().value)).toList()).unfold().as(<span class="string"><span class="delimiter">&quot;</span><span class="content">year</span><span class="delimiter">&quot;</span></span>).
+      select(<span class="string"><span class="delimiter">'</span><span class="content">person</span><span class="delimiter">'</span></span>,<span class="string"><span class="delimiter">'</span><span class="content">year</span><span class="delimiter">'</span></span>).by(<span class="string"><span class="delimiter">'</span><span class="content">name</span><span class="delimiter">'</span></span>).by()</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
 <div class="paragraph">
 <p>From there you can build on that traversal to grab the "location" given the generated "year" for that data:</p>
 </div>
+<section class="tabs tabs-2">
+  <input id="tab-1539344439-35" type="radio" name="radio-set-1539344439-35" class="tab-selector-1" checked="checked" />
+  <label for="tab-1539344439-35" class="tab-label-1">console (groovy)</label>
+  <input id="tab-1539344439-36" type="radio" name="radio-set-1539344439-35" class="tab-selector-2" />
+  <label for="tab-1539344439-36" 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; <span class="keyword">import</span> <span class="include">java.time.Year</span>
-==&gt;org.apache.tinkerpop.gremlin.structure.*, org.apache.tinkerpop.gremlin.structure.util.*, org.apache.tinkerpop.gremlin.process.traversal.*, org.apache.tinkerpop.gremlin.process.traversal.step.*, org.apache.tinkerpop.gremlin.process.remote.*, org.apache.tinkerpop.gremlin.structure.util.empty.*, org.apache.tinkerpop.gremlin.structure.io.*, org.apache.tinkerpop.gremlin.structure.io.graphml.*, org.apache.tinkerpop.gremlin.structure.io.graphson.*, org.apache.tinkerpop.gremlin.structure.io.gryo.*, org.apache.commons.configuration.*, org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.*, org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.*, org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.*, org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.*, org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.*, org.apache.tinkerpop.gremlin.process.traversal.util.*, org.apache.tinkerpop.gremlin.process.computer.*, org.apach
 e.tinkerpop.gremlin.process.computer.bulkdumping.*, org.apache.tinkerpop.gremlin.process.computer.bulkloading.*, org.apache.tinkerpop.gremlin.process.computer.clustering.peerpressure.*, org.apache.tinkerpop.gremlin.process.computer.traversal.*, org.apache.tinkerpop.gremlin.process.computer.ranking.pagerank.*, org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.optimization.*, org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.*, org.apache.tinkerpop.gremlin.util.*, org.apache.tinkerpop.gremlin.util.iterator.*, org.apache.tinkerpop.gremlin.util.function.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.structure.io.IoCore.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.P.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.computer.Computer.*, <span class="directi
 ve">static</span> org.apache.tinkerpop.gremlin.util.TimeUtil.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.util.function.Lambda.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.SackFunctions.Barrier.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.structure.VertexProperty.Cardinality.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.structure.Column.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.structure.Direction.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.Operator.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.Order.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.Pop.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.Scope.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.stru
 cture.T.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent.Pick.*, org.apache.tinkerpop.gremlin.driver.*, org.apache.tinkerpop.gremlin.driver.exception.*, org.apache.tinkerpop.gremlin.driver.message.*, org.apache.tinkerpop.gremlin.driver.ser.*, org.apache.tinkerpop.gremlin.driver.remote.*, groovyx.gbench.*, groovyx.gprof.*, <span class="directive">static</span> groovyx.gprof.ProfileStaticExtension.*, org.apache.tinkerpop.gremlin.groovy.jsr223.dsl.credential.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.groovy.jsr223.dsl.credential.CredentialGraph.*, org.apache.hadoop.conf.*, org.apache.hadoop.hdfs.*, org.apache.hadoop.fs.*, org.apache.hadoop.util.*, org.apache.hadoop.io.*, org.apache.hadoop.io.compress.*, org.apache.hadoop.mapreduce.lib.input.*, org.apache.hadoop.mapreduce.lib.output.*, org.apache.tinkerpop.gremlin.hadoop.*, org.apache.tinkerpop.gremlin.hadoop.structure.*, org.apache.tinkerpop.gr
 emlin.hadoop.structure.util.*, org.apache.tinkerpop.gremlin.hadoop.structure.io.*, org.apache.tinkerpop.gremlin.hadoop.structure.io.graphson.*, org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.*, org.apache.tinkerpop.gremlin.hadoop.structure.io.script.*, org.apache.tinkerpop.gremlin.hadoop.process.computer.mapreduce.*, org.apache.tinkerpop.gremlin.giraph.process.computer.*, org.apache.tinkerpop.gremlin.neo4j.structure.*, org.apache.tinkerpop.gremlin.neo4j.process.traversal.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.neo4j.process.traversal.LabelP.*, org.apache.tinkerpop.gremlin.spark.process.computer.*, org.apache.tinkerpop.gremlin.spark.structure.*, org.apache.tinkerpop.gremlin.spark.structure.io.*, org.apache.tinkerpop.gremlin.tinkergraph.structure.*, org.apache.tinkerpop.gremlin.tinkergraph.process.computer.*, java.time.Year
+==&gt;org.apache.tinkerpop.gremlin.structure.*, org.apache.tinkerpop.gremlin.structure.util.*, org.apache.tinkerpop.gremlin.process.traversal.*, org.apache.tinkerpop.gremlin.process.traversal.step.*, org.apache.tinkerpop.gremlin.process.remote.*, org.apache.tinkerpop.gremlin.structure.util.empty.*, org.apache.tinkerpop.gremlin.structure.io.*, org.apache.tinkerpop.gremlin.structure.io.graphml.*, org.apache.tinkerpop.gremlin.structure.io.graphson.*, org.apache.tinkerpop.gremlin.structure.io.gryo.*, org.apache.commons.configuration.*, org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.*, org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.*, org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.*, org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.*, org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.*, org.apache.tinkerpop.gremlin.process.traversal.util.*, org.apache.tinkerpop.gremlin.process.computer.*, org.apach
 e.tinkerpop.gremlin.process.computer.clone.*, org.apache.tinkerpop.gremlin.process.computer.bulkdumping.*, org.apache.tinkerpop.gremlin.process.computer.bulkloading.*, org.apache.tinkerpop.gremlin.process.computer.clustering.peerpressure.*, org.apache.tinkerpop.gremlin.process.computer.traversal.*, org.apache.tinkerpop.gremlin.process.computer.ranking.pagerank.*, org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.optimization.*, org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.*, org.apache.tinkerpop.gremlin.util.*, org.apache.tinkerpop.gremlin.util.iterator.*, org.apache.tinkerpop.gremlin.util.function.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.structure.io.IoCore.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.P.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*, <span class="directive">static</span> org.apache.tinkerpop.gr
 emlin.process.computer.Computer.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.util.TimeUtil.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.util.function.Lambda.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.SackFunctions.Barrier.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.structure.VertexProperty.Cardinality.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.structure.Column.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.structure.Direction.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.Operator.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.Order.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.Pop.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.Scope.*, <span class="dir
 ective">static</span> org.apache.tinkerpop.gremlin.structure.T.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent.Pick.*, org.apache.tinkerpop.gremlin.driver.*, org.apache.tinkerpop.gremlin.driver.exception.*, org.apache.tinkerpop.gremlin.driver.message.*, org.apache.tinkerpop.gremlin.driver.ser.*, org.apache.tinkerpop.gremlin.driver.remote.*, groovyx.gbench.*, groovyx.gprof.*, <span class="directive">static</span> groovyx.gprof.ProfileStaticExtension.*, org.apache.tinkerpop.gremlin.groovy.jsr223.dsl.credential.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.groovy.jsr223.dsl.credential.CredentialGraph.*, org.apache.hadoop.conf.*, org.apache.hadoop.hdfs.*, org.apache.hadoop.fs.*, org.apache.hadoop.util.*, org.apache.hadoop.io.*, org.apache.hadoop.io.compress.*, org.apache.hadoop.mapreduce.lib.input.*, org.apache.hadoop.mapreduce.lib.output.*, org.apache.tinkerpop.gremlin.hadoop.*, org.apache.tinker
 pop.gremlin.hadoop.structure.*, org.apache.tinkerpop.gremlin.hadoop.structure.util.*, org.apache.tinkerpop.gremlin.hadoop.structure.io.*, org.apache.tinkerpop.gremlin.hadoop.structure.io.graphson.*, org.apache.tinkerpop.gremlin.hadoop.structure.io.gryo.*, org.apache.tinkerpop.gremlin.hadoop.structure.io.script.*, org.apache.tinkerpop.gremlin.hadoop.process.computer.mapreduce.*, org.apache.tinkerpop.gremlin.giraph.process.computer.*, org.apache.tinkerpop.gremlin.neo4j.structure.*, org.apache.tinkerpop.gremlin.neo4j.process.traversal.*, <span class="directive">static</span> org.apache.tinkerpop.gremlin.neo4j.process.traversal.LabelP.*, org.apache.tinkerpop.gremlin.spark.process.computer.*, org.apache.tinkerpop.gremlin.spark.structure.*, org.apache.tinkerpop.gremlin.spark.structure.io.*, org.apache.tinkerpop.gremlin.tinkergraph.structure.*, org.apache.tinkerpop.gremlin.tinkergraph.process.computer.*, java.time.Year
 gremlin&gt; firstYear = g.V().hasLabel(<span class="string"><span class="delimiter">'</span><span class="content">person</span><span class="delimiter">'</span></span>).
                            local(properties(<span class="string"><span class="delimiter">'</span><span class="content">location</span><span class="delimiter">'</span></span>).values(<span class="string"><span class="delimiter">'</span><span class="content">startTime</span><span class="delimiter">'</span></span>).min()).
                            max().next()
@@ -1785,6 +2161,28 @@ gremlin&gt; g.V().hasLabel(<span class="
 ==&gt;[<span class="key">person</span>:daniel,<span class="key">year</span>:<span class="integer">2018</span>,<span class="key">location</span>:aachen]</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"><span class="keyword">import</span> <span class="include">java.time.Year</span>
+firstYear = g.V().hasLabel(<span class="string"><span class="delimiter">'</span><span class="content">person</span><span class="delimiter">'</span></span>).
+                  local(properties(<span class="string"><span class="delimiter">'</span><span class="content">location</span><span class="delimiter">'</span></span>).values(<span class="string"><span class="delimiter">'</span><span class="content">startTime</span><span class="delimiter">'</span></span>).min()).
+                  max().next()
+g.V().hasLabel(<span class="string"><span class="delimiter">&quot;</span><span class="content">person</span><span class="delimiter">&quot;</span></span>).as(<span class="string"><span class="delimiter">&quot;</span><span class="content">person</span><span class="delimiter">&quot;</span></span>).
+      constant((firstYear..(<span class="keyword">new</span> <span class="predefined-type">Date</span>().getYear() + <span class="integer">1900</span>)).toList()).unfold().as(<span class="string"><span class="delimiter">&quot;</span><span class="content">year</span><span class="delimiter">&quot;</span></span>).
+      select(<span class="string"><span class="delimiter">&quot;</span><span class="content">person</span><span class="delimiter">&quot;</span></span>).coalesce(
+        properties(<span class="string"><span class="delimiter">&quot;</span><span class="content">location</span><span class="delimiter">&quot;</span></span>).filter(values(<span class="string"><span class="delimiter">&quot;</span><span class="content">startTime</span><span class="delimiter">&quot;</span></span>).where(gte(<span class="string"><span class="delimiter">&quot;</span><span class="content">year</span><span class="delimiter">&quot;</span></span>))).
+                               order().by(<span class="string"><span class="delimiter">&quot;</span><span class="content">startTime</span><span class="delimiter">&quot;</span></span>).limit(<span class="integer">1</span>),
+        properties(<span class="string"><span class="delimiter">&quot;</span><span class="content">location</span><span class="delimiter">&quot;</span></span>).hasNot(<span class="string"><span class="delimiter">&quot;</span><span class="content">endTime</span><span class="delimiter">&quot;</span></span>)).value().as(<span class="string"><span class="delimiter">&quot;</span><span class="content">location</span><span class="delimiter">&quot;</span></span>).
+      select(<span class="string"><span class="delimiter">&quot;</span><span class="content">person</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">year</span><span class="delimiter">&quot;</span></span>,<span class="string"><span class="delimiter">&quot;</span><span class="content">location</span><span class="delimiter">&quot;</span></span>).by(<span class="string"><span class="delimiter">&quot;</span><span class="content">name</span><span class="delimiter">&quot;</span></span>).by().by()</code></pre>
+</div>
+</div>
+    </div>
+  </div>
+</section>
 <div class="admonitionblock tip">
 <table>
 <tr>
@@ -1958,7 +2356,7 @@ knowledge on what the console can do for
 </div>
 <div id="footer">
 <div id="footer-text">
-Last updated 2018-05-11 15:41:40 EDT
+Last updated 2018-10-12 08:05:45 EDT
 </div>
 </div>
 </body>