Skip to content

Release Notes

jbmusso edited this page Jul 11, 2016 · 80 revisions

Attention: this Wiki hosts an outdated version of the TinkerPop framework and Gremlin language documentation.


Gremlin: A Graph Traversal Language
http://gremlin.tinkerpop.com

Gremlin 2.y.z

Version 2.6.0 (September 17, 2014)

<dependency>
  <groupId>com.tinkerpop.gremlin</groupId>
  <artifactId>gremlin-java</artifactId>
  <version>2.6.0</version>
</dependency>

<dependency>
  <groupId>com.tinkerpop.gremlin</groupId>
  <artifactId>gremlin-groovy</artifactId>
  <version>2.6.0</version>
</dependency>
  • GremlinGroovyScriptEngine reads scripts to UTF-8.
  • GremlinGroovyScriptEngine allows for a script base class to be set.

Version 2.5.0 (April 14, 2014)

<dependency>
  <groupId>com.tinkerpop.gremlin</groupId>
  <artifactId>gremlin-java</artifactId>
  <version>2.5.0</version>
</dependency>

<dependency>
  <groupId>com.tinkerpop.gremlin</groupId>
  <artifactId>gremlin-groovy</artifactId>
  <version>2.5.0</version>
</dependency>
  • Added a plugin system for the Gremlin Console that allows external libraries to extend the Gremlin environment
    • Remove Grape from imports as it is replaced by Gremlin.use()
    • Add Gremlin.deps() to list imported dependencies
  • Added g.tryTx to execute transactions with retry capabilities
  • Fixed a property/method caching bug
  • gremlin.sh accepts more than nine parameters
  • Changed support from DEX to Sparksee

Version 2.4.0 (August 4, 2013)

<dependency>
  <groupId>com.tinkerpop.gremlin</groupId>
  <artifactId>gremlin-java</artifactId>
  <version>2.4.0</version>
</dependency>

<dependency>
  <groupId>com.tinkerpop.gremlin</groupId>
  <artifactId>gremlin-groovy</artifactId>
  <version>2.4.0</version>
</dependency>
  • Added loader support for SailGraph.saveRDF
  • Added GremlinPipeline.cast to allow pipeline end type to be reset
  • Added GraphQueryPipe and support for Graph index query optimization via pipeline rewriting
  • Added support for has(key,predicate,value) as dictated by new Blueprints Query API changes
  • Added support for has(key) and hasNot(key) to identify the existence of an element key
  • Additions to the HasStepTest and HasNotStepTest test suites
  • Moved all pipe definitions to Pipes package (greatly reduced the size of Gremlin as a project)
  • Moved gremlin.sh and gremlin.bat to bin/ (noticeable to developers of source only)
  • Added GremlinStartPipe to better handle graph as the root of a GremlinPipeline
  • Fixed a double iterator() call in GremlinPipeline
  • Allow use of Grape from the console to dynamically import packages
  • Generalized the console iterator using ToStringPipe in Pipes
  • Solved the QueryPipe support for when the last statement is an edge-statement
  • Code simplification around GraphQuery and VertexQuery related traversals
  • Updated test cases to use Iterator and thus, made typing more general for more stringent Gremlin implementations
  • Updated test cases to support the testing of both optimized and non-optimized GremlinPipelines
  • Deprecated all numbered steps in favor of as-based steps
  • Added branch factor support for out, outE, in, inE, both, and bothE
  • The interval-step requires two Comparables (not generic Object)

Version 2.3.0 (March 20, 2013)

<dependency>
  <groupId>com.tinkerpop.gremlin</groupId>
  <artifactId>gremlin-java</artifactId>
  <version>2.3.0</version>
</dependency>

<dependency>
  <groupId>com.tinkerpop.gremlin</groupId>
  <artifactId>gremlin-groovy</artifactId>
  <version>2.3.0</version>
</dependency>
  • Added support for Vertex.addEdge() with Map<String,Object> properties for the edge
  • A semantic change to store().cap() where StorePipe now implements LazySideEffectPipe
  • Updated all TransformPipes to new typing interface rules in Pipes
  • except()/retain() support String[] of named steps to reference as collection
  • GroovyPipeFunction provides support for AsMap referencing and closure access to named-steps
  • Bumped to support Groovy 1.8.9
  • Added GremlinPipeline.remove() which removes all elements at the end of the pipeline (overrides Iterator.remove())
  • Added LinkPipe and linkOut, linkIn, linkBoth steps to allow for the addition of linking current vertex with past vertex
  • Added orderMap step which takes a Map as input, orders its entries, and then emits its keys
  • Added Tokens.T.decr and Tokens.T.incr for default ordering in order and orderMap steps
  • ScriptExecutor provides support for args[] as well as a1, a2, etc. type parameters
  • Fixed a StackOverflowError in GremlinGroovyScriptEngine having to do with infinite looping on function calls
  • GremlinGroovyScriptEngine now maintains an internal cache reset to ensure no OutOfMemoryException issues
  • The map step now is map(String... keys) with user provided keys to get (id and label possible options)
  • The console can be initialized with a script to pre-define steps and initialize other aspects of the environment
  • Added shuffle step which gathers all objects into a list and randomizes the order of their output

Version 2.2.0 (December 19, 2012)

<dependency>
  <groupId>com.tinkerpop.gremlin</groupId>
  <artifactId>gremlin-java</artifactId>
  <version>2.2.0</version>
</dependency>

<dependency>
  <groupId>com.tinkerpop.gremlin</groupId>
  <artifactId>gremlin-groovy</artifactId>
  <version>2.2.0</version>
</dependency>
  • Revised method signatures for loadGraphSON() and saveGraphSON() that now use the GraphSONMode enum
  • Bumped to support Groovy 1.8.8
  • Fixed a bug in QueryPipe limit, where limit was not decrementing via counting already emitted elements
  • Provided a vertex-centric query optimization for out[0..1] type traversals
  • Added support for non-zero low range limits in QueryPipe
  • All transform steps implement new TransformPipe interface (marker interface)
  • Various thread safety test cases added for GremlinGroovyScriptEngine
  • Significant performance improvements in GremlinGroovyScriptEngine (mapped to GroovyScriptEngine)

Version 2.1.0 (August 4, 2012)

<dependency>
  <groupId>com.tinkerpop.gremlin</groupId>
  <artifactId>gremlin-java</artifactId>
  <version>2.1.0</version>
</dependency>

<dependency>
  <groupId>com.tinkerpop.gremlin</groupId>
  <artifactId>gremlin-groovy</artifactId>
  <version>2.1.0</version>
</dependency>
  • Optimized the pom.xml for both the parent and child projects
  • Added Travis continuous integration support
  • Restructured the distribution.xml to provide a more “standard” looking directory structure
  • Provide support for Query.limit() in query optimization
  • Added import static support for Direction.*
  • Made gremlin-groovy.sh/bat into simply gremlin.sh/bat

Version 2.0.0 (May 23, 2012)

<dependency>
  <groupId>com.tinkerpop.gremlin</groupId>
  <artifactId>gremlin-java</artifactId>
  <version>2.0.0</version>
</dependency>

<dependency>
  <groupId>com.tinkerpop.gremlin</groupId>
  <artifactId>gremlin-groovy</artifactId>
  <version>2.0.0</version>
</dependency>
  • Removed Gremlin-Scala from the main Gremlin distribution
  • Added tree-step based on the TreePipe to support representing the branch of a traversal
  • Added order-step based on the OrderPipe to support in-stream ordering
  • Removed VerticesPipe and EdgesPipes as should be called via getVertices() and getEdges() in GremlinPipeline constructor
  • Added QueryPipe support automated optimizations around Vertex.query()
  • Added GremlinPipeline.enablePath() to allow for non-automated path enabling
  • Provided GremlinPipeline.optimize(boolean) to control whether the pipeline is query optimized
  • The Imports class now provides static imports for Direction and Transaction enums
  • Gremlin-Groovy
    • Renamed paths-step to simply path as now in Pipes the method is called Pipe.getCurrentPath()
    • Bumped to support GMaven 1.4

Gremlin 1.X

Version 1.5 (No More Mr. Nice Guy — February 28, 2012)

<dependency>
  <groupId>com.tinkerpop.gremlin</groupId>
  <artifactId>gremlin-java</artifactId>
  <version>1.5</version>
</dependency>

<dependency>
  <groupId>com.tinkerpop.gremlin</groupId>
  <artifactId>gremlin-groovy</artifactId>
  <version>1.5</version>
</dependency>

<dependency>
  <groupId>com.tinkerpop.gremlin</groupId>
  <artifactId>gremlin-scala</artifactId>
  <version>1.5</version>
</dependency>
  • Added select step for the respective SelectPipe
  • Added has and hasNot step for concise property/id/label filtering
  • Removed idFilter step, where has and hasNot is the respective replacement
  • Removed labelFilter step, where has and hasNot is the respective replacement
  • Removed propertyFilter step, where has and hasNot is the respective replacement
  • Removed index step as it was not used and there are other ways of getting that functionality
  • Altered the semantics of groupCount value function such that it now takes a Pair (much more expressive)
  • Fixed classpath issues in the .bat files of respective Gremlin implementations
  • Lots of JavaDoc work to make the GremlinPipeline JavaDoc be a single point of reference
  • Updated distribution.xml files to support data/ and LICENSE.txt inclusion in sub-modules
  • Added groupBy step for the underlying GroupByPipe and GroupByReducePipe in Pipes (support for MapReduce)
  • Gremlin-Groovy
    • Removed the JSONSlurper vertex and edge overloaded methods
    • Gremlin.load() now makes use of method reflection to build the language tokens
    • Increased the performance of Element.key by approximately a factor of 10

Version 1.4 (Ain’t No Thing But a Chicken Wing — December 7, 2011)

<dependency>
  <groupId>com.tinkerpop.gremlin</groupId>
  <artifactId>gremlin-java</artifactId>
  <version>1.4</version>
</dependency>

<dependency>
  <groupId>com.tinkerpop.gremlin</groupId>
  <artifactId>gremlin-groovy</artifactId>
  <version>1.4</version>
</dependency>

<dependency>
  <groupId>com.tinkerpop.gremlin</groupId>
  <artifactId>gremlin-scala</artifactId>
  <version>1.4</version>
</dependency>
  • Generalized Gremlin to be a meta-language
    • Added gremlin-test as a universal test suite for all Gremlin implementations
    • Added gremlin-java as the Java representation of the Gremlin language
    • Added gremlin-groovy as the Groovy representation of the Gremlin language
    • Added gremlin-scala as the Scala representation of the Gremlin language
    • Added IndexElementsPipe as a start pipe that pulls elements from an index
    • Renamed uniqueObject step to dedup
    • Renamed orFilter and andFilter to or and and, respectively
    • Renamed uniquePath to simplePath
  • Added store step to support lazily loading of objects into collection
  • Added dedup{closure} to allow for uniqueness determination as a function
  • gremlin-groovy updates
    • Renamed Graph.saveGraphJSON() to Graph.saveGrapSON() (likewise for load method)
    • No more _() required off of graph-based objects
    • No more [[ ]] filtering supported
    • No more support for >> syntax
      • >>1 is next()
      • >>2 is next(2)
      • >>-1 is iterate()
      • >>[] is toList()
      • >>collection is fill(collection)

Version 1.3 (On the Case — September 18, 2011)

<dependency>
  <groupId>com.tinkerpop</groupId>
  <artifactId>gremlin</artifactId>
  <version>1.3</version>
</dependency>
  • Added SailGraph.loadRDF() meta method to make it easier to load RDF files
  • Optimized >>-1 to use a try/catch model which is more efficient given the architecture of AbstractPipe
  • Updated gremlin.sh to respect previous classpaths and to make sym-linking easier
  • Fixed table width bug in Table
  • Added Graph.loadGraphJSON() and Graph.saveGraphJSON() with respective data/graph-example-1.json
  • Moved to FluentPipeline model provided by Pipes
  • Filter functions must be made explicit now (e.g. out{it.id > 2} must now be out.filter{it.id > 2})
  • Migrated TablePipe and Table to Pipes
  • Renamed propFilter step to propertyFilter
  • Added multi-vertex/edge lookup support via g.v(1,2,3) -> [v[1],v[2],v[3]] (and g.e() as well)
  • Added memoize() step to provide the MemoizePipe functionality to Gremlin
  • Added support for simpler PipeFunction model introduced by Pipes
  • Bumped to Groovy 1.8.2

Version 1.2 (New Sheriff in Town — August 1, 2011)

<dependency>
  <groupId>com.tinkerpop</groupId>
  <artifactId>gremlin</artifactId>
  <version>1.2</version>
</dependency>
  • Added respective pipe support for Vertex.getOutEdges(String...) and Vertex.getInEdges(String...)
  • Added path functions to paths to allow for post-processing a returned path
  • Added map entry functions to groupCount to allow for pre-processing an entry’s key/value pairs
  • Added Gremlin.version() to get version information (returns GremlinTokens.VERSION)
  • Added Gremlin.defineStep() to make it simple for developers to add new steps
  • Added support for Graph.loadGraphML(URL)
  • Renamed ifelse to ifThenElse and provided ‘scatter’ functionality if branch yields an iterator/iterable
  • Implemented Pipe.reset() method for all Gremlin-specific pipes
  • Migrated all Gremlin-specific pipes to Pipes
    • Added GroovyPipeClosure to map a Groovy Closure to a PipeClosure
  • Update g.idx() to reflect null behavior of Blueprints index API update
  • Added map step to emit an element’s property map
  • Added support for aggregate step function to process object prior to insertion into the aggregate collection
  • Bumped to Groovy 1.8.1

Version 1.1 (Clownin’ Around — June 15, 2011)

<dependency>
  <groupId>com.tinkerpop</groupId>
  <artifactId>gremlin</artifactId>
  <version>1.1</version>
</dependency>
  • The .gremlin_history file is always saved to the users home directory
  • Supports an inclusive max on RangeFilterPipe
  • Supports integer range filtering for Map — e.g. m[0..10]
  • Added meta methods loadGraphML and saveGraphML to Graph
  • SailGraph is no longer a strict dependency (however, loads meta methods if in classpath)
  • Added optional step for doing back, but without filtering
  • Extended support for graph pattern matching
  • Added AsPipe for naming steps.
    • Added table step with respective TablePipe and Table data structure
    • Added support for named steps in loop
    • Added support for named steps in back
    • Added support for named steps in optional

Version 1.0 (Gremlin — May 8, 2011)

<dependency>
  <groupId>com.tinkerpop</groupId>
  <artifactId>gremlin</artifactId>
  <version>1.0</version>
</dependency>
  • Added out(label?), in(label?), and both(label?)
  • Added copySplit, fairMerge, exhaustMerge
  • SailLoader is loaded on startup (no longer required by developer)
  • Faster Gremlin.compile() using GremlinScriptEngine
  • Renamed andf, orf, and propf to andFilter, orFilter, and propFilter
  • Moved to the more optimal vertex/edge incidence Pipes
  • Renamed unique to uniqueObject
  • Updated Gremlin-specific pipes to support reset() API

Gremlin 0.X

Version 0.9 (Gremlin the Grouch — April 4, 2011)

<dependency>
  <groupId>com.tinkerpop</groupId>
  <artifactId>gremlin</artifactId>
  <version>0.9</version>
</dependency>
  • Iterable and Iterator meta methods are now Pipe exclusive
  • Index results are auto-wrapped in an IdentityPipe to ensure consistent behavior across graphs
  • Added DexGraph as imported graph database
  • Object.propertyMissing is no longer defined to ensure Gremlin safety
  • emit step renamed to transform
  • foreach step renamed to sideeffect
  • Removed futuref step as back supplies necessary computation
  • The it of the gather step is now the gathered List

Version 0.8 (Grem Stefani — March 2, 2011)

<dependency>
  <groupId>com.tinkerpop</groupId>
  <artifactId>gremlin</artifactId>
  <version>0.8</version>
</dependency>
  • Added new steps
    • emit to emit results of provided function
    • ifelse to perform a if/then/else branch
    • uniquePath to filter looping paths
  • Added new methods
    • Object.mean() to calculate the average of delegate
    • Pipe.count() to calculate the number of objects in pipe
  • Added support for stack trace printing during an error in the console
  • loop step now requires “back integer”
  • Added step caching model to increase speed of property notation
  • Added outE(label), inE(label) and bothE(label) support
  • Added support for dynamic counter adjustment in groupCount
  • Bumped to using Groovy 1.7.8
  • Created a type-cast friendly groupCount step

Version 0.7 (Gremopoly — January 22, 2011)

<dependency>
  <groupId>com.tinkerpop</groupId>
  <artifactId>gremlin</artifactId>
  <version>0.7</version>
</dependency>
  • Added many new steps
    • loop step for in-line looping
    • foreach step for function based operations on flowing objects
    • back step for backtracking in pipeline (i.e. ../)
    • aggregate, except, and retain for except/retain pattern
    • groupCount for map aggregations (i.e. g:op-value())
    • step for anonymous/lambda steps
  • Massive refactoring of documentation
  • Changed to Groovy as the host language

Version 0.6 (Gremalicious — December 14, 2010)

<dependency>
  <groupId>com.tinkerpop</groupId>
  <artifactId>gremlin</artifactId>
  <version>0.6</version>
</dependency>
  • Fixed foreach bug that occurred on single object looping
  • Fixed if/else bug that occurred on function call
  • null and empty iterator/iterable result now printed in console
  • Empty path expression returns an empty iterable, not null
  • Added g:copy-e() function that conveniently copies an element from one graph into another
  • Fixed numerous bugs in how functions were computing atoms
  • GPath optimization through auto-reset of Gremlin-specific range-based pipes
  • Comparing numbers is now possible without casting
  • Fixed a major bug in error message handling (many exceptions w/o message being provided in console)
  • Improved Gremlin evaluator load time with static function and step loading
  • Added support for Blueprints 0.3 multi-indexes
    • g:add-aidx-key(), g:add-idx(), g:drop-idx(), g:show-aidx-keys(), g:show-idx(), g:remove-aidx-keys()
  • Added return ?object to return from a user defined function or step
  • Added support for path generation through g:path() (main body of work in Pipes)

Version 0.5.5 (Gremlivich — October 28, 2010)

<dependency>
  <groupId>com.tinkerpop</groupId>
  <artifactId>gremlin</artifactId>
  <version>0.5.5</version>
</dependency>
  • A rework of the user-defined step model
    • Renamed the concept of “path” to “step”
    • Users can now define computations in steps
  • Added gather and scatter steps to allow for aggregation and unrolling of objects within a path
  • Added g:append() function to concatenate objects to an iterable (e.g. list, set)

Version 0.5 (Gremlivich — September 22, 2010)

<dependency>
  <groupId>com.tinkerpop</groupId>
  <artifactId>gremlin</artifactId>
  <version>0.5</version>
</dependency>
  • A complete redesign and implementation of the Gremlin compiler
  • Significant performance improvements
    • Order of magnitude increase in speed for numerous operations
    • Lazy evaluation for better memory usage
  • Functions implement the ServiceLoader pattern for ease of incorporating 3rd-party extensions
  • Numerous changes to the Gremlin function library
    • All core functions are now in the g namespace (e.g. g:count(), g:string())
    • g:id() changed to g:id-v() and g:id-e() for getting vertices and edges, respectively
    • g:key() changed to g:key-v()
    • Added g:version() function to retrieve version information
    • Added g:g() (group) to semi-replace () model in Gremlin 0.2.2
    • Added g:flatten() to flatten embedded iterables
    • Added g:includes() to determine if an object is in an iterable
    • Added g:power() to implement raising a number by a power
    • Added g:range() to allow for integer ranges to be created
    • Changed g:difference() to g:diff() (abbreviation policy enacted for function names)
    • Added g:set() to create a set (unordered, unique collection of objects)
    • Added g:integer(), g:long(), g:float(), and g:double() to support number casting
  • Additions to the Gremlin type system
    • Supports iterable as a super type in order to have direct support for lazy evaluation
    • Supports set as an unordered, unique collection of objects
    • Supports integer (1), long (1l), float (1.0), double (1.0d) as different number types
  • Print streams can be dynamically set in GremlinScriptContext
  • true(), false(), and null() are now keywords—true, false, null
  • String concatenation is supported with the + operation
  • Range filter support through [1..10] type syntax
  • Index of lists starts at 0 instead of 1 as in Gremlin 0.2.2
  • Test cases now provide performance statistics
  • Removed the ‘show all aspects’ * step (i.e. ./outE/inV/*)
  • Allow for the use of assignment and other operations within a path (e.g. ./outE/inV[g:p($x := .)]
  • Provided support for OrientDB graph database (main body of work in Blueprints)
  • Update to dependency inclusions
    • Distribution includes all supported graph databases in Blueprints (gremlin-*-standalone.jar)
    • Dependency provide <scope>provided</scope>

Version 0.2.2 (Gremicide — March 7, 2010)

<dependency>
  <groupId>com.tinkerpop</groupId>
  <artifactId>gremlin</artifactId>
  <version>0.2.2</version>
</dependency>
  • Fixed a bug introduced in 0.2.1 having to do with variables copied from a parent path context
  • Added dependency on Neo4j RDF and SAIL SNAPSHOTS
  • Added Neo4jSailGraph BETA to the core distribution

Version 0.2.1 (Gremicide — February 25, 2010)

<dependency>
  <groupId>com.tinkerpop</groupId>
  <artifactId>gremlin</artifactId>
  <version>0.2.1</version>
</dependency>
  • Instance naming convention for Functions changed to FunctionLibrary
  • list g:list(object+) is now list g:list(object*)
  • Added support for Java 1.6+ JSR 223 ScriptEngine and ScriptEngineFactory
    • Renamed GremlinEngine to GremlinScriptEngine
    • Renamed GremlinEngineFactory to GremlinScriptEngineFactory

Version 0.2 (Gremicide — February 14, 2010)

<dependency>
  <groupId>com.tinkerpop</groupId>
  <artifactId>gremlin</artifactId>
  <version>0.2</version>
</dependency>
  • Added user defined functions
    • Gremlin and Java defined functions supported
  • Added user defined paths
    • Gremlin and Java defined functions supported
  • Added .gremlinrc load script
  • Added support for manual transaction handling of Neo4j graphs
    • boolean neo4j:start-tx(), boolean neo4j:stop-tx(boolean) added
  • Added support for embedded maps and lists
  • Added support for JSON encoding and decoding of Gremlin types
    • g:json(object) was removed
    • string g:to-json(object) and object g:from-json(string) added
  • Added better support for vertex and edge property indexing
  • Added working graph $_g variable and updated graph functions to support it
  • Added support for SPARQL queries for SAIL-based graphs
    • list sail:sparql(graph?, string) was added
  • Added support for Linked Data SAIL for real-time analysis of the Web of Data
  • Added support for script loading
    • script gremlin-script.grm
  • Added support for JUNG algorithms over Gremlin graphs
    • map jung:pagerank(graph?, map?)
    • list jung:dijkstra(graph?, vertex, vertex, map?)
  • Renamed g:append(object, object+) to g:list(object+)
  • Renamed the general graph model to property graph model
    • Moved the model and its implementations to Blueprints
    • Dependency is on Blueprints 0.1
  • Various bug fixes and optimizations

Version 0.1 (XMas Alpha — December 25, 2009)

<dependency>
  <groupId>com.tinkerpop</groupId>
  <artifactId>gremlin</artifactId>
  <version>0.1</version>
</dependency>
  • Initial release of the language and virtual machine