Gremlin is an Apache Software Foundation query language and as such, can be used by any graph system (Titan, Neo4j, OrientDB, etc.). It is not bound to a particular vendor.
Gremlin has a natural compilation to the common distributed vertex-centric computing model (bulk synchronous parallel for graphs). Thus, Gremlin works for both OLTP (graph databases) and OLAP (graph processors). The Apache distribution provides OLAP connectivity to Apache Hadoop, Spark, and Giraph.
Gremlin supports both imperative path expressions and declarative pattern matching.
Gremlin can be embedded in any host language. No "fat string" with result set. The user's database query code and data manipulation code are in the same language. There exists Gremlin-Java8, Gremlin-Groovy, Gremlin-Scala, Gremlin-Clojure, Gremlin-PHP, etc.
Gremlin is Turing Complete. Most any complex enough language is. However, Gremlin is related to a Turing Machine by a very simply mapping.
Thanks for the post! You mentioned Spark via OLAP connectivity. Can you please elaborate a little on how gremlin works with spark? Does it use the GraphX API behind the scenes or is it just spark? Are there any sources on how well it works?
Gremlin (over Spark) does not use GraphX. It simply represents the graph as a tensor RDD (i.e. a multi-layered matrix) and with the Spark functional library, it implements BSP-based vertex-centric computing (i.e. message passing). You can see examples and a diagram explaining how it works at this location:
Gremlin is an imperative "language", Cypher is declarative. The first lets you specify what will be performed, the latter describes the wished result and lets the query optimizer translate it to actual operations to retrieve it.
In a way, with Gremlin you have the absolute freedom on how to perform the traversal. With Cypher, you're working at a higher level with all the advantages of such approach (think SQL).
Take a look at Gremlin 3 - it now supports both declarative and imperative queries. In fact, you can even mix and match the two.
You want to match a complex pattern? Use declarative Gremlin so the query optimizer can figure out the best execution strategy for you.
You have a highly custom path traversal? Use imperative Gremlin which gives you full control over the execution and provides you with everything you'd expect from a pipeline language.
You have both? Combine them in a single traversal.
While Gremlin2 was an imperative query language, Gremlin 3 is a new type of query language that aims to combine the best of both worlds.
It is more useful for manually working with graph. You have more control of what happens and build complex graph traversals. Also, it is not tied to any graph db. Gremlin is part of Tinkerpop, a graph framework, http://tinkerpop.incubator.apache.org/