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/06/03 22:09:29 UTC

incubator-tinkerpop git commit: got bindings to work. what a nightmare. had to use call stack introspection to get the local variable field of the calling class. insane -- though I know more about the Python VM and how to do introspection.

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1278 a938e5084 -> 8c59f790b


got bindings to work. what a nightmare. had to use call stack introspection to get the local variable field of the calling class. insane -- though I know more about the Python VM and how to do introspection.


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

Branch: refs/heads/TINKERPOP-1278
Commit: 8c59f790bdbd6526026611f29e0b30641bc45d42
Parents: a938e50
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Fri Jun 3 16:09:25 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Fri Jun 3 16:09:25 2016 -0600

----------------------------------------------------------------------
 gremlin-variant/pom.xml                         |  49 ++
 .../python/GremlinPythonGenerator.groovy        |  59 +-
 .../jython/gremlin_driver/gremlin_driver.py     |   6 +-
 .../src/main/jython/gremlin_python/__init__.py  |  13 +
 .../jython/gremlin_python/gremlin_python.py     | 572 ++++++++++++++-----
 .../gremlin_rest_driver/gremlin_rest_driver.py  |   9 +-
 .../variant/python/PythonVariantConverter.java  |   2 +-
 7 files changed, 550 insertions(+), 160 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8c59f790/gremlin-variant/pom.xml
----------------------------------------------------------------------
diff --git a/gremlin-variant/pom.xml b/gremlin-variant/pom.xml
index a1f7061..6057120 100644
--- a/gremlin-variant/pom.xml
+++ b/gremlin-variant/pom.xml
@@ -133,6 +133,55 @@
                     </libraries>
                 </configuration>
             </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-clean-plugin</artifactId>
+                <version>3.0.0</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>clean</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <filesets>
+                        <fileset>
+                            <directory>${basedir}/src/main/jython/gremlin_rest_driver</directory>
+                            <includes>
+                                <include>**/*.pyc</include>
+                                <include>**/*.class</include>
+                            </includes>
+                            <excludes>
+                                <exclude>**/*.py</exclude>
+                            </excludes>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>${basedir}/src/main/jython/gremlin_driver</directory>
+                            <includes>
+                                <include>**/*.pyc</include>
+                                <include>**/*.class</include>
+                            </includes>
+                            <excludes>
+                                <exclude>**/*.py</exclude>
+                            </excludes>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                        <fileset>
+                            <directory>${basedir}/src/main/jython/gremlin_python</directory>
+                            <includes>
+                                <include>**/*.pyc</include>
+                                <include>**/*.class</include>
+                            </includes>
+                            <excludes>
+                                <exclude>**/*.py</exclude>
+                            </excludes>
+                            <followSymlinks>false</followSymlinks>
+                        </fileset>
+                    </filesets>
+                </configuration>
+            </plugin>
         </plugins>
     </build>
 </project>
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8c59f790/gremlin-variant/src/main/groovy/org/apache/tinkerpop/gremlin/process/variant/python/GremlinPythonGenerator.groovy
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/main/groovy/org/apache/tinkerpop/gremlin/process/variant/python/GremlinPythonGenerator.groovy b/gremlin-variant/src/main/groovy/org/apache/tinkerpop/gremlin/process/variant/python/GremlinPythonGenerator.groovy
index 5e0652a..882c6fc 100644
--- a/gremlin-variant/src/main/groovy/org/apache/tinkerpop/gremlin/process/variant/python/GremlinPythonGenerator.groovy
+++ b/gremlin-variant/src/main/groovy/org/apache/tinkerpop/gremlin/process/variant/python/GremlinPythonGenerator.groovy
@@ -77,9 +77,20 @@ under the License.
         final Map<String, String> enumMap = [Cardinality: "VertexProperty.Cardinality", Barrier: "SackFunctions.Barrier"]
                 .withDefault { it }
 
-        pythonClass.append("from collections import OrderedDict\n\n")
+        pythonClass.append("from collections import OrderedDict\n")
+        pythonClass.append("import inspect\n\n")
         pythonClass.append("statics = OrderedDict()\n\n")
         pythonClass.append("""
+class B(object):
+  def __init__(self, symbol, value="~empty"):
+    self.symbol = symbol
+    if value == "~empty":
+      self.value = inspect.currentframe().f_back.f_locals[symbol]
+    else:
+      self.value = value
+  def __repr__(self):
+    return self.symbol
+
 class Helper(object):
   @staticmethod
   def stringOrObject(arg):
@@ -111,14 +122,14 @@ class Helper(object):
 //////////////////////////
         pythonClass.append(
                 """class PythonGraphTraversalSource(object):
-  def __init__(self, traversalSourceString, remoteConnection):
-    self.traversalSourceString = traversalSourceString
-    self.remoteConnection = remoteConnection
+  def __init__(self, traversal_source_string, remote_connection=None):
+    self.traversal_source_string = traversal_source_string
+    self.remote_connection = remote_connection
   def __repr__(self):
-    if self.remoteConnection is None:
-      return "graphtraversalsource[no connection, " + self.traversalSourceString + "]"
+    if self.remote_connection is None:
+      return "graphtraversalsource[no connection, " + self.traversal_source_string + "]"
     else:
-      return "graphtraversalsource[" + str(self.remoteConnection) + ", " + self.traversalSourceString + "]"
+      return "graphtraversalsource[" + str(self.remote_connection) + ", " + self.traversal_source_string + "]"
 """)
         GraphTraversalSource.getMethods()
                 .collect { it.name }
@@ -134,12 +145,12 @@ class Helper(object):
                 if (Traversal.isAssignableFrom(returnType)) {
                     pythonClass.append(
                             """  def ${method}(self, *args):
-    return PythonGraphTraversal(self.traversalSourceString + ".${method}(" + Helper.stringify(*args) + ")", self.remoteConnection)
+    return PythonGraphTraversal(self.traversal_source_string + ".${method}(" + Helper.stringify(*args) + ")", self.remote_connection)
 """)
                 } else if (TraversalSource.isAssignableFrom(returnType)) {
                     pythonClass.append(
                             """  def ${method}(self, *args):
-    return PythonGraphTraversalSource(self.traversalSourceString + ".${method}(" + Helper.stringify(*args) + ")", self.remoteConnection)
+    return PythonGraphTraversalSource(self.traversal_source_string + ".${method}(" + Helper.stringify(*args) + ")", self.remote_connection)
 """)
                 }
             }
@@ -151,13 +162,14 @@ class Helper(object):
 ////////////////////
         pythonClass.append(
                 """class PythonGraphTraversal(object):
-  def __init__(self, traversalString, remoteConnection=None):
-    self.traversalString = traversalString
-    self.remoteConnection = remoteConnection
+  def __init__(self, traversal_string, remote_connection=None):
+    self.traversal_string = traversal_string
+    self.remote_connection = remote_connection
     self.results = None
-    self.lastTraverser = None
+    self.last_traverser = None
+    self.bindings = {}
   def __repr__(self):
-    return self.traversalString
+    return self.traversal_string
   def __getitem__(self,index):
     if type(index) is int:
       return self.range(index,index+1)
@@ -173,13 +185,13 @@ class Helper(object):
     return list(iter(self))
   def next(self):
      if self.results is None:
-        self.results = self.remoteConnection.submit(self.traversalString)
-     if self.lastTraverser is None:
-         self.lastTraverser = self.results.next()
-     object = self.lastTraverser.object
-     self.lastTraverser.bulk = self.lastTraverser.bulk - 1
-     if self.lastTraverser.bulk <= 0:
-         self.lastTraverser = None
+        self.results = self.remote_connection.submit(self.traversal_string, self.bindings)
+     if self.last_traverser is None:
+         self.last_traverser = self.results.next()
+     object = self.last_traverser.object
+     self.last_traverser.bulk = self.last_traverser.bulk - 1
+     if self.last_traverser.bulk <= 0:
+         self.last_traverser = None
      return object
 """)
         GraphTraversal.getMethods()
@@ -193,7 +205,10 @@ class Helper(object):
             if (null != returnType && Traversal.isAssignableFrom(returnType)) {
                 pythonClass.append(
                         """  def ${method}(self, *args):
-    self.traversalString = self.traversalString + ".${invertedMethodMap[method]}(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".${invertedMethodMap[method]}(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
 """)
             }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8c59f790/gremlin-variant/src/main/jython/gremlin_driver/gremlin_driver.py
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/main/jython/gremlin_driver/gremlin_driver.py b/gremlin-variant/src/main/jython/gremlin_driver/gremlin_driver.py
index c3dd4bc..86fb610 100644
--- a/gremlin-variant/src/main/jython/gremlin_driver/gremlin_driver.py
+++ b/gremlin-variant/src/main/jython/gremlin_driver/gremlin_driver.py
@@ -30,11 +30,11 @@ class Traverser(object):
 
 
 class RemoteConnection(object):
-    def __init__(self, url, scriptEngine):
+    def __init__(self, url, script_engine):
         self.url = url
-        self.scriptEngine = scriptEngine
+        self.script_engine = script_engine
 
     @abstractmethod
-    def submit(self, script):
+    def submit(self, script, bindings):
         print "sending " + script + " to GremlinServer..."
         return iter([])

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8c59f790/gremlin-variant/src/main/jython/gremlin_python/__init__.py
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/main/jython/gremlin_python/__init__.py b/gremlin-variant/src/main/jython/gremlin_python/__init__.py
index 88ad373..f5509a6 100644
--- a/gremlin-variant/src/main/jython/gremlin_python/__init__.py
+++ b/gremlin-variant/src/main/jython/gremlin_python/__init__.py
@@ -18,5 +18,18 @@ under the License.
 '''
 from gremlin_python import PythonGraphTraversal
 from gremlin_python import PythonGraphTraversalSource
+from gremlin_python import __
+from gremlin_python import statics
+from gremlin_python import B
+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
 
 __author__ = 'Marko A. Rodriguez (http://markorodriguez.com)'
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8c59f790/gremlin-variant/src/main/jython/gremlin_python/gremlin_python.py
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/main/jython/gremlin_python/gremlin_python.py b/gremlin-variant/src/main/jython/gremlin_python/gremlin_python.py
index 50b6eec..3d29af2 100644
--- a/gremlin-variant/src/main/jython/gremlin_python/gremlin_python.py
+++ b/gremlin-variant/src/main/jython/gremlin_python/gremlin_python.py
@@ -17,10 +17,21 @@ specific language governing permissions and limitations
 under the License.
 '''
 from collections import OrderedDict
+import inspect
 
 statics = OrderedDict()
 
 
+class B(object):
+  def __init__(self, symbol, value="~empty"):
+    self.symbol = symbol
+    if value == "~empty":
+      self.value = inspect.currentframe().f_back.f_locals[symbol]
+    else:
+      self.value = value
+  def __repr__(self):
+    return self.symbol
+
 class Helper(object):
   @staticmethod
   def stringOrObject(arg):
@@ -58,48 +69,49 @@ class Helper(object):
 
 
 class PythonGraphTraversalSource(object):
-  def __init__(self, traversalSourceString, remoteConnection):
-    self.traversalSourceString = traversalSourceString
-    self.remoteConnection = remoteConnection
+  def __init__(self, traversal_source_string, remote_connection=None):
+    self.traversal_source_string = traversal_source_string
+    self.remote_connection = remote_connection
   def __repr__(self):
-    if self.remoteConnection is None:
-      return "graphtraversalsource[no connection, " + self.traversalSourceString + "]"
+    if self.remote_connection is None:
+      return "graphtraversalsource[no connection, " + self.traversal_source_string + "]"
     else:
-      return "graphtraversalsource[" + str(self.remoteConnection) + ", " + self.traversalSourceString + "]"
+      return "graphtraversalsource[" + str(self.remote_connection) + ", " + self.traversal_source_string + "]"
   def E(self, *args):
-    return PythonGraphTraversal(self.traversalSourceString + ".E(" + Helper.stringify(*args) + ")", self.remoteConnection)
+    return PythonGraphTraversal(self.traversal_source_string + ".E(" + Helper.stringify(*args) + ")", self.remote_connection)
   def V(self, *args):
-    return PythonGraphTraversal(self.traversalSourceString + ".V(" + Helper.stringify(*args) + ")", self.remoteConnection)
+    return PythonGraphTraversal(self.traversal_source_string + ".V(" + Helper.stringify(*args) + ")", self.remote_connection)
   def addV(self, *args):
-    return PythonGraphTraversal(self.traversalSourceString + ".addV(" + Helper.stringify(*args) + ")", self.remoteConnection)
+    return PythonGraphTraversal(self.traversal_source_string + ".addV(" + Helper.stringify(*args) + ")", self.remote_connection)
   def clone(self, *args):
-    return PythonGraphTraversalSource(self.traversalSourceString + ".clone(" + Helper.stringify(*args) + ")", self.remoteConnection)
+    return PythonGraphTraversalSource(self.traversal_source_string + ".clone(" + Helper.stringify(*args) + ")", self.remote_connection)
   def inject(self, *args):
-    return PythonGraphTraversal(self.traversalSourceString + ".inject(" + Helper.stringify(*args) + ")", self.remoteConnection)
+    return PythonGraphTraversal(self.traversal_source_string + ".inject(" + Helper.stringify(*args) + ")", self.remote_connection)
   def withBulk(self, *args):
-    return PythonGraphTraversalSource(self.traversalSourceString + ".withBulk(" + Helper.stringify(*args) + ")", self.remoteConnection)
+    return PythonGraphTraversalSource(self.traversal_source_string + ".withBulk(" + Helper.stringify(*args) + ")", self.remote_connection)
   def withComputer(self, *args):
-    return PythonGraphTraversalSource(self.traversalSourceString + ".withComputer(" + Helper.stringify(*args) + ")", self.remoteConnection)
+    return PythonGraphTraversalSource(self.traversal_source_string + ".withComputer(" + Helper.stringify(*args) + ")", self.remote_connection)
   def withPath(self, *args):
-    return PythonGraphTraversalSource(self.traversalSourceString + ".withPath(" + Helper.stringify(*args) + ")", self.remoteConnection)
+    return PythonGraphTraversalSource(self.traversal_source_string + ".withPath(" + Helper.stringify(*args) + ")", self.remote_connection)
   def withSack(self, *args):
-    return PythonGraphTraversalSource(self.traversalSourceString + ".withSack(" + Helper.stringify(*args) + ")", self.remoteConnection)
+    return PythonGraphTraversalSource(self.traversal_source_string + ".withSack(" + Helper.stringify(*args) + ")", self.remote_connection)
   def withSideEffect(self, *args):
-    return PythonGraphTraversalSource(self.traversalSourceString + ".withSideEffect(" + Helper.stringify(*args) + ")", self.remoteConnection)
+    return PythonGraphTraversalSource(self.traversal_source_string + ".withSideEffect(" + Helper.stringify(*args) + ")", self.remote_connection)
   def withStrategies(self, *args):
-    return PythonGraphTraversalSource(self.traversalSourceString + ".withStrategies(" + Helper.stringify(*args) + ")", self.remoteConnection)
+    return PythonGraphTraversalSource(self.traversal_source_string + ".withStrategies(" + Helper.stringify(*args) + ")", self.remote_connection)
   def withoutStrategies(self, *args):
-    return PythonGraphTraversalSource(self.traversalSourceString + ".withoutStrategies(" + Helper.stringify(*args) + ")", self.remoteConnection)
+    return PythonGraphTraversalSource(self.traversal_source_string + ".withoutStrategies(" + Helper.stringify(*args) + ")", self.remote_connection)
 
 
 class PythonGraphTraversal(object):
-  def __init__(self, traversalString, remoteConnection=None):
-    self.traversalString = traversalString
-    self.remoteConnection = remoteConnection
+  def __init__(self, traversal_string, remote_connection=None):
+    self.traversal_string = traversal_string
+    self.remote_connection = remote_connection
     self.results = None
-    self.lastTraverser = None
+    self.last_traverser = None
+    self.bindings = {}
   def __repr__(self):
-    return self.traversalString
+    return self.traversal_string
   def __getitem__(self,index):
     if type(index) is int:
       return self.range(index,index+1)
@@ -115,313 +127,613 @@ class PythonGraphTraversal(object):
     return list(iter(self))
   def next(self):
      if self.results is None:
-        self.results = self.remoteConnection.submit(self.traversalString)
-     if self.lastTraverser is None:
-         self.lastTraverser = self.results.next()
-     object = self.lastTraverser.object
-     self.lastTraverser.bulk = self.lastTraverser.bulk - 1
-     if self.lastTraverser.bulk <= 0:
-         self.lastTraverser = None
+        self.results = self.remote_connection.submit(self.traversal_string, self.bindings)
+     if self.last_traverser is None:
+         self.last_traverser = self.results.next()
+     object = self.last_traverser.object
+     self.last_traverser.bulk = self.last_traverser.bulk - 1
+     if self.last_traverser.bulk <= 0:
+         self.last_traverser = None
      return object
   def V(self, *args):
-    self.traversalString = self.traversalString + ".V(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".V(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def _and(self, *args):
-    self.traversalString = self.traversalString + ".and(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".and(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def _as(self, *args):
-    self.traversalString = self.traversalString + ".as(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".as(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def _from(self, *args):
-    self.traversalString = self.traversalString + ".from(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".from(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def _in(self, *args):
-    self.traversalString = self.traversalString + ".in(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".in(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def _is(self, *args):
-    self.traversalString = self.traversalString + ".is(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".is(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def _not(self, *args):
-    self.traversalString = self.traversalString + ".not(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".not(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def _or(self, *args):
-    self.traversalString = self.traversalString + ".or(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".or(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def addE(self, *args):
-    self.traversalString = self.traversalString + ".addE(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".addE(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def addInE(self, *args):
-    self.traversalString = self.traversalString + ".addInE(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".addInE(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def addOutE(self, *args):
-    self.traversalString = self.traversalString + ".addOutE(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".addOutE(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def addV(self, *args):
-    self.traversalString = self.traversalString + ".addV(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".addV(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def aggregate(self, *args):
-    self.traversalString = self.traversalString + ".aggregate(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".aggregate(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def asAdmin(self, *args):
-    self.traversalString = self.traversalString + ".asAdmin(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".asAdmin(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def barrier(self, *args):
-    self.traversalString = self.traversalString + ".barrier(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".barrier(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def both(self, *args):
-    self.traversalString = self.traversalString + ".both(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".both(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def bothE(self, *args):
-    self.traversalString = self.traversalString + ".bothE(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".bothE(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def bothV(self, *args):
-    self.traversalString = self.traversalString + ".bothV(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".bothV(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def branch(self, *args):
-    self.traversalString = self.traversalString + ".branch(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".branch(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def by(self, *args):
-    self.traversalString = self.traversalString + ".by(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".by(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def cap(self, *args):
-    self.traversalString = self.traversalString + ".cap(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".cap(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def choose(self, *args):
-    self.traversalString = self.traversalString + ".choose(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".choose(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def coalesce(self, *args):
-    self.traversalString = self.traversalString + ".coalesce(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".coalesce(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def coin(self, *args):
-    self.traversalString = self.traversalString + ".coin(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".coin(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def constant(self, *args):
-    self.traversalString = self.traversalString + ".constant(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".constant(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def count(self, *args):
-    self.traversalString = self.traversalString + ".count(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".count(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def cyclicPath(self, *args):
-    self.traversalString = self.traversalString + ".cyclicPath(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".cyclicPath(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def dedup(self, *args):
-    self.traversalString = self.traversalString + ".dedup(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".dedup(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def drop(self, *args):
-    self.traversalString = self.traversalString + ".drop(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".drop(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def emit(self, *args):
-    self.traversalString = self.traversalString + ".emit(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".emit(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def filter(self, *args):
-    self.traversalString = self.traversalString + ".filter(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".filter(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def flatMap(self, *args):
-    self.traversalString = self.traversalString + ".flatMap(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".flatMap(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def fold(self, *args):
-    self.traversalString = self.traversalString + ".fold(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".fold(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def group(self, *args):
-    self.traversalString = self.traversalString + ".group(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".group(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def groupCount(self, *args):
-    self.traversalString = self.traversalString + ".groupCount(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".groupCount(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def groupV3d0(self, *args):
-    self.traversalString = self.traversalString + ".groupV3d0(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".groupV3d0(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def has(self, *args):
-    self.traversalString = self.traversalString + ".has(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".has(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def hasId(self, *args):
-    self.traversalString = self.traversalString + ".hasId(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".hasId(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def hasKey(self, *args):
-    self.traversalString = self.traversalString + ".hasKey(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".hasKey(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def hasLabel(self, *args):
-    self.traversalString = self.traversalString + ".hasLabel(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".hasLabel(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def hasNot(self, *args):
-    self.traversalString = self.traversalString + ".hasNot(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".hasNot(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def hasValue(self, *args):
-    self.traversalString = self.traversalString + ".hasValue(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".hasValue(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def id(self, *args):
-    self.traversalString = self.traversalString + ".id(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".id(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def identity(self, *args):
-    self.traversalString = self.traversalString + ".identity(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".identity(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def inE(self, *args):
-    self.traversalString = self.traversalString + ".inE(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".inE(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def inV(self, *args):
-    self.traversalString = self.traversalString + ".inV(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".inV(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def inject(self, *args):
-    self.traversalString = self.traversalString + ".inject(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".inject(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def iterate(self, *args):
-    self.traversalString = self.traversalString + ".iterate(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".iterate(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def key(self, *args):
-    self.traversalString = self.traversalString + ".key(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".key(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def label(self, *args):
-    self.traversalString = self.traversalString + ".label(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".label(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def limit(self, *args):
-    self.traversalString = self.traversalString + ".limit(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".limit(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def local(self, *args):
-    self.traversalString = self.traversalString + ".local(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".local(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def loops(self, *args):
-    self.traversalString = self.traversalString + ".loops(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".loops(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def map(self, *args):
-    self.traversalString = self.traversalString + ".map(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".map(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def mapKeys(self, *args):
-    self.traversalString = self.traversalString + ".mapKeys(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".mapKeys(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def mapValues(self, *args):
-    self.traversalString = self.traversalString + ".mapValues(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".mapValues(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def match(self, *args):
-    self.traversalString = self.traversalString + ".match(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".match(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def max(self, *args):
-    self.traversalString = self.traversalString + ".max(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".max(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def mean(self, *args):
-    self.traversalString = self.traversalString + ".mean(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".mean(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def min(self, *args):
-    self.traversalString = self.traversalString + ".min(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".min(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def option(self, *args):
-    self.traversalString = self.traversalString + ".option(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".option(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def optional(self, *args):
-    self.traversalString = self.traversalString + ".optional(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".optional(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def order(self, *args):
-    self.traversalString = self.traversalString + ".order(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".order(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def otherV(self, *args):
-    self.traversalString = self.traversalString + ".otherV(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".otherV(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def out(self, *args):
-    self.traversalString = self.traversalString + ".out(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".out(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def outE(self, *args):
-    self.traversalString = self.traversalString + ".outE(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".outE(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def outV(self, *args):
-    self.traversalString = self.traversalString + ".outV(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".outV(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def pageRank(self, *args):
-    self.traversalString = self.traversalString + ".pageRank(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".pageRank(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def path(self, *args):
-    self.traversalString = self.traversalString + ".path(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".path(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def peerPressure(self, *args):
-    self.traversalString = self.traversalString + ".peerPressure(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".peerPressure(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def profile(self, *args):
-    self.traversalString = self.traversalString + ".profile(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".profile(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def program(self, *args):
-    self.traversalString = self.traversalString + ".program(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".program(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def project(self, *args):
-    self.traversalString = self.traversalString + ".project(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".project(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def properties(self, *args):
-    self.traversalString = self.traversalString + ".properties(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".properties(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def property(self, *args):
-    self.traversalString = self.traversalString + ".property(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".property(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def propertyMap(self, *args):
-    self.traversalString = self.traversalString + ".propertyMap(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".propertyMap(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def range(self, *args):
-    self.traversalString = self.traversalString + ".range(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".range(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def repeat(self, *args):
-    self.traversalString = self.traversalString + ".repeat(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".repeat(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def sack(self, *args):
-    self.traversalString = self.traversalString + ".sack(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".sack(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def sample(self, *args):
-    self.traversalString = self.traversalString + ".sample(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".sample(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def select(self, *args):
-    self.traversalString = self.traversalString + ".select(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".select(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def sideEffect(self, *args):
-    self.traversalString = self.traversalString + ".sideEffect(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".sideEffect(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def simplePath(self, *args):
-    self.traversalString = self.traversalString + ".simplePath(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".simplePath(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def store(self, *args):
-    self.traversalString = self.traversalString + ".store(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".store(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def subgraph(self, *args):
-    self.traversalString = self.traversalString + ".subgraph(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".subgraph(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def sum(self, *args):
-    self.traversalString = self.traversalString + ".sum(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".sum(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def tail(self, *args):
-    self.traversalString = self.traversalString + ".tail(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".tail(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def timeLimit(self, *args):
-    self.traversalString = self.traversalString + ".timeLimit(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".timeLimit(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def times(self, *args):
-    self.traversalString = self.traversalString + ".times(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".times(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def to(self, *args):
-    self.traversalString = self.traversalString + ".to(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".to(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def toE(self, *args):
-    self.traversalString = self.traversalString + ".toE(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".toE(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def toV(self, *args):
-    self.traversalString = self.traversalString + ".toV(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".toV(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def tree(self, *args):
-    self.traversalString = self.traversalString + ".tree(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".tree(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def unfold(self, *args):
-    self.traversalString = self.traversalString + ".unfold(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".unfold(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def union(self, *args):
-    self.traversalString = self.traversalString + ".union(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".union(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def until(self, *args):
-    self.traversalString = self.traversalString + ".until(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".until(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def value(self, *args):
-    self.traversalString = self.traversalString + ".value(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".value(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def valueMap(self, *args):
-    self.traversalString = self.traversalString + ".valueMap(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".valueMap(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def values(self, *args):
-    self.traversalString = self.traversalString + ".values(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".values(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
   def where(self, *args):
-    self.traversalString = self.traversalString + ".where(" + Helper.stringify(*args) + ")"
+    self.traversal_string = self.traversal_string + ".where(" + Helper.stringify(*args) + ")"
+    for arg in args:
+      if type(arg) is B:
+        self.bindings[arg.symbol] = arg.value
     return self
 
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8c59f790/gremlin-variant/src/main/jython/gremlin_rest_driver/gremlin_rest_driver.py
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/main/jython/gremlin_rest_driver/gremlin_rest_driver.py b/gremlin-variant/src/main/jython/gremlin_rest_driver/gremlin_rest_driver.py
index a9d8944..8198701 100644
--- a/gremlin-variant/src/main/jython/gremlin_rest_driver/gremlin_rest_driver.py
+++ b/gremlin-variant/src/main/jython/gremlin_rest_driver/gremlin_rest_driver.py
@@ -25,14 +25,15 @@ __author__ = 'Marko A. Rodriguez (http://markorodriguez.com)'
 
 
 class RESTRemoteConnection(RemoteConnection):
-    def __init__(self, url, scriptEngine):
-        RemoteConnection.__init__(self, url, scriptEngine)
+    def __init__(self, url, script_engine):
+        RemoteConnection.__init__(self, url, script_engine)
 
     def __repr__(self):
         return "RESTRemoteConnection[" + self.url + "]"
 
-    def submit(self, script):
-        response = requests.post(self.url, data=json.dumps({"gremlin": script}))
+    def submit(self, script, bindings):
+        response = requests.post(self.url, data=json.dumps(
+            {"gremlin": script, "language": self.script_engine, "bindings": bindings}))
         if response.status_code != requests.codes.ok:
             raise BaseException(response.text)
         results = []

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8c59f790/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonVariantConverter.java
----------------------------------------------------------------------
diff --git a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonVariantConverter.java b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonVariantConverter.java
index 004d4e7..d488bed 100644
--- a/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonVariantConverter.java
+++ b/gremlin-variant/src/test/java/org/apache/tinkerpop/gremlin/process/variant/python/PythonVariantConverter.java
@@ -68,7 +68,7 @@ public class PythonVariantConverter implements VariantConverter {
 
     static {
         try {
-            final String rootPackageName = (new File("gremlin-variants").exists() ? "gremlin-variants/" : "") + "src/main/jython/";
+            final String rootPackageName = (new File("gremlin-variant").exists() ? "gremlin-variant/" : "") + "src/main/jython/";
             final String gremlinPythonPackageName = rootPackageName + "/gremlin_python";
             final String gremlinDriverPackageName = rootPackageName + "/gremlin_driver";
             final String gremlinPythonModuleName = gremlinPythonPackageName + "/gremlin_python.py";