it would be nice if we had some consistency in the community around naming of these things. I think that
gremlin-php gremlin-scala gremlin-go gremlin-python gremlin-whatever should be the official Gremlin Language Variant naming patterns. That''s especially true if the other parallel thread to this has community consensus that these things should become TinkerPop maintained projects. On Thu, Apr 21, 2016 at 10:59 AM, Dylan Millikin <dylan.milli...@gmail.com> wrote: > Hey, gremlin-php being the driver do you mean making some sort of > gremlin-php-language library that would then leverage the driver? > Any suggestion with naming more than welcome here. natural-gremlin-php? > > On Thu, Apr 21, 2016 at 10:52 AM, Marko Rodriguez <okramma...@gmail.com> > wrote: > > > Hello, > > > > So, I had to move the tutorial to 3.2.x+ branch because it uses the new > > TraversalSource API. Thus, the new URL for the DRAFT tutorial is here: > > > > > > > http://tinkerpop.apache.org/docs/3.2.1-SNAPSHOT/tutorials/gremlin-language-variants/ > > > > I think this is near complete. Here are some things I would like to add > > before calling it quits: > > > > 1. I would like to make a head-nod at least to JINI. I didn't > feel > > that it was worth going into that model in the tutorial. Most people > won't > > do that. > > 2. I would like to work with Mark to make Gremlinpy "compliant" > > and then promote Gremlinpy at the end. > > 3. I would like to work with Dylan to make Gremlin-PHP > "compliant" > > and then promote Gremlin-PHP at the end. > > 4. Any recommendations you may have… ? > > > > Thank you, > > Marko. > > > > http://markorodriguez.com > > > > On Apr 20, 2016, at 5:36 PM, Marko Rodriguez <okramma...@gmail.com> > wrote: > > > > > Hello, > > > > > > I have pure Python talking to GremlinServer now via David Brown's > > gremlin-python WebSocket driver. > > > > > > > > > http://tinkerpop.apache.org/docs/3.1.3-SNAPSHOT/tutorials/gremlin-language-variants/#using-python-and-gremlin-server > > > > > > I haven't updated the text, but you can see the Groovy script that > > generates the code. Slicky. > > > > > > Here it is in action: > > > > > > >>> execfile("/Users/marko/Desktop/gremlin-python.py") > > > >>> g = PythonGraphTraversalSource("g") > > > >>> > g.V().hasLabel("person").repeat(__.out()).times(2).name[0:2].toList() > > > [u'ripple', u'lop'] > > > >>> m = > > g.V().hasLabel("person").repeat(__.out()).times(2).name[0:2].toList() > > > >>> type(m) > > > <type 'list'> > > > >>> g.V().out("created").count().toList() > > > [4] > > > >>> g.V().out("created").groupCount().by("name").toList() > > > [{u'ripple': 1, u'lop': 3}] > > > >>> > > > > > > Criznazy, > > > Marko. > > > > > > http://markorodriguez.com > > > > > > On Apr 20, 2016, at 2:25 PM, Marko Rodriguez <okramma...@gmail.com> > > wrote: > > > > > >> Hi, > > >> > > >> I added the pure Python model: > > >> > > >> > > > http://tinkerpop.apache.org/docs/3.1.3-SNAPSHOT/tutorials/gremlin-language-variants/#using-python-and-gremlin-server > > >> > > >> So this section just ends with a generated String. It would be neat to > > show David Brown's python driver library submitted that string and > getting > > back a result set. Anyone have the patience to set up GremlinServer and > > import python driver module and "do the do" ? > > >> > > >> Also note the section on "Language Drivers vs. Language Variants." > > >> > > > http://tinkerpop.apache.org/docs/3.1.3-SNAPSHOT/tutorials/gremlin-language-variants/ > > (forgot to a href anchor it -- scroll down) > > >> > > >> Finally, here is the generate gremlin-python.py file. > > >> > > > https://github.com/apache/incubator-tinkerpop/blob/TINKERPOP-1232/docs/static/resources/gremlin-python.py > > >> > > >> Take care, > > >> Marko. > > >> > > >> http://markorodriguez.com > > >> > > >> On Apr 20, 2016, at 1:20 PM, Marko Rodriguez <okramma...@gmail.com> > > wrote: > > >> > > >>> Hi Dylan, > > >>> > > >>>> That's a nice article on Jython. I can confirm that the same can be > > >>>> accomplished with PHP. I actually like the script to generate the > > >>>> traversal. It's more effort but is more IDE friendly than using > magic > > >>>> methods. > > >>> > > >>> Great. Its still DRAFT so please provide ideas/directions. > > >>> > > >>>> To bounce off of the Python->Gremlin-Groovy(String). How would that > > work > > >>>> with bindings? For instance how would one write the following groovy > > script: > > >>>> > > >>>> a = "person";b = "name";c = "marko"; > > >>>> g.V().has(a, b, c); > > >>>> > > >>>> (I think it's important to support multiline queries as the > > gremlin-server > > >>>> communication overhead is pretty significant) > > >>> > > >>> I don't know yet. Perhaps, in Python, you write: > > >>> > > >>> g.V().has("#a") to denote that you want the #a-string to be a > variable > > and thus, the compilation is g.V().has(a). Then its up to the language > > driver to determine how bindings are declared. > > >>> > > >>> Thoughts?, > > >>> Marko. > > >>> > > >>> http://markorodriguez.com > > >>> > > >>> > > >>>> > > >>>> On Wed, Apr 20, 2016 at 12:09 PM, Marko Rodriguez < > > okramma...@gmail.com> > > >>>> wrote: > > >>>> > > >>>>> Hi, > > >>>>> > > >>>>> Here is a published SNAPSHOT DRAFT of what I have so far for the > > tutorial. > > >>>>> > > >>>>> > > > http://tinkerpop.apache.org/docs/3.1.3-SNAPSHOT/tutorials/gremlin-language-variants/ > > >>>>> > > >>>>> I've asked Ketrina to do a new graphic for this. It will be CrAzY. > > >>>>> > > >>>>> The gremlin-jython.py link is broken as I didn't do a full doc > > build. Its > > >>>>> here to look at if you are interested: > > >>>>> > > >>>>> > > > https://github.com/apache/incubator-tinkerpop/blob/TINKERPOP-1232/docs/static/resources/gremlin-jython.py > > >>>>> > > >>>>> Marko. > > >>>>> > > >>>>> http://markorodriguez.com > > >>>>> > > >>>>> On Apr 19, 2016, at 10:08 PM, 8trk <mark.hender...@8trk.com> > wrote: > > >>>>> > > >>>>>> Ha. That is very cool. You can easily just rewrite that for PHP > and > > >>>>> probably Ruby too and have working native interfaces. > > >>>>>> > > >>>>>> I updated my Gist to work with your examples. I had to update > > Gremlinpy > > >>>>> because I didn’t define __ correctly (thanks! this was a fun > > challenge). > > >>>>>> > > >>>>>> https://gist.github.com/emehrkay/68a9e64789826f6a59e8b5c837dd6ce4 > < > > >>>>> https://gist.github.com/emehrkay/68a9e64789826f6a59e8b5c837dd6ce4> > > >>>>>> > > >>>>>> > > >>>>>>> On Apr 19, 2016, at 11:55 PM, Marko Rodriguez < > > okramma...@gmail.com> > > >>>>> wrote: > > >>>>>>> > > >>>>>>> Hi, > > >>>>>>> > > >>>>>>>> I think adhering to the Gremlin-Java interface is a great idea > > exactly > > >>>>> for the reasons that you stated. > > >>>>>>>> The main reason that I didn’t map one-to-one with the native > > interface > > >>>>> is because I wasn’t too sure how to do so, I knew that there was a > > lot of > > >>>>> method overloading which isn’t possible in either of the languages > > that I > > >>>>> wrote this in (Python/PHP), and I figured this approach would be > more > > >>>>> flexible with regard to changes in the language (to make it TP3 all > > I had > > >>>>> to do was define all of the predicates check for them when they’re > > passed > > >>>>> into functions). > > >>>>>>> > > >>>>>>> Check this out. Here is a Groovy script the generates the Python > > >>>>> traversal class. > > >>>>>>> > > >>>>>>> > https://gist.github.com/okram/940adc02834a97a7187d3da57cbf3227 > > >>>>>>> - super simple. > > >>>>>>> > > >>>>>>> Thus, no need to fat finger anything in and you know you have > every > > >>>>> method implemented. Moreover, every release, just generate the > > Python class > > >>>>> by running this script in the Gremlin Console. And it just works: > > >>>>>>> > > >>>>>>>>>> g.V().has("name","marko") > > >>>>>>> g.V().has("name", "marko") > > >>>>>>>>>> g.V().has("person","name","marko") > > >>>>>>> g.V().has("person", "name", "marko") > > >>>>>>>>>> g.V().where(out("knows")) > > >>>>>>> g.V().where(__.out("knows")) > > >>>>>>>>>> > > g.V()._as("a").out("created")._as("b").where(_as("a").out("knows")) > > >>>>>>> > g.V().as("a").out("created").as("b").where(__.as("a").out("knows")) > > >>>>>>>>>> g.V().match(_as("a").out("knows")._as("b"), > > >>>>> _as("b").out("knows")._as("a")) > > >>>>>>> g.V().match(__.as("a").out("knows").as("b"), > > >>>>> __.as("b").out("knows").as("a")) > > >>>>>>>>>> > > >>>>> > > g.V().hasLabel("person").has("age",gt(30)).out("created","knows").name > > >>>>>>> g.V().hasLabel("person").has("age", P.gt(30)).out("created", > > >>>>> "knows").values("name") > > >>>>>>> > > >>>>>>> > > >>>>>>>> The more that I think about it, I think that Gremlinpy’s aim was > > to be > > >>>>> able to write Groovy in Python. That is the main reason why I > didn’t > > choose > > >>>>> just straight-up string concatenation — I needed to be able to do > > things > > >>>>> like if clauses or closures or really compounded queries. (In > Gizmo, > > my > > >>>>> OGM, I’ve built some pretty dense queries to send to the Gremlin > > server). > > >>>>>>> > > >>>>>>> Yea, the closures are the hard part. I saw that in Python you can > > walk > > >>>>> the syntax tree of a closure :) … nasty. > > >>>>>>> > > >>>>>>>> Your approach is clearly closer to to Gremlin-Java interface and > > we > > >>>>> should probably use some variant of it going forward. I quickly > took > > that > > >>>>> interface and used Gremlinpy to handle all of the processing as > seen > > in > > >>>>> this gist: > > >>>>> https://gist.github.com/emehrkay/68a9e64789826f6a59e8b5c837dd6ce4 > > >>>>>>> > > >>>>>>> Interesting. See how it does with my auto-code generator. Also, I > > want > > >>>>> to steal your P, T constructs as I think you do that better in > > Gremlinpy. > > >>>>>>> > > >>>>>>> Marko. > > >>>>>>> > > >>>>>>> http://markorodriguez.com > > >>>>>>> > > >>>>>>>> > > >>>>>>>> > > >>>>>>>>> On Apr 19, 2016, at 10:54 PM, Marko Rodriguez < > > okramma...@gmail.com> > > >>>>> wrote: > > >>>>>>>>> > > >>>>>>>>> Hi, > > >>>>>>>>> > > >>>>>>>>> Sweet -- your dev@ mail works now. > > >>>>>>>>> > > >>>>>>>>>> I think you are on to something with this code example. > > Gremlinpy > > >>>>> does this, but a bit differently. It uses Python’s magic methods to > > >>>>> dynamically build a linked list. > > >>>>>>>>>> > > >>>>>>>>>> So when you do something like > > >>>>>>>>>> > > >>>>>>>>>> g = Gremlin() > > >>>>>>>>>> g.function() > > >>>>>>>>>> > > >>>>>>>>>> It creates simply adds an gremlinpy.gremlin.Function object to > > the > > >>>>> queue. That object has the parameters to send once the linked list > is > > >>>>> converted to a string. > > >>>>>>>>> > > >>>>>>>>> Why would you create a queue and not just concatenate a String? > > >>>>>>>>> > > >>>>>>>>>> Check out the readme for a few more examples (it can do things > > like > > >>>>> add pre-defined statements to the chain, nesting Gremlin instances, > > and > > >>>>> manually binding params) https://github.com/emehrkay/gremlinpy < > > >>>>> https://github.com/emehrkay/gremlinpy> > > >>>>>>>>> > > >>>>>>>>> Ah, parameter bindings. Hmm… > > >>>>>>>>> > > >>>>>>>>>> I think that a very simple linked list build with a fluid > > interface > > >>>>> and few predefined object types may be a good approach to defining > a > > native > > >>>>> way to represent a Gremlin query. > > >>>>>>>>>> > > >>>>>>>>>> What do you think? > > >>>>>>>>> > > >>>>>>>>> It would be really clean if there was GraphTraversalSource, > > >>>>> GraphTraversal, and __ Traversal without any "extra methods." In > > Gremlinpy > > >>>>> README I see lots of other methods off of "g" that are not > > Gremlin-Java > > >>>>> methods. It would be cool if it was a direct map of Gremlin-Java > > (like > > >>>>> Gremlin-Groovy and Gremlin-Scala). Where the only deviations are > > things > > >>>>> like _in(), _as(), etc and any nifty language tricks like > g.V().name > > or > > >>>>> g.V().out()[0:10]. This way, we instill in the designers that any > > Gremlin > > >>>>> language variant should be "identical," where (within reason) the > > docs for > > >>>>> Gremlin-Java are just as useful to Gremlinpy people. Furthermore, > by > > >>>>> stressing this, we ensure that variants don't deviate and go down > > their own > > >>>>> syntax/constructs path. For instance, I see g.v(12) instead of > > g.V(12). > > >>>>> When a Gremlin language variant wants to do something new, we > should > > argue > > >>>>> -- "submit a PR to Gremlin-Java w/ your desired addition" as > Apache's > > >>>>> Gremlin-Java should be considered the standard/idiomatic > > representation of > > >>>>> Gremlin. > > >>>>>>>>> > > >>>>>>>>> Finally, it would be cool to have a tool that introspected on > > >>>>> Gremlin-Java and verified that Gremlinpy had all the methods > > implemented. > > >>>>> Another thing to stress to language variant designers -- make sure > > you are > > >>>>> in sync with every version so write a test case that does such > > >>>>> introspection. > > >>>>>>>>> > > >>>>>>>>> Thoughts?, > > >>>>>>>>> Marko. > > >>>>>>>>> > > >>>>>>>>> http://markorodriguez.com > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>>>> On Apr 19, 2016, at 10:19 PM, Marko Rodriguez < > > okramma...@gmail.com> > > >>>>> wrote: > > >>>>>>>>>>> > > >>>>>>>>>>> Hello, > > >>>>>>>>>>> > > >>>>>>>>>>> Okay, so I got into a groove. Here is > > >>>>> Python->Gremlin-Groovy(String). This is pure Python -- nothing > > Jython going > > >>>>> on here. > > >>>>>>>>>>> > > >>>>>>>>>>> > https://gist.github.com/okram/4705fed038dde673f4c5323416899992 > > >>>>>>>>>>> > > >>>>>>>>>>> Here it is in action: > > >>>>>>>>>>> > > >>>>>>>>>>> # create a traversal source (stupid class name, I know) > > >>>>>>>>>>>>>> g = PythonStringGraphTraversalSource("g") > > >>>>>>>>>>> > > >>>>>>>>>>> # simple warmup > > >>>>>>>>>>>>>> g.V().has("name","marko") > > >>>>>>>>>>> g.V().has("name", "marko") > > >>>>>>>>>>> > > >>>>>>>>>>> # one has()-method, but varargs parsing is smart > > >>>>>>>>>>>>>> g.V().has("person","name","marko") > > >>>>>>>>>>> g.V().has("person", "name", "marko") > > >>>>>>>>>>> > > >>>>>>>>>>> # strings and numbers mixed > > >>>>>>>>>>>>>> g.V().has("person","age",32) > > >>>>>>>>>>> g.V().has("person", "age", 32) > > >>>>>>>>>>> > > >>>>>>>>>>> # nested anonymous traversal > > >>>>>>>>>>>>>> g.V().where(out("knows")) > > >>>>>>>>>>> g.V().where(__.out("knows")) > > >>>>>>>>>>> > > >>>>>>>>>>> # as() is reserved in Python, so _as() is used. > > >>>>>>>>>>>>>> > > >>>>> g.V()._as("a").out("created")._as("b").where(_as("a").out("knows")) > > >>>>>>>>>>> > > g.V().as("a").out("created").as("b").where(__.as("a").out("knows")) > > >>>>>>>>>>> > > >>>>>>>>>>> # multi-traversal match() > > >>>>>>>>>>>>>> g.V().match(_as("a").out("knows")._as("b"), > > >>>>> _as("b").out("knows")._as("a")) > > >>>>>>>>>>> g.V().match(__.as("a").out("knows").as("b"), > > >>>>> __.as("b").out("knows").as("a")) > > >>>>>>>>>>> > > >>>>>>>>>>> # P-predicates and .name-sugar (attribute access > interception) > > >>>>>>>>>>>>>> > > >>>>> > > g.V().hasLabel("person").has("age",gt(30)).out("created","knows").name > > >>>>>>>>>>> g.V().hasLabel("person").has("age", P.gt(30)).out("created", > > >>>>> "knows").values("name") > > >>>>>>>>>>> > > >>>>>>>>>>> # smart about boolean conversion > > >>>>>>>>>>>>>> g.V().valueMap(True,"name","age") > > >>>>>>>>>>> g.V().valueMap(true, "name", "age") > > >>>>>>>>>>> > > >>>>>>>>>>> # lambdas -- ghetto as its not a Python lambda, but a Groovy > > lambda > > >>>>> string > > >>>>>>>>>>>>>> g.V().map('it.get().value("name")') > > >>>>>>>>>>> g.V().map(it.get().value("name")) > > >>>>>>>>>>> > > >>>>>>>>>>> What other constructs are there? I think thats it… Everything > > else > > >>>>> from here is just fat fingering in all the methods. Then, from > there > > you > > >>>>> use David Brown's GremlinClient ( > > >>>>> https://github.com/davebshow/gremlinclient) to shuffle the string > > across > > >>>>> the network to GremlinServer and get back results. I suppose there > > needs to > > >>>>> be some sort of .submit() method ? …. hmmm… wondering if > > .next()/hasNext() > > >>>>> iterator methods can be used to submit automagically and then it > > feels JUST > > >>>>> like Gremlin-Java. > > >>>>>>>>>>> > > >>>>>>>>>>> @Mark: This is what Gremlinpy should do, no? > > >>>>>>>>>>> @Dylan: Can you find any Gremlin syntax hole I'm missing that > > isn't > > >>>>> solvable with the current espoused pattern? > > >>>>>>>>>>> > > >>>>>>>>>>> Good, right? > > >>>>>>>>>>> Marko. > > >>>>>>>>>>> > > >>>>>>>>>>> http://markorodriguez.com > > >>>>>>>>>>> > > >>>>>>>>>>> On Apr 19, 2016, at 4:51 PM, Marko Rodriguez < > > okramma...@gmail.com> > > >>>>> wrote: > > >>>>>>>>>>> > > >>>>>>>>>>>> Hi, > > >>>>>>>>>>>> > > >>>>>>>>>>>> Done for the night. Here is PythonStringGraphTraversal. > > >>>>>>>>>>>> > > >>>>>>>>>>>> > > https://gist.github.com/okram/4705fed038dde673f4c5323416899992 > > >>>>>>>>>>>> > > >>>>>>>>>>>> ??? Cool? > > >>>>>>>>>>>> > > >>>>>>>>>>>> Marko. > > >>>>>>>>>>>> > > >>>>>>>>>>>> http://markorodriguez.com > > >>>>>>>>>>>> > > >>>>>>>>>>>> On Apr 19, 2016, at 4:28 PM, Marko Rodriguez < > > okramma...@gmail.com> > > >>>>> wrote: > > >>>>>>>>>>>> > > >>>>>>>>>>>>> Hi, > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> So I "learned" Python and am able to do a Python class > > wrapper > > >>>>> around GraphTraversal. > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> > > >>>>> https://gist.github.com/okram/1a0c5f6b65a4b70c558537e5eeaad429 > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> Its crazy, it "just works" -- with __ static methods and > all. > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> The reason I wanted to create a wrapper is because I want > to > > use > > >>>>> Python-specific language constructs and not only Gremlin-Java. What > > those > > >>>>> specific language constructs are, I don't know as I don't know > > Python :). > > >>>>> Moreover, this shell of a wrapper will be used for the JNI and > String > > >>>>> construction models. Right? > > >>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> g = PythonGraphTraversalSource(graph) > > >>>>>>>>>>>>>>>> g > > >>>>>>>>>>>>> graphtraversalsource[tinkergraph[vertices:6 edges:6], > > standard] > > >>>>>>>>>>>>>>>> g.V() > > >>>>>>>>>>>>> [GraphStep(vertex,[])] > > >>>>>>>>>>>>>>>> g.V().toList() > > >>>>>>>>>>>>> [v[1], v[2], v[3], v[4], v[5], v[6]] > > >>>>>>>>>>>>>>>> g.V().where(__.out("created")).values("name").toList() > > >>>>>>>>>>>>> [marko, josh, peter] > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> Even valueMap() which takes var args of different types > > works. > > >>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> g.V().valueMap() > > >>>>>>>>>>>>> [GraphStep(vertex,[]), PropertyMapStep(value)] > > >>>>>>>>>>>>>>>> g.V().valueMap().toList() > > >>>>>>>>>>>>> [{name=[marko], age=[29]}, {name=[vadas], age=[27]}, > > {name=[lop], > > >>>>> lang=[java]}, {name=[josh], age=[32]}, {name=[ripple], > lang=[java]}, > > >>>>> {name=[peter], age=[35]}] > > >>>>>>>>>>>>>>>> g.V().valueMap("name").toList() > > >>>>>>>>>>>>> [{name=[marko]}, {name=[vadas]}, {name=[lop]}, > {name=[josh]}, > > >>>>> {name=[ripple]}, {name=[peter]}] > > >>>>>>>>>>>>>>>> g.V().valueMap(True,"name").toList() > > >>>>>>>>>>>>> [{label=person, name=[marko], id=1}, {label=person, > > name=[vadas], > > >>>>> id=2}, {label=software, name=[lop], id=3}, {label=person, > > name=[josh], > > >>>>> id=4}, {label=software, name=[ripple], id=5}, {label=person, > > name=[peter], > > >>>>> id=6}] > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> Easy peasy lemon squeezy or is there something fundamental > > I'm > > >>>>> missing? > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> Marko. > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> http://markorodriguez.com > > >>>>>>>>>>>>> > > >>>>>>>>>>>>> On Apr 19, 2016, at 2:58 PM, Marko Rodriguez < > > >>>>> okramma...@gmail.com> wrote: > > >>>>>>>>>>>>> > > >>>>>>>>>>>>>> Hi, > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> So I downloaded and installed Jython 2.7.0. > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> This how easy it was to get Gremlin working in Jython. > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> import sys > > >>>>>>>>>>>>>> > > >>>>> > > > sys.path.append("/Users/marko/software/tinkerpop/tinkerpop3/gremlin-console/target/apache-gremlin-console-3.2.1-SNAPSHOT-standalone/lib/commons-codec-1.9.jar") > > >>>>>>>>>>>>>> > > >>>>> > > > sys.path.append("/Users/marko/software/tinkerpop/tinkerpop3/gremlin-console/target/apache-gremlin-console-3.2.1-SNAPSHOT-standalone/lib/commons-configuration-1.10.jar") > > >>>>>>>>>>>>>> … lots of jars to add > > >>>>>>>>>>>>>> > > >>>>> > > > sys.path.append("/Users/marko/software/tinkerpop/tinkerpop3/gremlin-console/target/apache-gremlin-console-3.2.1-SNAPSHOT-standalone/ext/tinkergraph-gremlin/lib/tinkergraph-gremlin-3.2.1-SNAPSHOT.jar") > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> from org.apache.tinkerpop.gremlin.tinkergraph.structure > > import > > >>>>> TinkerFactory > > >>>>>>>>>>>>>> graph = TinkerFactory.createModern() > > >>>>>>>>>>>>>> g = graph.traversal() > > >>>>>>>>>>>>>> g > > >>>>>>>>>>>>>> g.V().hasLabel("person").out("knows").out("created") > > >>>>>>>>>>>>>> > > g.V().hasLabel("person").out("knows").out("created").toList() > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Then, the output looks like this: > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> from org.apache.tinkerpop.gremlin.tinkergraph.structure > > >>>>> import TinkerFactory > > >>>>>>>>>>>>>>>>> graph = TinkerFactory.createModern() > > >>>>>>>>>>>>>>>>> g = graph.traversal() > > >>>>>>>>>>>>>>>>> g > > >>>>>>>>>>>>>> graphtraversalsource[tinkergraph[vertices:6 edges:6], > > standard] > > >>>>>>>>>>>>>>>>> g.V().hasLabel("person").out("knows").out("created") > > >>>>>>>>>>>>>> [GraphStep(vertex,[]), HasStep([~label.eq(person)]), > > >>>>> VertexStep(OUT,[knows],vertex), VertexStep(OUT,[created],vertex)] > > >>>>>>>>>>>>>>>>> > > g.V().hasLabel("person").out("knows").out("created").toList() > > >>>>>>>>>>>>>> [v[5], v[3]] > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Note that, of course, Jython's command line doesn't > > auto-iterate > > >>>>> traversals. Besides that -- sheez, that was simple. > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> The trick now is to use Jython idioms to make > > Gremlin-Jython be > > >>>>> comfortable to Python users… > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> Marko. > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> http://markorodriguez.com > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>> On Apr 19, 2016, at 11:43 AM, Marko Rodriguez < > > >>>>> okramma...@gmail.com> wrote: > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> Hi, > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> So I just pushed: > > >>>>>>>>>>>>>>> > > >>>>> > > > https://git1-us-west.apache.org/repos/asf?p=incubator-tinkerpop.git;a=commitdiff;h=0beae616 > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> This should help provide the scaffolding for the > tutorial. > > >>>>> Given that I know nothing about Python, I think my contributions > > start to > > >>>>> fall off significantly here. :) … Well, I can help and write more > > text, I > > >>>>> just don't know how to use Jython, Python idioms, Gremlinpy, etc….. > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> @Mark/Dylan: If you want to build the tutorial and look > at > > it, > > >>>>> you simple do: > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> $ bin/process-docs.sh --dryRun > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> And then for me, the URI to which I point my browser for > > the > > >>>>> index.html on my local computer is: > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> > > >>>>> > > > file:///Users/marko/software/tinkerpop/tinkerpop3/target/docs/htmlsingle/tutorials/gremlin-language-variants/index.html > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> Marko. > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> http://markorodriguez.com > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> On Apr 19, 2016, at 9:16 AM, Marko Rodriguez < > > >>>>> okramma...@gmail.com> wrote: > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> Hello (NOTE: I dropped gremlin-users@), > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> Thank you Stephen. Its crazy how simple that is :D. > > >>>>>>>>>>>>>>>> > > >>>>> https://twitter.com/apachetinkerpop/status/722432843360546816 > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> So Mark, now your fork's TINKERPOP-1232/ branch and > > >>>>> https://github.com/apache/incubator-tinkerpop/tree/TINKERPOP-1232 > > exist > > >>>>> and we can keep them sync'd accordingly as we develop this > tutorial. > > When > > >>>>> we feel that the tutorial is ready for primetime, we will issue a > PR > > to > > >>>>> have it merged into tp31/ (and thus, up merged to master/). > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> Where do we go from here? I think this is a good > > opportunity > > >>>>> to work both on Gremlinpy and the tutorial. Can we make Gremlinpy > as > > true > > >>>>> to the spirit of "host language embedding" as possible? In doing > so, > > can we > > >>>>> explain how we did it so other language providers can learn the > best > > >>>>> practices? > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> In the tutorial we have 3 models we want to promote: > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> 1. Jython > > >>>>>>>>>>>>>>>> 2. Python JINI > > >>>>>>>>>>>>>>>> 3. Python String > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> (1) is easy to knock off. In fact, we should ask Michael > > >>>>> Pollmeier for advice here given his work on Gremlin-Scala. (2) -- > ?? > > do you > > >>>>> know how do this? If so, it should be only fairly more difficult > > than (1). > > >>>>> Finally, (3) is the big win and where I think most of the work both > > in the > > >>>>> tutorial and in Gremlinpy will happen. > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> How do you propose we proceed? > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> Thank you, > > >>>>>>>>>>>>>>>> Marko. > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> http://markorodriguez.com > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>> On Apr 19, 2016, at 8:24 AM, Stephen Mallette < > > >>>>> spmalle...@gmail.com> wrote: > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> ok - done: > > >>>>> https://github.com/apache/incubator-tinkerpop/tree/TINKERPOP-1232 > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> On Tue, Apr 19, 2016 at 9:41 AM, Marko Rodriguez < > > >>>>> okramma...@gmail.com> wrote: > > >>>>>>>>>>>>>>>>> Hello, > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> *** Mark, if you are not on dev@tinkerpop, I would > > recommend > > >>>>> joining that as I will drop gremlin-users@ from communication on > > this > > >>>>> ticket from here on out. *** > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> @Stephen: Mark forked the TinkerPop repository to his > > GitHub > > >>>>> account. I believe he gave you access as well as me. > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> Can you create a new stub tutorial for Mark+Dylan+me? > > (Moving > > >>>>> forward, I will learn how to do it from your one commit). > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> gremlin-language-variants/ > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> After that Mark+Dylan+me will go to town on: > > >>>>>>>>>>>>>>>>> https://issues.apache.org/jira/browse/TINKERPOP-1232 > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> Thank you, > > >>>>>>>>>>>>>>>>> Marko. > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> http://markorodriguez.com > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> Begin forwarded message: > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> From: Mark Henderson <nore...@github.com> > > >>>>>>>>>>>>>>>>>> Subject: emehrkay added you to incubator-tinkerpop > > >>>>>>>>>>>>>>>>>> Date: April 15, 2016 10:04:54 AM MDT > > >>>>>>>>>>>>>>>>>> To: "Marko A. Rodriguez" <okramma...@gmail.com> > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> You can now push to this repository. > > >>>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>>> --- > > >>>>>>>>>>>>>>>>>> View it on GitHub: > > >>>>>>>>>>>>>>>>>> https://github.com/emehrkay/incubator-tinkerpop > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> -- > > >>>>>>>>>>>>>>>>> You received this message because you are subscribed to > > the > > >>>>> Google Groups "Gremlin-users" group. > > >>>>>>>>>>>>>>>>> To unsubscribe from this group and stop receiving > emails > > from > > >>>>> it, send an email to gremlin-users+unsubscr...@googlegroups.com. > > >>>>>>>>>>>>>>>>> To view this discussion on the web visit > > >>>>> > > > https://groups.google.com/d/msgid/gremlin-users/18A7D2FD-B9B1-4DC9-980B-66A6A8F9C7C8%40gmail.com > > >>>>> . > > >>>>>>>>>>>>>>>>> For more options, visit > > https://groups.google.com/d/optout. > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>>>> -- > > >>>>>>>>>>>>>>>>> You received this message because you are subscribed to > > the > > >>>>> Google Groups "Gremlin-users" group. > > >>>>>>>>>>>>>>>>> To unsubscribe from this group and stop receiving > emails > > from > > >>>>> it, send an email to gremlin-users+unsubscr...@googlegroups.com. > > >>>>>>>>>>>>>>>>> To view this discussion on the web visit > > >>>>> > > > https://groups.google.com/d/msgid/gremlin-users/CAA-H43990bN1xrtkL%2BWW4Z%3DKY-bhamBuunpzmYcqVxniyv3NOw%40mail.gmail.com > > >>>>> . > > >>>>>>>>>>>>>>>>> For more options, visit > > https://groups.google.com/d/optout. > > >>>>>>>>>>>>>>>> > > >>>>>>>>>>>>>>> > > >>>>>>>>>>>>>> > > >>>>>>>>>>>>> > > >>>>>>>>>>>> > > >>>>>>>>>>> > > >>>>>>>>>> > > >>>>>>>>> > > >>>>>>>> > > >>>>>>> > > >>>>>> > > >>>>> > > >>>>> > > >>> > > >> > > > > > > > >