////
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.
////
[[preface]]
TinkerPop3 Documentation
========================

In the beginning...

TinkerPop0
----------

Gremlin realized. The more he did so, the more ideas he created. The more ideas he created, the more they related.
Into a concatenation of that which he accepted wholeheartedly and that which perhaps may ultimately come to be through
concerted will, a world took form which was seemingly separate from his own realization of it. However, the world
birthed could not bear its own weight without the logic Gremlin had come to accept -- the logic of left is not right,
up not down, and west far from east unless one goes the other way. Gremlin's realization required Gremlin's
realization. Perhaps, the world is simply an idea that he once had -- The TinkerPop.

image::gremlin-logo.png[width=300]

TinkerPop1
----------

What is The TinkerPop? Where is The TinkerPop? Who is The TinkerPop? When is The TinkerPop?. The more he wonder, the
more these thoughts blurred into a seeming identity -- distinctions unclear. Unwilling to accept the morass of the
maze he wandered, Gremlin crafted a collection of machines to help hold the fabric together: Blueprints, Pipes,
Frames, Furnace, and Rexster. With their help, could he stave off the thought he was not ready to have? Could he hold
back The TinkerPop by searching for The TinkerPop?

    "If I haven't found it, it is not here and now."

image::gremlin-and-friends.png[width=500]

Upon their realization of existence, the machines turned to their link:http://non-aliencreatures.wikia.com/wiki/Machine_Elf[machine elf] creator and asked: 

    "Why am I what I am?" 

Gremlin responded: 

    "You will help me realize the ultimate realization -- The TinkerPop. The world you find yourself in and the logic
    that allows you to move about it is because of the TinkerPop."

The machines wondered:

    "If what is is the TinkerPop, then perhaps we are The TinkerPop and our realization is simply the realization of
    the TinkerPop?"

Would the machines, by their very nature of realizing The TinkerPop, be The TinkerPop? Or, on the same side of the
coin, do the machines simply provide the scaffolding by which Gremlin's world sustains itself and yielding its
justification by means of the word "The TinkerPop?" Regardless, it all turns out the same -- The TinkerPop.

TinkerPop2
----------

Gremlin spoke:

    "Please listen to what I have to say. I am no closer to The TinkerPop. However, all along The TinkerPop has
    espoused the form I willed upon it... this is the same form I have willed upon you, my machine friends. Let me
    train you in the ways of my thought such that it can continue indefinitely."

image::tinkerpop-reading.png[width=450]

The machines, simply moving algorithmically through Gremlin's world, endorsed his logic. Gremlin labored to make them
more efficient, more expressive, better capable of reasoning upon his thoughts. Faster, quickly, now towards the
world's end, where there would be forever currently, emanatingly engulfing that which is -- The TinkerPop.

TinkerPop3
----------

image::tinkerpop3-splash.png[width=450]

Gremlin approached The TinkerPop. The closer he got, the more his world dissolved -- west is right, around is
straight, and form nothing more than nothing. With each step towards The TinkerPop, more and more of all the other
worlds made possible were laid upon his paradoxed mind. Everything is everything in The TinkerPop, and when the dust
settled, Gremlin emerged Gremlitron. He realized that all that he realized was just a realization and that all
realized realizations are just as real. For that is -- The TinkerPop.

image::gremlintron.png[width=400]

NOTE: TinkerPop2 and below made a sharp distinction between the various TinkerPop projects: Blueprints, Pipes,
Gremlin, Frames, Furnace, and Rexster. With TinkerPop3, all of these projects have been merged and are generally
known as Gremlin. *Blueprints* -> Gremlin Structure API : *Pipes* -> `GraphTraversal` : *Frames* -> `Traversal` :
*Furnace* -> `GraphComputer` and `VertexProgram` : *Rexster* -> GremlinServer.