You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2016/08/10 20:25:19 UTC

tinkerpop git commit: fixed up the gremlin-variants.asciidoc given all that has transpired since its initial writing. Updated the gremlin-variant-architecture.png as well.

Repository: tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1278 5ff0fe7a5 -> 0eb8e720c


fixed up the gremlin-variants.asciidoc given all that has transpired since its initial writing. Updated the gremlin-variant-architecture.png as well.


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

Branch: refs/heads/TINKERPOP-1278
Commit: 0eb8e720c580935d774d3769960d00461cc00e35
Parents: 5ff0fe7
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed Aug 10 14:25:10 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Aug 10 14:25:10 2016 -0600

----------------------------------------------------------------------
 docs/src/reference/gremlin-variants.asciidoc    | 173 +++-----
 .../images/gremlin-variant-architecture.png     | Bin 248031 -> 233060 bytes
 docs/static/images/tinkerpop3.graffle           | 433 +++----------------
 3 files changed, 119 insertions(+), 487 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0eb8e720/docs/src/reference/gremlin-variants.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/reference/gremlin-variants.asciidoc b/docs/src/reference/gremlin-variants.asciidoc
index b3c1f37..3ff7ab7 100644
--- a/docs/src/reference/gremlin-variants.asciidoc
+++ b/docs/src/reference/gremlin-variants.asciidoc
@@ -23,25 +23,20 @@ image::gremlin-house-of-mirrors.png[width=1024]
 Gremlin is a graph traversal language that makes use of two fundamental programming constructs:
 link:https://en.wikipedia.org/wiki/Function_composition[function composition] and
 link:https://en.wikipedia.org/wiki/Nested_function[function nesting]. Given this generality, it is possible to embed
-Gremlin any modern programming language. Gremlin is a "link:https://en.wikipedia.org/wiki/Platonic_idealism[Plantoic concept]"
-with two *variants* that are distributed by Apache TinkerPop that can be used on the Java Virtual Machine: Gremlin-Java and
-Gremlin-Groovy. Apache TinkerPop also distributed Gremlin-Python for use with either the JVM (Jython) or CPython.
+Gremlin in any modern programming language.
 
 IMPORTANT: Gremlin-Java is the canonical representation of Gremlin and any (proper) Gremlin language variant will emulate its
 structure as best as possible given the constructs of the host language. A strong correspondence between variants ensures
 that the general Gremlin reference documentation is applicable to all variants and that users moving between development
 languages can easily adopt the Gremlin language variant for that language.
 
-NOTE: The information in this section only provides information on how to use the Gremlin language variants distributed
+image::gremlin-variants-architecture.png[width=500,float=left]
+
+NOTE: The information herein describes how to use the Gremlin language variants distributed
 with Apache TinkerPop. For information on how to build a Gremlin language variant,
 please review the link:http://tinkerpop.apache.org/docs/current/tutorials/gremlin-language-variants/[Gremlin Language Variants]
 tutorial.
 
-NOTE: The host language is called the *source language* and the translator will translate Gremlin traversals into a
-*target language* for execution.
-
-image::gremlin-variants-architecture.png[width=500,float=left]
-
 [[gremlin-python]]
 Gremlin-Python
 --------------
@@ -58,18 +53,17 @@ To install Gremlin-Python, simply use Python's link:https://en.wikipedia.org/wik
 [source,bash]
 pip install requests
 pip install gremlin_python
-pip install gremlin_python.driver
-pip install gremlin_rest_driver
 
-There are three primary classes distributed with Gremlin-Python: `PythonGraphTraversalSource`, `PythonGraphTraversal`, and `__`.
+There are three primary classes distributed with Gremlin-Python: `GraphTraversalSource`, `GraphTraversal`, and `__`.
 
 [source,python]
-from gremlin_python import PythonGraphTraversalSource
-from gremlin_python import PythonGraphTraversal
-from gremlin_python import __
-from gremlin_rest_driver import RESTRemoteConnection
+from gremlin_python.structure.remote_graph import RemoteGraph
+from gremlin_python.process.graph_traversal import GraphTraversalSource
+from gremlin_python.process.graph_traversal import GraphTraversal
+from gremlin_python.process.graph_traversal import __
+from gremlin_python.driver.rest_remote_connection import RESTRemoteConnection
 
-These classes mirror `GraphTraversalSource`, `GraphTraversal`, and `__`, respectively in Gremlin-Java. The `PythonGraphTraversalSource`
+These classes mirror `GraphTraversalSource`, `GraphTraversal`, and `__`, respectively in Gremlin-Java. The `GraphTraversalSource`
 requires a driver in order to communicate with <<gremlin-server,GremlinServer>> (or any <<connecting-via-remotegraph,`RemoteConnection`>>-enabled server).
 The `gremlin_rest_driver` is provided with Apache TinkerPop and it serves as a simple (though verbose) driver that sends traversals to GremlinServer
 via HTTP POST (using link:http://docs.python-requests.org/[requests]) and in return, is provided <<graphson-reader-writer,GraphSON>>-encoded results.
@@ -77,7 +71,7 @@ via HTTP POST (using link:http://docs.python-requests.org/[requests]) and in ret
 
 NOTE: For developers wishing to provide another *driver implementation* (e.g. one using the more efficient
 link:https://en.wikipedia.org/wiki/WebSocket[WebSockets] protocol), be sure to extend `RemoteConnection` in `gremlin_python.driver` so it
-can then be used by `PythonGraphTraversal`.
+can then be used by Gremlin-Python's `GraphTraversal`.
 
 When GremlinServer is running, Gremlin-Python can communicate with GremlinServer. The `conf/gremlin-server-rest.modern.yaml`
 configuration is used to expose GremlinServer's REST interface.
@@ -102,19 +96,30 @@ $ bin/gremlin-server.sh conf/gremlin-server-rest-modern.yaml
 Within the CPython console, it is possible to evaluate the following.
 
 [source,python]
-conn = RESTRemoteConnection('http://localhost:8182')
-g = PythonGraphTraversalSource(GroovyTranslator('g'), conn)
+graph = RemoteGraph(RESTRemoteConnection('http://localhost:8182','g'))
+g = graph.traversal()
 g.V().repeat(__.out()).times(2).name.toList()
 
 CAUTION: Python has `as`, `in`, `and`, `or`, `is`, `not`, `from`, and `global` as reserved words. Gremlin-Python simply
 prefixes `_` in front of these terms for their use with graph traversal. For instance: `g.V()._as('a')._in()._as('b').select('a','b')`.
 
-`GroovyTranslator` extends `Translator` and serves as a simple machine that translates Gremlin-Python to Gremlin-Groovy for ultimate
-evaluation on `GremlinGroovyScriptEngine` on GremlinServer. It is possible to write other translators to be used with other
-`ScriptEngines` on GremlinServer (or any other `RemoteConnection`-based endpoint).
+When the traversal above is submitted to the `RemoteConnection`, it's `Bytecode` is sent in order to construct the equivalent traversal
+in GremlinServer (thus, remotely). The bytecode is analyzed to determine which language the bytecode should be translated to.
+If the traversal does not have lambdas, it will use Gremlin-Java. If it has lambdas in Groovy, it will use Gremlin-Groovy (`GremlinGroovyScriptEngine`).
+Likewise, if it has lambdas represented in Python, it will use Gremlin-Python (`GremlinJythonScriptEngine`).
+
+Gremlin-Python Sugar
+~~~~~~~~~~~~~~~~~~~~
 
-NOTE: For developers wishing to provide their own *translator implementation* (e.g. one using Jython), be sure to extend
-`Translator` in `gremlin_python` so it can be used by `PythonGraphTraversal`.
+Python supports meta-programming and operator overloading. There are three uses of these techniques in Gremlin-Python that
+makes traversals a bit more concise.
+
+[gremlin-python,modern]
+----
+g.V().both()[1:3]
+g.V().both()[1]
+g.V().both().name
+----
 
 Static Enums and Methods
 ~~~~~~~~~~~~~~~~~~~~~~~~
@@ -122,16 +127,16 @@ Static Enums and Methods
 Gremlin has various tokens (e.g. `T`, `P`, `Order`, `Operator`, etc.) that are represented in Gremlin-Python as Python `Enums`.
 
 [source,python]
-from gremlin_python import T
-from gremlin_python import Order
-from gremlin_python import Cardinality
-from gremlin_python import Column
-from gremlin_python import Direction
-from gremlin_python import Operator
-from gremlin_python import P
-from gremlin_python import Pop
-from gremlin_python import Scope
-from gremlin_python import Barrier
+from gremlin_python.process.traversal import T
+from gremlin_python.process.traversal import Order
+from gremlin_python.process.traversal import Cardinality
+from gremlin_python.process.traversal import Column
+from gremlin_python.process.traversal import Direction
+from gremlin_python.process.traversal import Operator
+from gremlin_python.process.traversal import P
+from gremlin_python.process.traversal import Pop
+from gremlin_python.process.traversal import Scope
+from gremlin_python.process.traversal import Barrier
 
 These can be used analogously to how they are used in Gremlin-Java.
 
@@ -143,9 +148,7 @@ g.V().hasLabel('person').has('age',P.gt(30)).order().by('age',Order.decr)
 Moreover, by importing the `statics` of Gremlin-Python, the class prefixes can be removed.
 
 [source,python]
-from gremlin_python import statics
-for k in statics:
-  globals()[k] = statics[k]
+gremlin_python.statics.load_statics(globals())
 
 With statics loaded its possible to represent the above traversal as below.
 
@@ -165,9 +168,9 @@ g.V().repeat(out()).times(2).name.fold()
 RemoteConnection Bindings
 ~~~~~~~~~~~~~~~~~~~~~~~~~
 
-When a traversal script is sent to `RemoteConnection` (e.g. GremlinServer), it will be compiled and executed by the respective
-`ScriptEngine` accordingly. If the same traversal is sent again, it can simply be executed as the compiled version will typically
-be cached. Many traversals are unique up to some parameterization. For instance, `g.V(1).out('created').name` is considered different
+When a traversal bytecode is sent over a `RemoteConnection` (e.g. GremlinServer), it will be translated, compiled, and executed accordingly.
+If the same traversal is sent again, it can simply be executed as the compiled version will typically be cached.
+Many traversals are unique up to some parameterization. For instance, `g.V(1).out('created').name` is considered different
 from `g.V(4).out('created').name'` as they are different scripts. However, `g.V(x).out('created').name` with bindings of `{x : 1}` and
 `{x : 4}` is the same. If a traversal is going to be run over and over again, but with different parameters, then bindings should be used.
 This can significantly speed up execution as compilation need only occur once. In Gremlin-Python, bindings are 2-tuples and used as follows.
@@ -180,95 +183,17 @@ g.V(('id',4)).out('created').name
 
 In the two examples above, the remote compiler is only used once.
 
-Gremlin-Python Sugar
-~~~~~~~~~~~~~~~~~~~~
-
-Python supports meta-programming and operator overloading. There are three uses of these techniques in Gremlin-Python that
-makes traversals a bit more concise.
-
-[gremlin-python,modern]
-----
-g.V().both()[1:3]
-g.V().both()[1]
-g.V().both().name
-----
-
 The Lambda Solution
 ~~~~~~~~~~~~~~~~~~~
 
-Supporting link:https://en.wikipedia.org/wiki/Anonymous_function[anonymous functions] across languages is extremely difficult at best.
-As a simple solution, it is up to the `Translator` (not Gremlin-Python) to decide how
-link:https://docs.python.org/2/reference/expressions.html#lambda[Python lambdas] should be treated. For `GroovyTranslator`,
-a Python lambda should be a zero-arg callable that returns a string representation of a Groovy closure.
+Supporting link:https://en.wikipedia.org/wiki/Anonymous_function[anonymous functions] across languages is extremely difficult.
+As a simple solution, it is up to the `Translator` to decide how
+link:https://docs.python.org/2/reference/expressions.html#lambda[Python lambdas] should be treated. For `PythonTranslator`
+and `GroovyTranslator`, a lambda should be a zero-arg callable that returns a string representation of a Python or Groovy closure.
+When the lambda is represented in `Bytecode` its language is encoded such that GremlinServer will know which translator to use.
 
 [gremlin-python,modern]
 ----
 g.V().out().map(lambda: "it.get().value('name').length()").sum()
 ----
 
-Note that with a `JythonTranslator` (currently not available through Apache TinkerPop), it is possible to introspect on
-the source code of a Python lambda and use that during translation. An example of how that would be achieved is provided
-below.
-
-[source,python]
->>> from dill.source import getsource
->>> getsource(lambda traverser: len(traverser.get().values('name')))
-"lambda traverser: len(traverser.get().values('name'))\n"
-
-IMPORTANT: The "lambda solution" is not universal in that each `Translator` will specify how lambdas should be
-used in the host language in order to be applied in the translated/execution language.
-
-RawExpressions in Gremlin-Python
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-A `RawExpression` allows users to leverage APIs offered by the graph system provider and host languages that are
-not part of the standard Gremlin language. The `RawExpression` constructor takes string and 2-tuple bindings that are
-ultimately concatenated together by the `Translator`. Like lambdas, `RawExpressions` are tied to the underlying
-translator and now the host language and thus, a `RawExpression` used for Gremlin-Groovy execution may not work
-for Gremlin-Jython.
-
-The following example uses `RawExpression` to call the `Geoshape.point()` static constructor method on the `Geoshape`
-class provided by Aurelius' link:http://titan.thinkaurelius.com/[Titan] graph database.
-
-[source,python]
-----
-g.V().has('location', RawExpression('Geoshape.point(', ('x', 45), ', ', ('y', -45), ')'))
-----
-
-Note that both `x` and `y` are `RemoteConnection` bindings with values 45 and -45 respectively.
-
-To help readability, especially if an expression will be used more than once, it is recommended that a helper class be
-created. Again, note that this helper class is tied to `GroovyTranslator` as its `point()` `RawExpression` return is
-tied to the the underlying execution language.
-
-[source,python]
-----
-class Geoshape(object):
-    @staticmethod
-    def point(latitude, longitude):
-        return RawExpression('Geoshape.point(', latitude, ', ', longitude, ')')
-----
-
-The previous traversal can now be written simply as below.
-
-[source,python]
-----
-g.V().has('location', Geoshape.point(('x', 45), ('y', -45)))
-----
-
-Or, without using bindings:
-
-[source,python]
-----
-g.V().has('location', Geoshape.point(45,-45))
-----
-
-Finally, `RawExpressions` are useful when adding or removing a `TraversalStrategy` from the `GraphTraversalSource` as
-they typically have Java-based APIs. Again, respective Python classes that yield `RawExpressions` can be used to make
-their use more readable.
-
-[gremlin-python,modern]
-----
-g.withComputer(RawExpression('compute(TinkerGraphComputer)')).V().pageRank().by('rank').valueMap('name','rank')
-----
-

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0eb8e720/docs/static/images/gremlin-variant-architecture.png
----------------------------------------------------------------------
diff --git a/docs/static/images/gremlin-variant-architecture.png b/docs/static/images/gremlin-variant-architecture.png
index a70f07c..d350281 100644
Binary files a/docs/static/images/gremlin-variant-architecture.png and b/docs/static/images/gremlin-variant-architecture.png differ

http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/0eb8e720/docs/static/images/tinkerpop3.graffle
----------------------------------------------------------------------
diff --git a/docs/static/images/tinkerpop3.graffle b/docs/static/images/tinkerpop3.graffle
index c62d18b..04307a8 100644
--- a/docs/static/images/tinkerpop3.graffle
+++ b/docs/static/images/tinkerpop3.graffle
@@ -194859,7 +194859,7 @@
 	<key>MasterSheets</key>
 	<array/>
 	<key>ModificationDate</key>
-	<string>2016-06-22 18:06:52 +0000</string>
+	<string>2016-08-10 20:07:00 +0000</string>
 	<key>Modifier</key>
 	<string>Marko Rodriguez</string>
 	<key>NotesVisible</key>
@@ -303636,164 +303636,8 @@ edges}</string>
 			<key>GraphicsList</key>
 			<array>
 				<dict>
-					<key>Class</key>
-					<string>LineGraphic</string>
-					<key>ID</key>
-					<integer>651</integer>
-					<key>Points</key>
-					<array>
-						<string>{82.537346053977245, 430}</string>
-						<string>{82.537346053977245, 407}</string>
-					</array>
-					<key>Style</key>
-					<dict>
-						<key>shadow</key>
-						<dict>
-							<key>Draws</key>
-							<string>NO</string>
-						</dict>
-						<key>stroke</key>
-						<dict>
-							<key>HeadArrow</key>
-							<string>0</string>
-							<key>Legacy</key>
-							<true/>
-							<key>Pattern</key>
-							<integer>2</integer>
-							<key>TailArrow</key>
-							<string>0</string>
-							<key>Width</key>
-							<real>2</real>
-						</dict>
-					</dict>
-				</dict>
-				<dict>
-					<key>Bounds</key>
-					<string>{{95.648686292182163, 260.90947020422283}, {80, 24}}</string>
-					<key>Class</key>
-					<string>ShapedGraphic</string>
-					<key>FitText</key>
-					<string>YES</string>
-					<key>Flow</key>
-					<string>Resize</string>
-					<key>FontInfo</key>
-					<dict>
-						<key>Size</key>
-						<real>11</real>
-					</dict>
-					<key>ID</key>
-					<integer>650</integer>
-					<key>Style</key>
-					<dict>
-						<key>fill</key>
-						<dict>
-							<key>Draws</key>
-							<string>NO</string>
-						</dict>
-						<key>shadow</key>
-						<dict>
-							<key>Draws</key>
-							<string>NO</string>
-						</dict>
-						<key>stroke</key>
-						<dict>
-							<key>Draws</key>
-							<string>NO</string>
-						</dict>
-					</dict>
-					<key>Text</key>
-					<dict>
-						<key>Text</key>
-						<string>{\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf470
-{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;}
-{\colortbl;\red255\green255\blue255;}
-\deftab720
-\pard\pardeftab720\qc\partightenfactor0
-
-\f0\fs22 \cf0 gremlin_driver}</string>
-					</dict>
-					<key>Wrap</key>
-					<string>NO</string>
-				</dict>
-				<dict>
-					<key>Bounds</key>
-					<string>{{93.648686292182163, 201.59999549388885}, {89, 27}}</string>
-					<key>Class</key>
-					<string>ShapedGraphic</string>
-					<key>FitText</key>
-					<string>YES</string>
-					<key>Flow</key>
-					<string>Resize</string>
-					<key>FontInfo</key>
-					<dict>
-						<key>Size</key>
-						<real>14</real>
-					</dict>
-					<key>ID</key>
-					<integer>649</integer>
-					<key>Style</key>
-					<dict>
-						<key>fill</key>
-						<dict>
-							<key>Draws</key>
-							<string>NO</string>
-						</dict>
-						<key>shadow</key>
-						<dict>
-							<key>Draws</key>
-							<string>NO</string>
-						</dict>
-						<key>stroke</key>
-						<dict>
-							<key>Draws</key>
-							<string>NO</string>
-						</dict>
-					</dict>
-					<key>Text</key>
-					<dict>
-						<key>Text</key>
-						<string>{\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf470
-{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;}
-{\colortbl;\red255\green255\blue255;}
-\deftab720
-\pard\pardeftab720\qc\partightenfactor0
-
-\f0\fs28 \cf0 WebSockets}</string>
-					</dict>
-					<key>Wrap</key>
-					<string>NO</string>
-				</dict>
-				<dict>
-					<key>Bounds</key>
-					<string>{{54.790227539490701, 183.42352490565349}, {45.176470588235354, 45.176470588235354}}</string>
-					<key>Class</key>
-					<string>ShapedGraphic</string>
-					<key>ID</key>
-					<integer>648</integer>
-					<key>ImageID</key>
-					<integer>127</integer>
-					<key>Style</key>
-					<dict>
-						<key>fill</key>
-						<dict>
-							<key>Draws</key>
-							<string>NO</string>
-						</dict>
-						<key>shadow</key>
-						<dict>
-							<key>Draws</key>
-							<string>NO</string>
-						</dict>
-						<key>stroke</key>
-						<dict>
-							<key>Draws</key>
-							<string>NO</string>
-						</dict>
-					</dict>
-				</dict>
-				<dict>
 					<key>Bounds</key>
-					<string>{{148.6238421486282, 383.23911893839755}, {72.677567656886367, 25}}</string>
+					<string>{{134.33974422329038, 311.5151608854444}, {101.32051155341924, 24.00000000000005}}</string>
 					<key>Class</key>
 					<string>ShapedGraphic</string>
 					<key>FontInfo</key>
@@ -303804,13 +303648,13 @@ edges}</string>
 						<real>12</real>
 					</dict>
 					<key>ID</key>
-					<integer>646</integer>
+					<integer>658</integer>
 					<key>Line</key>
 					<dict>
 						<key>ID</key>
 						<integer>626</integer>
 						<key>Position</key>
-						<real>0.94252327039992534</real>
+						<real>0.57767349857293415</real>
 						<key>RotationType</key>
 						<integer>0</integer>
 					</dict>
@@ -303821,11 +303665,11 @@ edges}</string>
 							<key>Color</key>
 							<dict>
 								<key>b</key>
-								<real>0.56470600000000004</real>
+								<real>0.105882</real>
 								<key>g</key>
-								<real>0.36862699999999998</real>
+								<real>0.52941199999999999</real>
 								<key>r</key>
-								<real>0.168627</real>
+								<real>0.95294100000000004</real>
 							</dict>
 						</dict>
 						<key>shadow</key>
@@ -303848,12 +303692,12 @@ edges}</string>
 \deftab720
 \pard\pardeftab720\qc\partightenfactor0
 
-\f0\fs24 \cf1 Traverser}</string>
+\f0\fs24 \cf0 RemoteTraverser}</string>
 					</dict>
 				</dict>
 				<dict>
 					<key>Bounds</key>
-					<string>{{148.58665445112911, 349.14904296760653}, {72.677567656886367, 25}}</string>
+					<string>{{131.02744502872159, 235.99999999999997}, {112.65168711259646, 24.00000000000005}}</string>
 					<key>Class</key>
 					<string>ShapedGraphic</string>
 					<key>FontInfo</key>
@@ -303864,13 +303708,13 @@ edges}</string>
 						<real>12</real>
 					</dict>
 					<key>ID</key>
-					<integer>645</integer>
+					<integer>656</integer>
 					<key>Line</key>
 					<dict>
 						<key>ID</key>
-						<integer>626</integer>
+						<integer>653</integer>
 						<key>Position</key>
-						<real>0.88533307836724962</real>
+						<real>0.58250274435168792</real>
 						<key>RotationType</key>
 						<integer>0</integer>
 					</dict>
@@ -303881,11 +303725,11 @@ edges}</string>
 							<key>Color</key>
 							<dict>
 								<key>b</key>
-								<real>0.56470600000000004</real>
+								<real>0.105882</real>
 								<key>g</key>
-								<real>0.36862699999999998</real>
+								<real>0.52941199999999999</real>
 								<key>r</key>
-								<real>0.168627</real>
+								<real>0.95294100000000004</real>
 							</dict>
 						</dict>
 						<key>shadow</key>
@@ -303908,12 +303752,12 @@ edges}</string>
 \deftab720
 \pard\pardeftab720\qc\partightenfactor0
 
-\f0\fs24 \cf1 Traverser}</string>
+\f0\fs24 \cf0 GroovyTranslator}</string>
 					</dict>
 				</dict>
 				<dict>
 					<key>Bounds</key>
-					<string>{{147.5253507316018, 292.95228131971925}, {72.677567656886367, 25}}</string>
+					<string>{{44.467456116075255, 382.23566990235673}, {72.677567656886367, 25}}</string>
 					<key>Class</key>
 					<string>ShapedGraphic</string>
 					<key>FontInfo</key>
@@ -303924,15 +303768,13 @@ edges}</string>
 						<real>12</real>
 					</dict>
 					<key>ID</key>
-					<integer>644</integer>
+					<integer>655</integer>
 					<key>Line</key>
 					<dict>
 						<key>ID</key>
-						<integer>626</integer>
-						<key>Offset</key>
-						<real>-1</real>
+						<integer>653</integer>
 						<key>Position</key>
-						<real>0.79105443904131834</real>
+						<real>0.070991707588135194</real>
 						<key>RotationType</key>
 						<integer>0</integer>
 					</dict>
@@ -303943,11 +303785,11 @@ edges}</string>
 							<key>Color</key>
 							<dict>
 								<key>b</key>
-								<real>0.56470588235294117</real>
+								<real>0.56470600000000004</real>
 								<key>g</key>
-								<real>0.36862745098039218</real>
+								<real>0.36862699999999998</real>
 								<key>r</key>
-								<real>0.16862745098039217</real>
+								<real>0.168627</real>
 							</dict>
 						</dict>
 						<key>shadow</key>
@@ -303966,49 +303808,35 @@ edges}</string>
 						<key>Text</key>
 						<string>{\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf470
 {\fonttbl\f0\fnil\fcharset0 HelveticaNeue;}
-{\colortbl;\red255\green255\blue255;\red255\green255\blue255;}
+{\colortbl;\red255\green255\blue255;}
 \deftab720
 \pard\pardeftab720\qc\partightenfactor0
 
-\f0\fs24 \cf2 Traverser}</string>
+\f0\fs24 \cf1 Bytecode}</string>
 					</dict>
 				</dict>
 				<dict>
 					<key>Bounds</key>
-					<string>{{275.36076864512341, 239.48803768894908}, {72.677567656886367, 25}}</string>
+					<string>{{81.359998181462288, 272.2575804427222}, {89, 27}}</string>
 					<key>Class</key>
 					<string>ShapedGraphic</string>
+					<key>FitText</key>
+					<string>YES</string>
+					<key>Flow</key>
+					<string>Resize</string>
 					<key>FontInfo</key>
 					<dict>
-						<key>Font</key>
-						<string>Courier</string>
 						<key>Size</key>
-						<real>12</real>
+						<real>14</real>
 					</dict>
 					<key>ID</key>
-					<integer>643</integer>
-					<key>Line</key>
-					<dict>
-						<key>ID</key>
-						<integer>31</integer>
-						<key>Position</key>
-						<real>0.91886117418224833</real>
-						<key>RotationType</key>
-						<integer>0</integer>
-					</dict>
+					<integer>649</integer>
 					<key>Style</key>
 					<dict>
 						<key>fill</key>
 						<dict>
-							<key>Color</key>
-							<dict>
-								<key>b</key>
-								<real>0.129412</real>
-								<key>g</key>
-								<real>0.85882400000000003</real>
-								<key>r</key>
-								<real>0.96862700000000002</real>
-							</dict>
+							<key>Draws</key>
+							<string>NO</string>
 						</dict>
 						<key>shadow</key>
 						<dict>
@@ -304017,8 +303845,8 @@ edges}</string>
 						</dict>
 						<key>stroke</key>
 						<dict>
-							<key>CornerRadius</key>
-							<real>9</real>
+							<key>Draws</key>
+							<string>NO</string>
 						</dict>
 					</dict>
 					<key>Text</key>
@@ -304030,25 +303858,20 @@ edges}</string>
 \deftab720
 \pard\pardeftab720\qc\partightenfactor0
 
-\f0\fs24 \cf0 submit(\'85)}</string>
+\f0\fs28 \cf0 WebSockets}</string>
 					</dict>
+					<key>Wrap</key>
+					<string>NO</string>
 				</dict>
 				<dict>
 					<key>Bounds</key>
-					<string>{{94.148686292182163, 409.16873297916629}, {83, 24}}</string>
+					<string>{{29.519999340176582, 263.16934514860452}, {45.176470588235354, 45.176470588235354}}</string>
 					<key>Class</key>
 					<string>ShapedGraphic</string>
-					<key>FitText</key>
-					<string>YES</string>
-					<key>Flow</key>
-					<string>Resize</string>
-					<key>FontInfo</key>
-					<dict>
-						<key>Size</key>
-						<real>11</real>
-					</dict>
 					<key>ID</key>
-					<integer>639</integer>
+					<integer>648</integer>
+					<key>ImageID</key>
+					<integer>127</integer>
 					<key>Style</key>
 					<dict>
 						<key>fill</key>
@@ -304067,23 +303890,10 @@ edges}</string>
 							<string>NO</string>
 						</dict>
 					</dict>
-					<key>Text</key>
-					<dict>
-						<key>Text</key>
-						<string>{\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf470
-{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;}
-{\colortbl;\red255\green255\blue255;}
-\deftab720
-\pard\pardeftab720\qc\partightenfactor0
-
-\f0\fs22 \cf0 proxy traversal}</string>
-					</dict>
-					<key>Wrap</key>
-					<string>NO</string>
 				</dict>
 				<dict>
 					<key>Bounds</key>
-					<string>{{404.36097421875991, 238.77090337782056}, {72.677567656886367, 25}}</string>
+					<string>{{128.6741564437018, 381.80752656424795}, {112.65168711259641, 25}}</string>
 					<key>Class</key>
 					<string>ShapedGraphic</string>
 					<key>FontInfo</key>
@@ -304094,13 +303904,13 @@ edges}</string>
 						<real>12</real>
 					</dict>
 					<key>ID</key>
-					<integer>636</integer>
+					<integer>646</integer>
 					<key>Line</key>
 					<dict>
 						<key>ID</key>
 						<integer>626</integer>
 						<key>Position</key>
-						<real>0.13181188234356347</real>
+						<real>0.85844108583474055</real>
 						<key>RotationType</key>
 						<integer>0</integer>
 					</dict>
@@ -304111,11 +303921,11 @@ edges}</string>
 							<key>Color</key>
 							<dict>
 								<key>b</key>
-								<real>0.129412</real>
+								<real>0.56470600000000004</real>
 								<key>g</key>
-								<real>0.85882400000000003</real>
+								<real>0.36862699999999998</real>
 								<key>r</key>
-								<real>0.96862700000000002</real>
+								<real>0.168627</real>
 							</dict>
 						</dict>
 						<key>shadow</key>
@@ -304138,7 +303948,7 @@ edges}</string>
 \deftab720
 \pard\pardeftab720\qc\partightenfactor0
 
-\f0\fs24 \cf0 Response}</string>
+\f0\fs24 \cf1 RemoteTraversal}</string>
 					</dict>
 				</dict>
 				<dict>
@@ -304191,58 +304001,7 @@ edges}</string>
 				</dict>
 				<dict>
 					<key>Bounds</key>
-					<string>{{25.639999404549599, 382.16873297916624}, {112.65168711259646, 24.00000000000005}}</string>
-					<key>Class</key>
-					<string>ShapedGraphic</string>
-					<key>FontInfo</key>
-					<dict>
-						<key>Font</key>
-						<string>Courier</string>
-						<key>Size</key>
-						<real>12</real>
-					</dict>
-					<key>ID</key>
-					<integer>623</integer>
-					<key>Style</key>
-					<dict>
-						<key>fill</key>
-						<dict>
-							<key>Color</key>
-							<dict>
-								<key>b</key>
-								<real>0.56470600000000004</real>
-								<key>g</key>
-								<real>0.36862699999999998</real>
-								<key>r</key>
-								<real>0.168627</real>
-							</dict>
-						</dict>
-						<key>shadow</key>
-						<dict>
-							<key>Draws</key>
-							<string>NO</string>
-						</dict>
-						<key>stroke</key>
-						<dict>
-							<key>CornerRadius</key>
-							<real>9</real>
-						</dict>
-					</dict>
-					<key>Text</key>
-					<dict>
-						<key>Text</key>
-						<string>{\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf470
-{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;}
-{\colortbl;\red255\green255\blue255;}
-\deftab720
-\pard\pardeftab720\qc\partightenfactor0
-
-\f0\fs24 \cf1 GroovyTranslator}</string>
-					</dict>
-				</dict>
-				<dict>
-					<key>Bounds</key>
-					<string>{{56.790227539490701, 240.67129717989494}, {157.71691750538287, 25}}</string>
+					<string>{{54.790227539490701, 344.93473033046155}, {157.71691750538287, 25}}</string>
 					<key>Class</key>
 					<string>ShapedGraphic</string>
 					<key>FontInfo</key>
@@ -304292,64 +304051,14 @@ edges}</string>
 					</dict>
 				</dict>
 				<dict>
-					<key>Bounds</key>
-					<string>{{186.50714504487357, 312.5}, {28, 32}}</string>
-					<key>Class</key>
-					<string>ShapedGraphic</string>
-					<key>FitText</key>
-					<string>YES</string>
-					<key>Flow</key>
-					<string>Resize</string>
-					<key>FontInfo</key>
-					<dict>
-						<key>Size</key>
-						<real>18</real>
-					</dict>
-					<key>ID</key>
-					<integer>630</integer>
-					<key>Style</key>
-					<dict>
-						<key>fill</key>
-						<dict>
-							<key>Draws</key>
-							<string>NO</string>
-						</dict>
-						<key>shadow</key>
-						<dict>
-							<key>Draws</key>
-							<string>NO</string>
-						</dict>
-						<key>stroke</key>
-						<dict>
-							<key>Draws</key>
-							<string>NO</string>
-						</dict>
-					</dict>
-					<key>Text</key>
-					<dict>
-						<key>Text</key>
-						<string>{\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf470
-{\fonttbl\f0\fnil\fcharset0 HelveticaNeue;}
-{\colortbl;\red255\green255\blue255;}
-\deftab720
-\pard\pardeftab720\qc\partightenfactor0
-
-\f0\fs36 \cf0 \'85}</string>
-					</dict>
-					<key>Wrap</key>
-					<string>NO</string>
-				</dict>
-				<dict>
 					<key>Class</key>
 					<string>LineGraphic</string>
 					<key>ID</key>
 					<integer>626</integer>
 					<key>Points</key>
 					<array>
-						<string>{408.52005264717303, 298.21481999036672}</string>
-						<string>{440.35980825027622, 298}</string>
-						<string>{441, 210}</string>
-						<string>{184.76000952720642, 210}</string>
+						<string>{306.19955458922607, 298.70882238567651}</string>
+						<string>{185, 299.06140044898143}</string>
 						<string>{185, 430}</string>
 					</array>
 					<key>Style</key>
@@ -304379,7 +304088,7 @@ edges}</string>
 				</dict>
 				<dict>
 					<key>Bounds</key>
-					<string>{{-4.4626539460227548, 298.16873297916624}, {123, 49}}</string>
+					<string>{{126.28114908791923, 190.51999571919441}, {123, 49}}</string>
 					<key>Class</key>
 					<string>ShapedGraphic</string>
 					<key>FitText</key>
@@ -304404,8 +304113,6 @@ edges}</string>
 					</dict>
 					<key>ID</key>
 					<integer>625</integer>
-					<key>Rotation</key>
-					<real>270</real>
 					<key>Style</key>
 					<dict>
 						<key>fill</key>
@@ -304431,11 +304138,11 @@ edges}</string>
 						<key>Text</key>
 						<string>{\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf470
 {\fonttbl\f0\fmodern\fcharset0 Courier;}
-{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+{\colortbl;\red255\green255\blue255;}
 \deftab720
 \pard\pardeftab720\partightenfactor0
 
-\f0\fs22 \cf2 g.V().limit(5).\
+\f0\fs22 \cf0 g.V().limit(5).\
   out(`created\'92).\
   values(`name\'92)}</string>
 					</dict>
@@ -304445,14 +304152,19 @@ edges}</string>
 				<dict>
 					<key>Class</key>
 					<string>LineGraphic</string>
+					<key>Head</key>
+					<dict>
+						<key>ID</key>
+						<integer>620</integer>
+					</dict>
 					<key>ID</key>
-					<integer>31</integer>
+					<integer>653</integer>
 					<key>Points</key>
 					<array>
-						<string>{81.933609396039799, 381.66873464156265}</string>
-						<string>{81.537346053977245, 228}</string>
-						<string>{311.6995524735666, 228}</string>
-						<string>{311.6995524735666, 288}</string>
+						<string>{81, 430}</string>
+						<string>{80, 248}</string>
+						<string>{356.67999204993248, 248}</string>
+						<string>{357.19173718897542, 286.06003878569493}</string>
 					</array>
 					<key>Style</key>
 					<dict>
@@ -304473,11 +304185,6 @@ edges}</string>
 							<real>2</real>
 						</dict>
 					</dict>
-					<key>Tail</key>
-					<dict>
-						<key>ID</key>
-						<integer>623</integer>
-					</dict>
 				</dict>
 				<dict>
 					<key>Bounds</key>
@@ -304527,7 +304234,7 @@ edges}</string>
 \deftab720
 \pard\pardeftab720\qc\partightenfactor0
 
-\f0\fs24 \cf1 PythonGraphTraversal}</string>
+\f0\fs24 \cf1 Traversal}</string>
 					</dict>
 				</dict>
 				<dict>
@@ -304685,11 +304392,11 @@ edges}</string>
 						<key>Text</key>
 						<string>{\rtf1\ansi\ansicpg1252\cocoartf1404\cocoasubrtf470
 {\fonttbl\f0\fnil\fcharset0 HelveticaNeue;}
-{\colortbl;\red255\green255\blue255;\red0\green0\blue0;}
+{\colortbl;\red255\green255\blue255;}
 \deftab720
 \pard\pardeftab720\qc\partightenfactor0
 
-\f0\fs24 \cf2 GraphTraversal}</string>
+\f0\fs24 \cf0 Traversal}</string>
 					</dict>
 				</dict>
 				<dict>
@@ -305289,7 +304996,7 @@ Database}</string>
 				</dict>
 				<dict>
 					<key>Bounds</key>
-					<string>{{354.34706705054975, 242.67120597230101}, {45.176470588235354, 58.824431012894195}}</string>
+					<string>{{368.63999176025391, 240.43314942982801}, {45.176470588235354, 58.824431012894195}}</string>
 					<key>Class</key>
 					<string>ShapedGraphic</string>
 					<key>ID</key>