<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License.  You may obtain a copy of the License at

  http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied.  See the License for the
specific language governing permissions and limitations
under the License.
-->
# Apache TinkerPop

[![Maven Central](https://img.shields.io/maven-central/v/org.apache.tinkerpop/gremlin-driver?color=brightgreen)](https://mvnrepository.com/artifact/org.apache.tinkerpop/gremlin-driver)
[![NuGet](https://img.shields.io/nuget/v/Gremlin.Net?color=brightgreen)](https://www.nuget.org/packages/Gremlin.Net)
[![PyPI](https://img.shields.io/pypi/v/gremlinpython?color=brightgreen)](https://pypi.org/project/gremlinpython/)
[![npm](https://img.shields.io/npm/v/gremlin?color=brightgreen)](https://www.npmjs.com/package/gremlin)
[![Go.Dev](https://badge.fury.io/go/github.com%2Fapache%2Ftinkerpop%2Fgremlin-go%2Fv3.svg)](https://pkg.go.dev/github.com/apache/tinkerpop/gremlin-go/v3)

[![Codecov](https://codecov.io/gh/apache/tinkerpop/branch/master/graph/badge.svg?token=TojD2nR5Qd)](https://codecov.io/gh/apache/tinkerpop)

[![TinkerPop3](https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/images/tinkerpop3-splash.png)](https://tinkerpop.apache.org)

Apache TinkerPop™ is a graph computing framework for both graph databases (OLTP) and graph analytic systems (OLAP). It 
provides the Gremlin graph traversal language, drivers, and tools for working with property graphs across a wide variety
of underlying data systems.

## Project overview

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. It includes a reference in‑memory graph database (TinkerGraph), 
Gremlin Server, language variants, and a rich collection of recipes and documentation.

Key resources:

- Website: https://tinkerpop.apache.org
- Documentation Index: https://tinkerpop.apache.org/docs/current/index.html
- Upgrade documentation: https://tinkerpop.apache.org/docs/current/upgrade/
- Reference documentation: https://tinkerpop.apache.org/docs/current/reference/
- Recipes: https://tinkerpop.apache.org/docs/current/recipes/
- Provider documentation and Gremlin Semantics: https://tinkerpop.apache.org/docs/current/dev/provider
- Developer documentation: https://tinkerpop.apache.org/docs/current/dev/developer
- IO Documentation: https://tinkerpop.apache.org/docs/current/dev/io
- Roadmap and proposals: https://tinkerpop.apache.org/docs/current/dev/future/
- Javadocs: https://tinkerpop.apache.org/javadocs/current/full/, [core javadoc](https://tinkerpop.apache.org/javadocs/current/core/)

## Building and Testing

Building TinkerPop is supported on Linux and macOS.

TinkerPop uses [Maven](https://maven.apache.org/) and requires Java 11/17 for proper building and proper operations. To 
build, execute unit tests and package Gremlin Console/Server run:

```bash
mvn clean install
```

The zip distributions can be found in the following directories:

1. `gremlin-server/target`
2. `gremlin-console/target`

Please see the CONTRIBUTING.md file for more detailed information and options for building, test running and developing 
TinkerPop.

## Get Started

Download [Gremlin Console](https://tinkerpop.apache.org/download.html) (compatible with Java 11/17) and unzip to a 
directory, then:

```bash
$ bin/gremlin.sh

         \,,,/
         (o o)
-----oOOo-(3)-oOOo-----
plugin activated: tinkerpop.server
plugin activated: tinkerpop.utilities
plugin activated: tinkerpop.tinkergraph
gremlin> Gremlin.version()
==>3.8.0
gremlin> graph = TinkerFactory.createModern()
==>tinkergraph[vertices:6 edges:6]
gremlin> g = traversal().with(graph)
==>graphtraversalsource[tinkergraph[vertices:6 edges:6], standard]
gremlin> g.V().has('name','vadas').valueMap()
==>[name:[vadas], age:[27]]
```

From the Gremlin Console, you can connect to a TinkerGraph instance and run your first traversals. Refer to the 
[Getting Started](https://tinkerpop.apache.org/docs/current/tutorials/getting-started/) for detailed walkthroughs and 
examples.

## Using TinkerPop

Common ways to use TinkerPop include:

- Embedding **TinkerGraph** in your application for development, testing, or lightweight graph workloads.
- Connecting to a **Gremlin‑enabled graph database** via drivers or [Gremlin Server](https://tinkerpop.apache.org/docs/current/reference/#gremlin-server).
- Running **Gremlin traversals** from the JVM, or via Gremlin Language Variants (Python, .NET, JavaScript, Go, etc.).
- Using the **Gremlin Console** for interactive exploration, debugging, and learning.

See the [Reference Documentation](https://tinkerpop.apache.org/docs/current/reference/) for supported features,
configuration options, and other details.

## Documentation

The full TinkerPop documentation is published on the project website and is also maintained in this repository under 
`docs/src/` as AsciiDoc “books.”

When changing or adding documentation, follow the existing AsciiDoc structure in `docs/src/**` and update the 
relevant `index.asciidoc` files so new content is included in the build.

## Contributing

Contributions to Apache TinkerPop are welcome. The [Developer Documentation](https://tinkerpop.apache.org/docs/current/dev/developer)
and contributing guide describe how to set up a development environment, run tests, and submit changes.

- Contribution guidelines: `CONTRIBUTING.md` in the repository root.
- Developer documentation: https://tinkerpop.apache.org/docs/current/dev/developer/

Before opening a pull request, please:

- Discuss larger changes on the appropriate Apache mailing list.
- Ensure tests pass locally and, where appropriate, add new tests and documentation.
- Update `CHANGELOG.asciidoc` and upgrade docs when behavior or public APIs change.

## Using AI and IDE assistants

If you use AI coding agents or IDE assistants when working on TinkerPop, please consult `AGENTS.md`. That file 
summarizes:

- Recommended build and test commands.
- Code style and testing conventions.
- “Do and don’t” guidance specific to automated tools.

`AGENTS.md` is a concise guide for tools and tool‑using contributors, while `CONTRIBUTING.md` and the 
[Developer Documentation](https://tinkerpop.apache.org/docs/current/dev/developer) remain the canonical sources for 
project policies and processes.

## License

Apache TinkerPop is an open source project of The Apache Software Foundation and is licensed under the Apache License, 
Version 2.0. See the `LICENSE` file in this repository for details.
