That is a really nice rundown. Thanks for doing that.
Marko. http://markorodriguez.com On Mar 22, 2016, at 11:45 AM, Damien Seguy <damien.se...@gmail.com> wrote: > A few notes before the list : I bring this list in the hope it may help > others to get orientation when moving from Gremlin 2 to 3. I have made > Gremlin works for me, but I have still to gain a lot of experience. > Hopefully, anyone with better knowledge will correct this humble article. > > Gremlin 3 has been around for quite some time, and gremlin 2 is dead. Time to > move code. Since this is a major version change, migration is rather steep. > It requires a lot of modifications, not just a few API names. I scanned > Gremlin 2 queries in my code, and here are the first directions that I found. > > > My context : I use Gremlin via HTTP API. The underlying database is Neo4j, > and Gremlin is running as a plug-in. The guide focuses on query building. > > g.idx('index') > g.idx('index')[['key' :'value']] is gone. The index have moved from Gremlin > to the underlying graph engine, and any index has to be created with the > engine's language. For for TitanDB, it is with Titan API ManagementSystem, > and for Neo4j, it will be Cypher. > Once the index is build, gremlin attempts to use the good indices if the > query starts with : g.V().has(). Besides that, there is nothing special do > to, nor to note. > An interesting alternative to indexing is the Subgraph() step : it creates a > partition of the graph, that may be used later as a basis for another query. > That may be a good way to prepare nodes with a large sieve, then run more > complex queries on smaller set of nodes : it's always a good strategy. Now, > if subgraphs have to be used several times, where can they be stored ? Graph > variables() or Sack() ? > Back() doesn't exist > The As() step is available, and may be coupled with Select() to access > previously named steps. Given some weird behaviors of back(), this looks > interesting. It is also useful to collect several nodes during the query and > finally return them as an array. > Lambda steps sideEffect() and Filter() are to be avoided > They are still available, though, so it makes an easy migration. At first > glance, Filter() may be replaced by WHERE() step. SideEffect() will have to > be replaced by a mix of other steps. This will require some work, and may > eventually make the queries a lot cleaner : nothing like a big string of code > inside a step to decay quickly. > The Loop() step is now called Repeat() > It comes along with modulators, Emit(), Times() and Until(). That will help > readability, and there is no more use of it.object or it.loops inside the > closures. > The GroupBy() step has been recalled Group() > It has now a named modulator called By(). This is the same evolution than > Loop(). > The Transform() step is gone. > The queries makes some usage of this step when it needs to apply some > transformation during the traversal. It may be to follow an optional link ( > transform{ if (it.out('METHOD').any()) { it.out('METHOD').next(); } else { > it; }} ) or replacing current step by an arbitrary element stored in an index > (transform{g.idx("classes")[["path":it.fullnspath]].next(); }}). Those steps > may need the most rethinking, besides replacing Transform() by sideEffect() > for the time being. > SetProperty() and RemoveProperty() are gone, and have been replaced by > Property(). I can't find explicitly the other CRUD operations, so I guess > that removing property is making it NULL ; replacing property is just adding > it again. Getting the list of properties is using valuesMap() step. > Map() is now valueMap(), with the possibility to get the all the properties, > a sub-selection of them. > More goodness > While reading the docs, Match() and TimeLimit() looks very interesting : > Match() will check that some condition applies to several sub-searches at the > same time. When searching has a path that looks like a star, it is going to > be great. > Timelimit() is a step that limits the amount of time spend on a query, and > reports any data found during that time. This looks very interesting to keep > a system reactive, as long as the user may do something with a partial > results. > > Thanks for reading : do not hesitate to correct any misconception. > I'll begin experimenting quickly with this new version of Gremlin and gain > experience. > > -- > 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/40aac944-993e-4046-9d4d-1794f957f9c1%40googlegroups.com. > For more options, visit https://groups.google.com/d/optout.