Framework
apache/tinkerpop avatar
apache/tinkerpop

Apache TinkerPop: a traversal language and a conformance spec, not a database

Apache TinkerPop - a graph computing framework

2,147 stars864 forksJavaApache-2.0

At a glance

What is it?
The graph computing framework whose main artefact is Gremlin, a query language with a semantics document that vendors implement, shipped with five language drivers, an in-memory reference database and a server that evaluates traversals submitted by clients.
Who is it for?
Adopt TinkerPop when you need to query more than one graph system, or when you want a traversal language rather than a query builder bolted onto one product, because the value is the language and the semantics document that a vendor implements, and that portability is real rather than nominal. Do not adopt it expecting a database, since TinkerGraph is a reference implementation for development rather than a production store.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 1 day ago.
What is it written in?
Mainly Java, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on September 28, 2026, and from our analysis. They are not legal advice.

Editorial analysis

Six vertices, six edges, and the first thing the console shows you

The quickest way to understand this project is to read its own first session, which the README reproduces in full. You download the Gremlin Console, unzip it, and run

bash
$ bin/gremlin.sh

The console prints a small banner and then a list of activated plugins: one for the server, one for utilities, and one for the in-memory graph. The plugin list is the architecture in three lines, because a framework that loads named plugin bundles at startup is one designed to be extended and reconfigured rather than compiled monolithically. Then the session itself, and the first command reports a version of 3.8.0. The second creates a graph from a factory method called createModern, which returns a graph with six vertices and six edges. That is the reference dataset, and its size is the point: this is a toy graph, small enough to hold in your head, and the name refers to a standard sample dataset the project has used for years. The framework's own answer to what it is for is in the third command, which builds a traversal source bound to that graph and then asks for the vertex whose name is vadas:

bash
gremlin> g.V().has('name','vadas').valueMap()
==>[name:[vadas], age:[27]]

Four lines, one result, and the entire programming model is on the screen. If you learn nothing else about TinkerPop, learn that a query is a chain of steps over vertices and edges, and that the chain is built programmatically rather than parsed from a string.

valueMap returns lists, which is where every newcomer loses an afternoon

Look closely at the output of that first query. The console prints a map with two keys, name and age, and each value is a list containing one element. The reader who expects a name and a number gets a list of one name and a list of one number. That is not a display artefact, it is the semantic of the operation, and it is the single most common source of confusion for someone writing their first traversal. The reason is that a property key on a graph element is allowed to hold more than one value, so an operation that returns the values for a key has to return a collection, even when the collection happens to hold one item. Any code you write against that result therefore deals in collections from the first line, and the conversion to a scalar is something you do explicitly. There is a second thing in the same output worth noticing: the version reported by the console is 3.8.0, while the repository publishes no GitHub releases. So the version number you will see at runtime comes from the artefact you downloaded, not from a tag you can browse, which means the upgrade documentation is the place to find out what changed between versions, and the README links it separately from the reference documentation for exactly that reason.

A semantics document is the product, and it is where portability is decided

Read the project overview carefully, because it defines the deliverable precisely. TinkerPop defines a common interface and language, Gremlin, so that applications can work against many different graph systems without being locked into a single vendor. And the resources list includes a page for provider documentation and Gremlin Semantics, which is the important one. That document is a specification of what the language means, so a graph database either implements it or does not. Everything else follows from that. A driver is only as good as the implementation behind it, so the portability claim is conditional on the target system conforming, and no driver in this repository can make a non-conforming database conformant. What the project ships alongside the language is a reference in-memory graph, Gremlin Server to expose the language over a protocol, language variants for other ecosystems, and a documentation set. The dual claim in the description is the other thing to understand. It is positioned for graph databases on the transactional side and graph analytic systems on the analytical side, which is a stronger claim than most graph tooling makes, since it says the same traversal model spans both. Whether a given system honours that on the analytical side is exactly what the semantics document and the provider documentation are for, and they are separate pages because the answer differs per system.

Five drivers, and the Go one lives on a versioned import path

The header carries five version badges, one per language, and the top-level listing has a matching module for each. There is a Java driver on Maven Central, a .NET package on NuGet, a Python package on PyPI, a JavaScript package on npm, and a Go module. The language modules in the tree are named accordingly, and the README's usage section names the same set when it lists Gremlin language variants, adding that traversals can be run from the JVM or through the variants. The Go entry is the odd one and the reason is mechanical rather than deliberate. Its badge points at a module path that ends in a version suffix, which is what Go's semantic import versioning requires: a module at major version three or above must carry the major version in its import path, and that is why the Go client cannot simply be imported at a stable path. For a Go consumer that is a hard constraint that the other four languages do not have, and it shows up in your imports and in your dependency management. It is also a small reminder of how much of a portability layer is packaging. Everything else about the drivers is uniform, and the reference documentation is where supported features and configuration options for each one are listed, rather than in this repository.

Gremlin Server evaluates code from clients, and the repository has a threat model

This is the security consideration that matters most in this project, and the repository treats it as one. A Gremlin traversal is not a declarative query string. It is a program, expressed as a chain of steps, and Gremlin Server exists to evaluate those programs on behalf of a client. So a server that accepts traversals from a network client is an evaluation surface, and everything that follows from that is a security design problem: who may connect, what they may express, how long a traversal may run, how deeply it may nest, and how much memory and CPU one request may consume. A graph traversal is expressive by design, and expressions mean a client can be doing arithmetic, string manipulation and function calls rather than only reading edges. The project ships a threat model document at the repository root, alongside a security file, and that is the right response to the problem rather than an assertion that there is none. What the README does not describe is the authentication and configuration surface of Gremlin Server itself, so if you are exposing it, the questions to answer before launch are who is authenticated, what a single client can cost, and where the traversal timeout is configured. The reference documentation is linked for configuration options; treat that as required reading rather than optional.

AGENTS.md with do and don't guidance, and a canonical process kept separate

The contribution section of this README has a section most projects do not have. It tells contributors that if you use AI coding agents or IDE assistants when working on TinkerPop, you should consult a file called AGENTS.md, and it summarises what is in it: recommended build and test commands, code style and testing conventions, and do and don't guidance specific to automated tools. Then it draws a boundary explicitly, saying that AGENTS.md is a concise guide for tools and tool-using contributors, while CONTRIBUTING.md and the developer documentation remain the canonical sources for project policies and processes. That is a mature position, and it is worth pausing on why it is stated. A project of this size receives a large volume of contributed patches, and generated patches are the new normal, so the project has pre-decided what to tell an automated contributor rather than handling each case individually. The value of the approach is the separation: a tool does not get to invent policy, because policy lives in the canonical documents, and the tool guide is explicitly a summary. The rest of the contribution process is conventional and strict in the right ways. Discuss larger changes on the appropriate mailing list first, make sure tests pass locally, and update the changelog and the upgrade documentation when behaviour or public APIs change. There is also a .skills directory in the tree, and a .beads directory, both of which are project tooling rather than code.

The docs are in the repository, and the index file is what publishes them

Documentation is where this project is unusually well organised, and there is a specific gotcha in it. The full documentation is published on the project website and is also maintained in this repository under a source directory as what the README calls AsciiDoc books. When you change or add documentation you are told to follow the existing structure and to update the relevant index files so new content is included in the build. That last clause is the gotcha. In an AsciiDoc book the navigation and the inclusion list live in the index file for that book, so a new page you add is not published until you register it, and a page you edit is not reflected until the book is rebuilt. Contributors regularly lose time to this. The upside is real, though, and it is the opposite of what a wiki-based documentation setup gives you: the documentation is versioned with the code, so the upgrade documentation and the reference documentation describe the version you have rather than the current state of the website. The build side is straightforward. Building is supported on Linux and macOS, the project uses Maven, and it requires Java 11 or 17 for proper building and operation, with a single command to build, test and package the console and server,

bash
mvn clean install

whose zip archives land in the target directories of their respective modules. The age of the project shows in two module names, connectors for Spark and for Hadoop, both of which are earlier-generation systems.

Editorial conclusion

Adopt TinkerPop when you need to query more than one graph system, or when you want a traversal language rather than a query builder bolted onto one product, because the value is the language and the semantics document that a vendor implements, and that portability is real rather than nominal. Do not adopt it expecting a database, since TinkerGraph is a reference implementation for development rather than a production store. Three things to check first. Confirm the graph system you need actually implements Gremlin Semantics, because a driver is worthless without it, and the provider documentation is where that is settled. Read the threat model before exposing Gremlin Server to anything you do not control, since a traversal is evaluated on the server and the framework treats that as a security boundary. And pin the version, because the console reports 3.8.0 while the repository publishes no GitHub releases, so the artefact index and the upgrade documentation are how you find out what changed.

Frequently asked questions

What is Apache TinkerPop and what does it provide?

It is a graph computing framework for both graph databases and graph analytic systems. It provides the Gremlin traversal language, drivers, a reference in-memory graph database called TinkerGraph, Gremlin Server, language variants, and documentation, so applications can work against many graph systems without vendor lock-in.

How do I build Apache TinkerPop from source?

Run mvn clean install. Building is supported on Linux and macOS, the project uses Maven, and it requires Java 11 or 17 for proper building and operation. The zip distributions for the server and the console are produced in the target directories of those modules.

Why does a Gremlin valueMap return lists instead of single values?

Because a property key on an element can hold more than one value, so an operation returning the values for a key has to return a collection even when it holds a single item. The console example shows a name and an age each wrapped in a one-element list, and code written against that result deals in collections from the start.

Which programming languages have Apache TinkerPop clients?

Five, each with a version badge in the README: Java on Maven Central, .NET on NuGet, Python on PyPI, JavaScript on npm, and Go. The Go module is imported through a path carrying its major version, which is what Go requires for modules at version three or above.

What should a contributor know about AI coding assistants and Apache TinkerPop?

The README directs contributors who use AI coding agents or IDE assistants to AGENTS.md, which covers recommended build and test commands, code style, testing conventions and do and don't guidance for automated tools. It also states that CONTRIBUTING.md and the developer documentation remain the canonical sources for project policy.

Official sources

  1. apache/tinkerpop on GitHub
  2. Issues
  3. License: Apache-2.0
  4. Project website
  5. README
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/apache-tinkerpop.svg)](https://hysenlabs.com/projects/apache-tinkerpop)