////
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.
////

image::apache-tinkerpop-logo.png[width=500,link="https://tinkerpop.apache.org"]

*x.y.z*

== Getting Started

link:https://tinkerpop.apache.org[Apache TinkerPop™] is an open source Graph Computing Framework. Within itself, TinkerPop
represents a large collection of capabilities and technologies and, in its wider ecosystem, an additionally extended
world of link:https://tinkerpop.apache.org/#graph-systems[third-party contributed] graph libraries and
systems. TinkerPop's ecosystem can appear complex to newcomers of all experience levels, especially when glancing at the
link:https://tinkerpop.apache.org/docs/x.y.z/reference/[reference documentation] for the first time.

So, where do you get started with TinkerPop? How do you dive in quickly and get productive? Well ... Gremlin, the
most recognizable citizen of The TinkerPop, is here to help with this thirty-minute tutorial. That's right: in just
thirty short minutes, you too can be fit to start building graph applications with TinkerPop. Welcome to _The
TinkerPop Workout — by Gremlin_!

image::gremlin-gym.png[width=1024]

== The First Five Minutes

It is quite possible to learn a lot in just five minutes with TinkerPop, but before doing so, a proper introduction of
your trainer is in order. Meet Gremlin!

image:gremlin-standing.png[width=125]

Gremlin helps you navigate the vertices and edges of a graph. He is essentially your query language to graph
databases, as link:http://sql2gremlin.com/[SQL] is the query language to relational databases. To tell Gremlin how
he should "traverse" the graph (i.e., what you want your query to do) you need a way to provide him commands in the
language he understands — and, of course, that language is called "Gremlin". For this task, you need one of
TinkerPop's most important tools: link:https://tinkerpop.apache.org/docs/x.y.z/reference/#gremlin-console[The Gremlin Console].

NOTE: Are you unsure of what a vertex or edge is? That topic is covered in the <<_the_next_fifteen_minutes, next section>>,
but please allow the tutorial to get you oriented with the Gremlin Console first, so that you have an understanding of
the tool that will help you with your learning experience.

link:https://www.apache.org/dyn/closer.lua/tinkerpop/x.y.z/apache-tinkerpop-gremlin-console-x.y.z-bin.zip[Download the console],
unpackage it and start it:

[source,text]
----
$ unzip apache-tinkerpop-gremlin-console-x.y.z-bin.zip
$ cd apache-tinkerpop-gremlin-console-x.y.z
$ bin/gremlin.sh

         \,,,/
         (o o)
-----oOOo-(3)-oOOo-----
plugin activated: tinkerpop.server
plugin activated: tinkerpop.utilities
plugin activated: tinkerpop.tinkergraph
gremlin>
----

TIP: Windows users may use the included `bin/gremlin.bat` file to start the Gremlin Console.

The Gremlin Console is a link:http://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop[REPL environment],
which provides a nice way to learn Gremlin as you get immediate feedback for the code that you enter. This eliminates
the more complex need to "create a project" to try things out. The console is not just for "getting started", however.
You will find yourself using it for a variety of TinkerPop-related activities, such as loading data, administering
graphs and working out complex traversals.

To get Gremlin to traverse a graph, you need a `TraversalSource` instance, which holds a reference to a
`Graph` instance, which in turn holds the
link:https://tinkerpop.apache.org/docs/x.y.z/reference/#graph-structure[structure] and data of the
graph. TinkerPop is a graph abstraction layer over different graph databases and different graph processors, so there
are many `Graph` instances link:https://tinkerpop.apache.org/#graph-systems[you can choose from] to instantiate a
connection to in the console. The best `Graph` instance to start with, however, is
link:https://tinkerpop.apache.org/docs/x.y.z/reference/#tinkergraph-gremlin[TinkerGraph]. TinkerGraph is a fast,
in-memory graph database with a small handful of configuration options, making it a good choice for beginners.

TIP: TinkerGraph is not just a toy for beginners. It is useful in analyzing subgraphs taken from a large graph,
working with a small static graph that doesn't change much, writing unit tests and other use cases where the graph
can fit in memory.

TIP: For purposes of "getting started", resist the temptation to dig into more complex databases that have lots of
configuration options or to delve into how to get link:https://tinkerpop.apache.org/docs/x.y.z/reference/#gremlin-server[Gremlin Server]
working properly. Focusing on the basics, presented in this guide, builds a good foundation for all the other things
TinkerPop offers.

To make your learning process even easier, start with one of TinkerPop's "toy" graphs. These are "small" graphs
designed to provide a quick start into querying. It is good to get familiar with them, as almost all TinkerPop
documentation is based on them and when you need help and have to come to the
link:http://groups.google.com/group/gremlin-users[mailing list], a failing example put in the context of the toy graphs
can usually get you a fast answer to your problem.

TIP: When asking questions on the mailing list or StackOverflow about Gremlin, it's always helpful to
link:https://stackoverflow.com/questions/51388315/gremlin-choose-one-item-at-random[include a sample graph] so that
those attempting to answer your question understand exactly what kind of graph you have and can focus their energies
on providing a good, tested answer rather than trying to build sample data themselves. The sample graph should just be a simple
Gremlin script that can be copied and pasted into a Gremlin Console session.

For your first graph, use the "Modern" graph, which looks like this:

image:tinkerpop-modern.png[width=500]

It can be instantiated in the console this way:

[gremlin-groovy]
----
graph = TinkerFactory.createModern()
g = graph.traversal()
----

The first command creates a `Graph` instance named `graph`, which thus provides a reference to the data you want
Gremlin to traverse. Unfortunately, just having `graph` doesn't provide Gremlin enough context to do his job. You
also need something called a `TraversalSource`, which is generated by the second command. The `TraversalSource`
provides additional information to Gremlin (such as the link:https://tinkerpop.apache.org/docs/x.y.z/reference/#traversalstrategy[traversal strategies]
to apply and the link:https://tinkerpop.apache.org/docs/x.y.z/reference/#graphcomputer[traversal engine] to use) which
provides him guidance on how to execute his trip around the `Graph`.

There are several ways to create a `TraversalSource`. The example above uses the
link:https://tinkerpop.apache.org/docs/x.y.z/reference/#connecting-embedded[embedded] style and is an approach
restricted to languages using the Java Virtual Machine (JVM). Other methods are similar in form, but are not the focus of
this tutorial. See the Reference Documentation for more information on the different ways of
link:https://tinkerpop.apache.org/docs/x.y.z/reference/#connecting-gremlin[connecting with Gremlin].

With your `TraversalSource` `g` available it is now possible to ask Gremlin to traverse the `Graph`:

[gremlin-groovy,modern]
----
g.V()    <1>
g.V(1)    <2>
g.V(1).values('name')    <3>
g.V(1).outE('knows')    <4>
g.V(1).outE('knows').inV().values('name')    <5>
g.V(1).out('knows').values('name')    <6>
g.V(1).out('knows').has('age', gt(30)).values('name')    <7>
----

<1> Get all the vertices in the `Graph`.
<2> Get the vertex with the unique identifier of "1".
<3> Get the value of the `name` property on the vertex with the unique identifier of "1".
<4> Get the edges with the label "knows" for the vertex with the unique identifier of "1".
<5> Get the names of the people whom the vertex with the unique identifier of "1" "knows".
<6> Note that when one uses `outE().inV()` as shown in the previous command, this can be shortened to just `out()`
(similar to `inE().outV()` and `in()` for incoming edges).
<7> Get the names of the people vertex "1" knows who are over the age of 30.

TIP: The variable `g`, the `TraversalSource`, only needs to be instantiated once and should then be re-used.

IMPORTANT: A `Traversal` is essentially an `Iterator` so if you have code like `x = g.V()`, the `x` does not contain
the results of the `g.V()` query.  Rather, that statement assigns an `Iterator` value to `x`. To get your results,
you would then need to iterate through `x`. This understanding is *important* because in the context of the console
typing `g.V()` instantly returns a value. The console does some magic for you by noticing that `g.V()` returns
an `Iterator` and then automatically iterates the results. In short, when writing Gremlin outside of the console
always remember that you must iterate your `Traversal` manually in some way for it to do anything. The concept of
"iterating your traversal" is described further in link:https://tinkerpop.apache.org/docs/x.y.z/tutorials/the-gremlin-console/[The Gremlin Console Tutorial].

In this first five minutes with Gremlin, you've gotten the Gremlin Console installed, instantiated a `Graph` and
`TraversalSource`, written some traversals and hopefully learned something about TinkerPop in general. You've only
scratched the surface of what there is to know, but those accomplishments will help enable your understanding of the
more detailed sections to come.

== The Next Fifteen Minutes

In the first five minutes of _The TinkerPop Workout — by Gremlin_, you learned some basics for traversing graphs. Of
course, there wasn't much discussion about what a graph is. A graph is a collection of vertices (i.e., nodes, dots)
and edges (i.e., relationships, lines), where a vertex is an entity which represents some domain object (e.g., a person or
a place) and an edge represents the relationship between two vertices.

image:modern-edge-1-to-3-1.png[width=300]

The diagram above shows a graph with two vertices, one with a unique identifier of "1" and another with a unique
identifier of "3". There is an edge connecting the two with a unique identifier of "9". It is important to consider
that the edge has a direction, which goes _out_ from vertex "1" and _in_ to vertex "3".

IMPORTANT: Most TinkerPop implementations do not allow for identifier assignment. They will rather assign
their own identifiers and ignore assigned identifiers that you attempt to assign to them.

A graph with elements that just have identifiers does not make for much of a database. To give some meaning to
this basic structure, vertices and edges can each be given labels to categorize them.

image:modern-edge-1-to-3-2.png[width=300]

You can now see that vertex "1" is a "person" and vertex "3" is a "software" vertex. They are joined by a "created"
edge which allows you to see that a "person created software". The "label" and the "id" are reserved attributes of
vertices and edges, but you can add your own arbitrary properties as well:

image:modern-edge-1-to-3-3.png[width=325]

This model is referred to as a _property graph_ and it provides a flexible and intuitive way in which to model your
data.

=== Creating a Graph

As intuitive as it is to you, it is perhaps more intuitive to Gremlin himself, as vertices, edges and properties make
up the very elements of his existence. It is indeed helpful to think of our friend, Gremlin, moving about a graph when
developing traversals, as picturing his position as the link:https://tinkerpop.apache.org/docs/x.y.z/reference/#_the_traverser[traverser]
helps orient where you need him to go next. Let's use the two-vertex, one-edge graph we've been discussing above
as an example. First, you need to create this graph:

[gremlin-groovy]
----
graph = TinkerGraph.open()
g = graph.traversal()
v1 = g.addV("person").property(id, 1).property("name", "marko").property("age", 29).next()
v2 = g.addV("software").property(id, 3).property("name", "lop").property("lang", "java").next()
g.addE("created").from(v1).to(v2).property(id, 9).property("weight", 0.4)
----

There are a number of important things to consider in the above code. First, recall that `id` is
"reserved" for special usage in TinkerPop. It is a member of the enum, `T`. Those "keys" supplied to the creation
method are link:https://docs.oracle.com/javase/8/docs/technotes/guides/language/static-import.html[statically imported]
to the console, which allows you to access them without having to specify their owning enum. Think of `id` as a
shorthand form that enables a more fluid code style. You would normally refer to it as `T.id`, so without
that static importing you would instead have to write:

[gremlin-groovy]
----
graph = TinkerGraph.open()
g = graph.traversal()
v1 = g.addV("person").property(T.id, 1).property("name", "marko").property("age", 29).next()
v2 = g.addV("software").property(T.id, 3).property("name", "lop").property("lang", "java").next()
g.addE("created").from(v1).to(v2).property(T.id, 9).property("weight", 0.4)
----

NOTE: On the JVM, the fully qualified name for `T` is `org.apache.tinkerpop.gremlin.structure.T`. Another important
static import that is often seen in Gremlin comes from `+org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__+`,
which allows for the creation of link:https://tinkerpop.apache.org/docs/x.y.z/reference/#graph-traversal-steps[anonymous traversals].
You can find the analogous variations of `T` and `+__+` for other Gremlin languages by viewing the "Common Imports"
sections for the programming language you are interested in in the
link:https://tinkerpop.apache.org/docs/x.y.z/reference/#gremlin-drivers-variants[Reference Documentation].

Second, don't forget that you are working with TinkerGraph, which allows for identifier assignment. That is _not_ the
case with most graph databases.

Finally, the label for an `Edge` is required and is thus part of the method signature of `addEdge()`. This usage of `addEdge` is
creating an edge that goes _out_ of `v1` and into `v2` with a label of "created".

=== Graph Traversal - Staying Simple

Now that Gremlin knows where the graph data is, you can ask him to get you some data from it by doing a traversal,
which you can think of as executing some link:https://tinkerpop.apache.org/docs/x.y.z/reference/#the-graph-process[process]
over the structure of the graph. We can form our question in English and then translate it to Gremlin. For this
initial example, let's ask Gremlin: "What software has Marko created?"

To answer this question, we would want Gremlin to:

. Find "marko" in the graph
. Walk along the "created" edges to "software" vertices
. Select the "name" property of the "software" vertices

The English-based steps above largely translate to Gremlin's position in the graph and to the steps we need to take
to ask him to answer our question. By stringing these steps together, we form a `Traversal` or the sequence of
programmatic link:https://tinkerpop.apache.org/docs/x.y.z/reference/#graph-traversal-steps[steps] Gremlin needs to
perform in order to get you an answer.

Let's start with finding "marko". This operation is a filtering step as it searches the full set of vertices to match
those that have the "name" property value of "marko". This can be done with the
link:https://tinkerpop.apache.org/docs/x.y.z/reference/#has-step[has()] step as follows:

[gremlin-groovy,modern]
----
g.V().has('name','marko')
----

NOTE: The variable `g` is the `TraversalSource`, which was introduced in the "The First Five Minutes". The
`TraversalSource` is created with `graph.traversal()` and is the object used to spawn new traversals.

This bit of Gremlin can be improved and made more
link:https://tinkerpop.apache.org/docs/x.y.z/recipes/#unspecified-label-in-global-vertex-lookup[idiomatically pleasing]
by including the vertex label as part of the filter to ensure that the "name" property key refers to a "person" vertex.

[gremlin-groovy,modern]
----
g.V().has('person','name','marko')
----

We can picture this traversal in our little graph with Gremlin sitting on vertex "1".

image:modern-edge-1-to-3-1-gremlin.png[width=325]

When Gremlin is on a vertex or an edge, he has access to all the properties that are available to that element.

IMPORTANT: The above query iterates *all* the vertices in the graph to get its answer. That's fine for our little example,
but for multi-million- or billion-edge graphs that is a big problem. To solve this problem, you should look to use
indices. TinkerPop does not provide an abstraction for index management. You should consult the documentation of the
graph you have chosen and utilize its native API to create indices which will then speed up these types of lookups. Your
traversals will remain unchanged, however, as the indices will be used transparently at execution time.

Now that Gremlin has found "marko", he can consider the next step in the traversal where we ask him to "walk"
along "created" edges to "software" vertices. As described earlier, edges have direction, so we have to tell Gremlin
what direction to follow. In this case, we want him to traverse on outgoing edges from the "marko" vertex. For this,
we use the link:https://tinkerpop.apache.org/docs/x.y.z/reference/#vertex-steps[outE] step.

[gremlin-groovy,modern]
----
g.V().has('person','name','marko').outE('created')
----

At this point, you can picture Gremlin moving from the "marko" vertex to the "created" edge.

image:modern-edge-1-to-3-2-gremlin.png[width=325]

To get to the vertex on the other end of the edge, you need to tell Gremlin to move from the edge to the incoming
vertex with `inV()`.

[gremlin-groovy,modern]
----
g.V().has('person','name','marko').outE('created').inV()
----

You can now picture Gremlin on the "software" vertex as follows:

image:modern-edge-1-to-3-3-gremlin.png[width=325]

As you are not asking Gremlin to do anything with the properties of the "created" edge, you can simplify the
statement above with:

[gremlin-groovy,modern]
----
g.V().has('person','name','marko').out('created')
----

image:modern-edge-1-to-3-4-gremlin.png[width=325]

Finally, now that Gremlin has reached the "software that Marko created", he has access to the properties of the
"software" vertex and you can therefore ask Gremlin to extract the value of the "name" property as follows:

[gremlin-groovy,modern]
----
g.V().has('person','name','marko').out('created').values('name')
----

You should now be able to see the connection Gremlin has to the structure of the graph and how Gremlin maneuvers from
vertices to edges and so on. Your ability to string together steps to ask Gremlin to do more complex things depends
on your understanding of these basic concepts.

=== Graph Traversal - Increasing Complexity

Armed with the knowledge from the previous section, let's ask Gremlin to perform some more difficult traversal tasks.
There's not much more that can be done with the "baby" graph we had, so let's return to the "modern" toy graph from
the "First Five Minutes" section. Recall that you can create this `Graph` and establish a `TraversalSource` with:

[gremlin-groovy]
----
graph = TinkerFactory.createModern()
g = graph.traversal()
----

Earlier we'd used the `has()`-step to tell Gremlin how to find the "marko" vertex. Let's look at some other ways to
use `has()`. What if we wanted Gremlin to find the "age" values of both "vadas" and "marko"? In this case we could
use the `within` comparator with `has()` as follows:

[gremlin-groovy,modern]
----
g.V().has('person','name',within('vadas','marko')).values('age')
----

It is worth noting that `within` is statically imported from `P` to the Gremlin Console (much like `T` is, as described
earlier).

NOTE: On the JVM, the fully qualified name for `P` is `org.apache.tinkerpop.gremlin.process.traversal.P`. You can find
the analogous variation of `P` for other Gremlin languages by viewing the "Common Imports" sections for the programming
language you are interested in in the link:https://tinkerpop.apache.org/docs/x.y.z/reference/#gremlin-drivers-variants[Reference Documentation].

If we wanted to ask Gremlin the average age of "vadas" and "marko" we could use the
link:https://tinkerpop.apache.org/docs/x.y.z/reference/#mean-step[mean()] step as follows:

[gremlin-groovy,modern]
----
g.V().has('person','name',within('vadas','marko')).values('age').mean()
----

Another method of filtering is seen in the use of the link:https://tinkerpop.apache.org/docs/x.y.z/reference/#where-step[where]
step. We know how to find the "software" that "marko" created:

[gremlin-groovy,modern]
----
g.V().has('person','name','marko').out('created')
----

image:gremlin-on-software-vertex.png[width=325,float=right] Let's extend on that query to try to learn who "marko"
collaborates with when it comes to the software he created. In other words, let's try to answer the question of: "Who
are the people that marko develops software with?" To do that, we should first picture Gremlin where we left him in
the previous query.  He was standing on the "software" vertex. To find out who "created" that "software", we need to
have Gremlin traverse back _in_ along the "created" edges to find the "person" vertices tied to it.

TIP: The nature of Gremlin leads to long lines of code. Readability can be greatly improved by using line spacing and
indentation. See the link:https://tinkerpop.apache.org/docs/x.y.z/recipes/#style-guide[Style Guide] for recommendations
on what well-formatted Gremlin should look like.

[gremlin-groovy,modern]
----
g.V().has('person','name','marko').
  out('created').in('created').
  values('name')
----

So that's nice, we can see that "peter", "josh" and "marko" are all responsible for creating "v[3]", which is the
"software" vertex named "lop". Of course, we already know about the involvement of "marko" and it seems strange to say that
"marko" collaborates with himself, so excluding "marko" from the results seems logical. The following traversal
handles that exclusion:

[gremlin-groovy,modern]
----
g.V().has('person','name','marko').as('exclude').
  out('created').in('created').
  where(neq('exclude')).
  values('name')
----

We made two additions to the traversal to make it exclude "marko" from the results. First, we added the
link:https://tinkerpop.apache.org/docs/x.y.z/reference/#as-step[as()] step. The `as()`-step is not really a "step",
but a "step modulator" - something that adds features to a step or the traversal. Here, the `as('exclude')` labels
the `has()`-step with the name "exclude" and all values that pass through that step are held in that label for later
use. In this case, the "marko" vertex is the only vertex to pass through that point, so it is held in "exclude".

The other addition that was made was the `where()`-step, which is a filter step like `has()`. The `where()` is
positioned after the `in()`-step that has "person" vertices, which means that the `where()` filter is occurring
on the list of "marko" collaborators. The `where()` specifies that the "person" vertices passing through it should
not equal (i.e., `neq()`) the contents of the "exclude" label. As it just contains the "marko" vertex, the `where()`
filters out the "marko" that we get when we traverse back _in_ on the "created" edges.

You will find many uses of `as()`. Here it is in combination with link:https://tinkerpop.apache.org/docs/x.y.z/reference/#select-step[select]:

[gremlin-groovy,modern]
----
g.V().as('a').out().as('b').out().as('c').
  select('a','b','c')
----

In the above example, we tell Gremlin to iterate through all vertices and traverse _out_ twice from each. Gremlin
will label each vertex in that path with "a", "b" and "c", respectively. We can then use `select` to extract the
contents of that label.

Another common but important step is the link:https://tinkerpop.apache.org/docs/x.y.z/reference/#group-step[group()]
step and its related step modulator called link:https://tinkerpop.apache.org/docs/x.y.z/reference/#by-step[by()]. If
we wanted to ask Gremlin to group all the vertices in the graph by their vertex label we could do:

[gremlin-groovy,modern]
----
g.V().group().by(label)
----

The use of `by()` here provides the mechanism by which to do the grouping. In this case, we've asked Gremlin to
use the `label` (which, again, is an automatic static import from `T` in the console). We can't really tell much
about our distribution though because we just have unique identifiers of vertices as output. To make that nicer we
could ask Gremlin to get us the value of the "name" property from those vertices, by supplying another `by()`
modulator to `group()` to transform the values.

[gremlin-groovy,modern]
----
g.V().group().by(label).by('name')
----

In this section, you have learned a bit more about what property graphs are and how Gremlin interacts with them.
You also learned how to envision Gremlin moving about a graph and how to use some of the more complex, but commonly
utilized traversal steps. You are now ready to think about TinkerPop in terms of its wider applicability to
graph computing.

== The Final Ten Minutes

In these final ten minutes of _The TinkerPop Workout — by Gremlin_, we'll look at TinkerPop from a higher level and
introduce different features it provides to help orient you to some of the project's technology ecosystem. In this
way, you can identify areas of interest and dig into the details from there.

=== Why TinkerPop?

image:provider-integration.png[float=right,width=350] The goal of TinkerPop, as a Graph Computing Framework, is to
make it easy for developers to create graph applications by providing APIs and tools that simplify their endeavors.
One of the fundamental aspects to what TinkerPop offers in this area lies in the fact that TinkerPop is an abstraction
layer over different graph databases and different graph processors. As an abstraction layer, TinkerPop provides a way
to avoid vendor lock-in to a specific database or processor. This capability provides immense value to developers who
are thus afforded options in their architecture and development because:

* They can try different implementations using the same code to decide which is best for their environment.
* They can grow into a particular implementation if they so desire; e.g., start with a graph that is designed to scale
within a single machine and then later switch to a graph that is designed to scale horizontally.
* They can feel more confident in graph technology choices, as advances in the state of different provider
implementations are behind TinkerPop APIs, which open the possibility to switch providers with limited impact.

TinkerPop has always had the vision of being an abstraction over different graph databases. That much
is not new and dates back to TinkerPop 1.x. It is in TinkerPop 3.x, however, that we see the introduction of the notion
that TinkerPop is also an abstraction over different graph processors like link:http://spark.apache.org[Spark]. The
scope of this tutorial does not permit it to delve into "graph processors", but the short story is that the same
Gremlin statement we wrote in the examples above can be executed to run in distributed fashion over Spark or Hadoop.
The changes required to the code to do this are not in the traversal itself, but in the definition of the
`TraversalSource`. You can again see why we encourage graph operations to be executed through that class as opposed
to just using `Graph`. You can read more about these features in this section on
link:https://tinkerpop.apache.org/docs/x.y.z/reference/#hadoop-gremlin[hadoop-gremlin].

TIP: To maintain an abstraction over `Graph` creation, use `GraphFactory.open()` to construct new instances. See
the documentation for individual `Graph` implementations to learn about the configuration options to provide.

=== Loading Data

image:gremlin-to-the-7.png[width=100,float=left] There are many strategies for getting data into your graph. As you are
just getting started, let's look at the simpler methods aimed at "smaller" graphs. A "small" graph, in this
context, is one that has fewer than ten million edges. The most direct way to load this data is to write a Groovy script
that can be executed in the Gremlin Console, a tool that you should be well familiar with at this point. For our
example, let's use the link:http://snap.stanford.edu/data/wiki-Vote.html[Wikipedia Vote Network] data set, which
contains 7,115 vertices and 103,689 edges.

[source,text]
----
$ curl -L -O http://snap.stanford.edu/data/wiki-Vote.txt.gz
$ gunzip wiki-Vote.txt.gz
----

The data is contained in a tab-delimited structure in which vertices are Wikipedia users and edges from one user to
another imply a "vote" relationship. Here is the script to parse the file and generate the `Graph` instance using
TinkerGraph:

[source,groovy]
----
graph = TinkerGraph.open()
graph.createIndex('userId', Vertex.class) <1>

g = graph.traversal()

getOrCreate = { id ->
  g.V().has('user','userId', id).
    fold().
    coalesce(unfold(),
             addV('user').property('userId', id)).next()  <2>
}

new File('wiki-Vote.txt').eachLine {
  if (!it.startsWith("#")){
    (fromVertex, toVertex) = it.split('\t').collect(getOrCreate) <3>
    g.addE('votesFor').from(fromVertex).to(toVertex).iterate()
  }
}
----

<1> To ensure fast lookups of vertices, we need an index. The `createIndex()` method is a method native to
TinkerGraph. Please consult your graph databases' documentation for their index creation approaches.
<2> This "get or create" traversal gets a vertex if it already exists; otherwise, it creates it. It uses `coalesce()` in
a clever way by first determining whether the list of vertices produced by the previous `fold()` has anything in it by
testing the result of `unfold()`. If `unfold()` returns nothing then that vertex doesn't exist and the subsequent
`addV()` inner traversal can be called to create it.
<3> We are iterating each line of the `wiki-Vote.txt` file and this line splits the line on the delimiter, then
uses some neat Groovy syntax to apply the `getOrCreate()` function to each of the two `userId` fields encountered in
the line and stores those vertices in the `fromVertex` and `toVertex` variables, respectively.

NOTE: While this is a tab-delimited structure, this same pattern can be applied
to any data source you require and Groovy tends to have nice libraries that can help make working with data
link:https://thinkaurelius.wordpress.com/2013/02/04/polyglot-persistence-and-query-with-gremlin/[quite enjoyable].

WARNING: Take care if using a `Graph` implementation that supports
link:https://tinkerpop.apache.org/docs/x.y.z/reference/#transactions[transactions]. As TinkerGraph does not, there is
no need to `commit()`. If your `Graph` does support transactions, intermediate commits during load will need to be
applied.

To load larger data sets you should read about the
link:https://tinkerpop.apache.org/docs/x.y.z/reference/#clonevertexprogram[CloneVertexProgram], which provides a
generalized method for loading graphs of virtually any size and consider the native bulk loading features of the
underlying graph database that you've chosen.

=== Gremlin in Other Programming Languages

This tutorial focused on Gremlin usage within the
link:https://tinkerpop.apache.org/docs/x.y.z/tutorials/the-gremlin-console/[Gremlin Console] which means that the
examples were Groovy-based and oriented toward the JVM. Gremlin, however, is far from being a Java-only library.
TinkerPop natively supports a number of different programming languages, making it possible to execute all of the
examples presented in this tutorial with little modification. These different language implementations of Gremlin are
referred to as link:https://tinkerpop.apache.org/docs/x.y.z/reference/#gremlin-drivers-variants[Gremlin Language Variants] and
they help make Gremlin more accessible and easier to use for those who do not use Java as their primary programming
language.

[gremlin-groovy]
----
v1 = g.addV('person').property('name','marko').next()
v2 = g.addV('person').property('name','stephen').next()
g.V(v1).addE('knows').to(v2).property('weight',0.75).iterate()
----
[source,csharp]
----
Vertex v1 = g.AddV("person").Property("name","marko").Next();
Vertex v2 = g.AddV("person").Property("name","stephen").Next();
g.V(v1).AddE("knows").To(v2).Property("weight",0.75).Iterate();
----
[source,java]
----
Vertex v1 = g.addV("person").property("name","marko").next();
Vertex v2 = g.addV("person").property("name","stephen").next();
g.V(v1).addE("knows").to(v2).property("weight",0.75).iterate();
----
[source,javascript]
----
const v1 = g.addV('person').property('name','marko').next();
const v2 = g.addV('person').property('name','stephen').next();
g.V(v1).addE('knows').to(v2).property('weight',0.75).iterate();
----
[source,python]
----
v1 = g.addV('person').property('name','marko').next()
v2 = g.addV('person').property('name','stephen').next()
g.V(v1).addE('knows').to(v2).property('weight',0.75).iterate()
----

=== Conclusion

...and that is the end of _The TinkerPop Workout — by Gremlin_. You are hopefully feeling more confident in your
TinkerPop skills and have a good overview of what the stack has to offer, as well as some entry points to further
research within the reference documentation. Welcome to The TinkerPop!
