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. >>>>>>> >>>>>> >>>>> >>>> >>> >> >