You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2016/04/22 17:08:42 UTC

svn commit: r1740534 - in /incubator/tinkerpop/site: gremlin.html images/gremlin-quill.png images/tinkerblocks.png images/tinkerpop-meeting-room.png providers.html

Author: okram
Date: Fri Apr 22 15:08:42 2016
New Revision: 1740534

URL: http://svn.apache.org/viewvc?rev=1740534&view=rev
Log:
added providers.html and graphics.

Added:
    incubator/tinkerpop/site/images/gremlin-quill.png   (with props)
    incubator/tinkerpop/site/images/tinkerblocks.png   (with props)
    incubator/tinkerpop/site/images/tinkerpop-meeting-room.png   (with props)
    incubator/tinkerpop/site/providers.html
Modified:
    incubator/tinkerpop/site/gremlin.html

Modified: incubator/tinkerpop/site/gremlin.html
URL: http://svn.apache.org/viewvc/incubator/tinkerpop/site/gremlin.html?rev=1740534&r1=1740533&r2=1740534&view=diff
==============================================================================
--- incubator/tinkerpop/site/gremlin.html (original)
+++ incubator/tinkerpop/site/gremlin.html Fri Apr 22 15:08:42 2016
@@ -386,6 +386,7 @@ g.V().hasLabel("person").
       <br/>
       <div class="container">
          <h3>OLTP and OLAP Traversals</h3>
+         <br/>
          Gremlin was designed according to the "write once, run anywhere"-philosophy. This means that not only can all TinkerPop-enabled 
          graph systems execute Gremlin traversals, but also, every Gremlin traversal can be evaluated as either a real-time database query 
          or as a batch analytics query. The former is known as an <em>online transactional process</em> (<a href="https://en.wikipedia.org/wiki/Online_transaction_processing">OLTP</a>) and the latter as an <em>online analytics 
@@ -400,6 +401,7 @@ g.V().hasLabel("person").
       <br/>
       <div class="container">
          <h3>Imperative and Declarative Traversals</h3>
+         <br/>
          <div class="row">
             <div class="col-xs-7">
                A Gremlin traversal can be written in either an <em>imperative</em> (<a href="https://en.wikipedia.org/wiki/Imperative_programming">procedural</a>) manner, a <em>declarative</em> (<a href="https://en.wikipedia.org/wiki/Declarative_programming">descriptive</a>) manner, 
@@ -450,6 +452,7 @@ g.V().hasLabel("person").
       <br/>
       <div class="container">
          <h3>Host Language Embedding</h3>
+         <br/>
          Classic database query languages, like <a href="https://en.wikipedia.org/wiki/SQL">SQL</a>, were conceived as being fundamentally different from the programming languages that would 
          ultimately use them in a production setting. For this reason, classical databases require the developer to code both in their native programming 
          language as well as in the database's respective query language. An argument can be made that the difference between "query languages" and 
@@ -517,8 +520,7 @@ g.V().hasLabel("person").
 GraphTraversalSource g;
 g = graph.traversal();                                         // local or remote OLTP
 g = graph.traversal().withComputer(SparkGraphComputer.class);  // distributed OLAP
-g = graph.traversal().withComputer(GiraphGraphComputer.class); // distributed OLAP
-</code>
+g = graph.traversal().withComputer(GiraphGraphComputer.class); // distributed OLAP</code>
 </pre>
          </div>
          <br/> 

Added: incubator/tinkerpop/site/images/gremlin-quill.png
URL: http://svn.apache.org/viewvc/incubator/tinkerpop/site/images/gremlin-quill.png?rev=1740534&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/tinkerpop/site/images/gremlin-quill.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/tinkerpop/site/images/tinkerblocks.png
URL: http://svn.apache.org/viewvc/incubator/tinkerpop/site/images/tinkerblocks.png?rev=1740534&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/tinkerpop/site/images/tinkerblocks.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/tinkerpop/site/images/tinkerpop-meeting-room.png
URL: http://svn.apache.org/viewvc/incubator/tinkerpop/site/images/tinkerpop-meeting-room.png?rev=1740534&view=auto
==============================================================================
Binary file - no diff available.

Propchange: incubator/tinkerpop/site/images/tinkerpop-meeting-room.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: incubator/tinkerpop/site/providers.html
URL: http://svn.apache.org/viewvc/incubator/tinkerpop/site/providers.html?rev=1740534&view=auto
==============================================================================
--- incubator/tinkerpop/site/providers.html (added)
+++ incubator/tinkerpop/site/providers.html Fri Apr 22 15:08:42 2016
@@ -0,0 +1,344 @@
+<!DOCTYPE html>
+<!--
+   \,,,/
+   (o o)
+   -oOOo-(3)-oOOo-
+   -->
+<html lang="en">
+   <head>
+      <meta charset="utf-8">
+      <meta http-equiv="X-UA-Compatible" content="IE=edge">
+      <meta name="viewport" content="width=device-width, initial-scale=1">
+      <title>Apache TinkerPop: The Gremlin Graph Traversal Machine and Language</title>
+      <meta name="description" content="A Graph Computing Framework">
+      <meta name="author" content="Apache TinkerPop">
+      <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
+      <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
+      <!--[if lt IE 9]>
+      <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
+      <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
+      <![endif]-->
+      <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet">
+      <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
+      <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js" type="text/javascript"></script>
+      <link href="prism.css" rel="stylesheet" />
+      <style type="text/css">
+         .nav-icon {
+         width: 24px;
+         height: 24px;
+         margin-right: 5px;
+         }
+         .hero-unit {
+         background-color: #f5f5f5;
+         margin-bottom: 2px;
+         padding: 20px;
+         -webkit-border-radius: 6px;
+         -moz-border-radius: 6px;
+         border-radius: 6px;
+         }
+         .hero-unit h1 {
+         margin-bottom: 0;
+         font-size: 50px;
+         line-height: 1;
+         letter-spacing: -1px;
+         }
+         .hero-unit p {
+         font-size: 18px;
+         font-weight: 200;
+         line-height: 27px;
+         }
+         .carousel-indicators-numbers li {
+         font-size: 10px;
+         text-indent: 0;
+         margin: 0 2px;
+         width: 20px;
+         height: 20px;
+         border: none;
+         border-radius: 100%;
+         line-height: 20px;
+         color: #fff;
+         background-color: #999;
+         }
+         .carousel-indicators-numbers li.active {
+         margin: 0 2px;
+         width: 20px;
+         height: 20px;
+         background-color: #337ab7;
+         }
+         .carousel-indicators {
+         bottom:-35px;
+         }
+         .carousel-inner {
+         margin-bottom:50px;
+         }
+         #footer {
+         background-color: #f5f5f5;
+         }
+         .container .credit {
+         margin: 20px 0;
+         }
+      </style>
+      <!-- Le fav and touch icons -->
+      <link rel="shortcut icon" href="images/favicon.ico">
+      <link rel="apple-touch-icon" href="images/apple-touch-icon.png">
+      <link rel="apple-touch-icon" sizes="72x72" href="images/apple-touch-icon-72x72.png">
+      <link rel="apple-touch-icon" sizes="114x114" href="images/apple-touch-icon-114x114.png">
+   </head>
+   <body>
+      <script src="prism.js"></script>     
+      <nav class="navbar navbar-inverse navbar-static-top" role="navigation">
+         <!-- Brand and toggle get grouped for better mobile display -->
+         <div class="navbar-header">
+            <button type="button" class="navbar-toggle" data-toggle="collapse"
+               data-target="#navbar-collapse-1">
+            <span class="sr-only">Toggle navigation</span>
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+            <span class="icon-bar"></span>
+            </button>
+         </div>
+         <div id="navbar-collapse-1" class="collapse navbar-collapse">
+            <ul class="nav navbar-nav">
+               <li class="dropdown">
+                  <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                  <font face="american typewriter"><b>Apache TinkerPop</b></font> <b class="caret"></b>
+                  </a>
+                  <ul class="dropdown-menu">
+                     <li class="dropdown-header">Introduction</li>
+                     <li><a href="#">Graph Computing</a></li>
+                     <li><a href="#">Graph Computing with Apache TinkerPop</a></li>
+                     <li role="separator" class="divider"></li>
+                     <li class="dropdown-header">Gremlin</li>
+                     <li><a href="#">OLAP and OLTP Traversals</a></li>
+                     <li><a href="#">Imperative and Declarative Traversals</a></li>
+                     <li><a href="#">Host Language Embedding</a></li>
+                     <li role="separator" class="divider"></li>
+                     <li class="dropdown-header">Providers</li>
+                     <li><a href="#">Data System Providers</a></li>
+                     <li><a href="#">Query Language Designers</a></li>
+                  </ul>
+               </li>
+               <li class="dropdown">
+                  <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                  Download <b class="caret"></b>
+                  </a>
+                  <ul class="dropdown-menu">
+                     <li class="dropdown-header">Latest: 3.2.0-incubating (8-Apr-2016)</li>
+                     <li><a href="https://www.apache.org/dyn/closer.lua/incubator/tinkerpop/3.2.0-incubating/apache-gremlin-console-3.2.0-incubating-bin.zip">Gremlin Console</a></li>
+                     <li><a href="https://www.apache.org/dyn/closer.lua/incubator/tinkerpop/3.2.0-incubating/apache-gremlin-server-3.2.0-incubating-bin.zip">Gremlin Server</a></li>
+                     <li><a href="https://www.apache.org/dyn/closer.lua/incubator/tinkerpop/3.2.0-incubating/apache-tinkerpop-3.2.0-incubating-src.zip">Source</a></li>
+                     <li role="separator" class="divider"></li>
+                     <li class="dropdown-header">Previous: 3.1.2-incubating (8-Apr-2016)</li>
+                     <li><a href="https://www.apache.org/dyn/closer.lua/incubator/tinkerpop/3.1.2-incubating/apache-gremlin-console-3.1.2-incubating-bin.zip">Gremlin Console</a></li>
+                     <li><a href="https://www.apache.org/dyn/closer.lua/incubator/tinkerpop/3.1.2-incubating/apache-gremlin-server-3.1.2-incubating-bin.zip">Gremlin Server</a></li>
+                     <li><a href="https://www.apache.org/dyn/closer.lua/incubator/tinkerpop/3.1.2-incubating/apache-tinkerpop-3.1.2-incubating-src.zip">Source</a></li>
+                     <li role="separator" class="divider"></li>
+                     <li><a href="http://archive.apache.org/dist/incubator/tinkerpop/">Archived Versions</a></li>
+                  </ul>
+               </li>
+               <li class="dropdown">
+                  <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                  Documentation <b class="caret"></b>
+                  </a>
+                  <ul class="dropdown-menu">
+                     <li class="dropdown-header">Latest: 3.2.0-incubating (8-Apr-2016)</li>
+                     <li><a href="http://tinkerpop.apache.org/docs/3.2.0-incubating/reference">TinkerPop 3.2.0-incubating</a></li>
+                     <li><a href="http://tinkerpop.apache.org/docs/3.2.0-incubating/upgrade">Upgrade Information</a></li>
+                     <li><a href="http://tinkerpop.apache.org/javadocs/3.2.0-incubating/core/">Core Javadoc API</a></li>
+                     <li><a href="http://tinkerpop.apache.org/javadocs/3.2.0-incubating/full/">Full Javadoc API</a></li>
+                     <li role="separator" class="divider"></li>
+                     <li class="dropdown-header">Previous: 3.1.2-incubating (8-Apr-2016)</li>
+                     <li><a href="http://tinkerpop.apache.org/docs/3.1.2-incubating/">TinkerPop 3.1.2-incubating</a></li>
+                     <li><a href="http://tinkerpop.apache.org/javadocs/3.1.2-incubating/core/">Core Javadoc API</a></li>
+                     <li><a href="http://tinkerpop.apache.org/javadocs/3.1.2-incubating/full/">Full Javadoc API</a></li>
+                     <li role="separator" class="divider"></li>
+                     <li><a href="http://tinkerpop.apache.org/docs/">Documentation Archives</a></li>
+                     <li><a href="http://tinkerpop.apache.org/javadocs/">Javadoc Archives</a></li>
+                     <li role="separator" class="divider"></li>
+                     <li><a href="#publications">Publications</a></li>
+                  </ul>
+               </li>
+               <li class="dropdown">
+                  <a class="dropdown-toggle" data-toggle="dropdown" href="#">Tutorials<b class="caret"></b></a>
+                  <ul class="dropdown-menu">
+                     <li><a href="http://gremlinbin.com/"><img src="images/goutte-blue.png" class="nav-icon"/>Try Gremlin</a></li>
+                     <li role="separator" class="divider"></li>
+                     <li><a href="http://tinkerpop.apache.org/docs/3.2.0-incubating/tutorials/getting-started/">Getting Started</a></li>
+                     <li><a href="http://tinkerpop.apache.org/docs/3.2.0-incubating/tutorials/the-gremlin-console/">The Gremlin Console</a></li>
+                     <li><a href="http://sql2gremlin.com/">SQL2Gremlin</a></li>
+                  </ul>
+               </li>
+               <li class="dropdown">
+                  <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                  Community <b class="caret"></b>
+                  </a>
+                  <ul class="dropdown-menu">
+                     <li><a href="http://groups.google.com/group/gremlin-users">User Mailing List</a></li>
+                     <li><a href="http://mail-archives.apache.org/mod_mbox/incubator-tinkerpop-dev/">Developer Mailing List</a></li>
+                     <li><a href="https://issues.apache.org/jira/browse/TINKERPOP/">Issue Tracker</a></li>
+                     <li><a href="http://tinkerpop.apache.org/docs/3.2.0-incubating/dev/developer/#_contributing">Contributing</a></li>
+                     <li><a href="#graph-systems">Graph Systems</a></li>
+                     <li><a href="#graph-libraries">Graph Libraries</a></li>
+                     <li><a href="#committers">Project Committers</a></li>
+                     <li role="separator" class="divider"></li>
+                     <li><a href="https://github.com/apache/incubator-tinkerpop/"><img src="images/gremlin-github.png" class="nav-icon"/>GitHub</a></li>
+                     <li><a href="https://twitter.com/apachetinkerpop">Twitter</a></li>
+                  </ul>
+               </li>
+               <li class="dropdown">
+                  <a href="#" class="dropdown-toggle" data-toggle="dropdown">
+                  Apache Software Foundation <b class="caret"></b>
+                  </a>
+                  <ul class="dropdown-menu">
+                     <li><a href="http://www.apache.org/">Apache Homepage</a></li>
+                     <li><a href="http://www.apache.org/licenses/">License</a></li>
+                     <li><a href="http://www.apache.org/foundation/sponsorship.html">Sponsorship</a></li>
+                     <li><a href="http://www.apache.org/foundation/thanks.html">Thanks</a></li>
+                     <li><a href="http://www.apache.org/security/">Security</a></li>
+                  </ul>
+               </li>
+            </ul>
+         </div>
+      </nav>
+      <!----------------->
+      <div class="container">
+         <!-- Main hero unit for a primary marketing message or call to action -->
+         <div class="hero-unit" style="padding:10px">
+            <b><font size="6" face="american typewriter">Apache TinkerPop&trade;</font></b>  
+            <p><font size="3">Providers supporting Apache TinkerPop</font></p>
+            <p><img src="images/tinkerpop-meeting-room.png" class="img-responsive" style="border-radius:5px;"/></p>
+         </div>
+      </div>
+      <div><br/></div>
+      <div class="container-fluid">
+      <div class="container">
+         <div class="row">
+            <div class="col-xs-10">
+               Apache TinkerPop grows when graph system/service providers and graph language designers support it. While Apache's distribution of TinkerPop 
+               does provide production ready implementations and tools, it is ultimately the larger ecosystem of providers that ensure TinkerPop's widespread adoption. 
+               There are three types of providers. The first are those that develop a (graph) database or (graph) analytics processor and want to offer their users TinkerPop-specific 
+               graph computing features. The other type of provider are language designers that have a (graph) query language they wish to have execute on the Gremlin traversal machine 
+               and thus, against any TinkerPop-enabled graph system.
+            </div>
+            <div class="col-xs-2">
+               <img src="images/gremlin-head.png" width="120px">
+            </div>
+         </div>
+         <br/>
+         <br/>
+         <div class="container">
+            <h3>Data System Developers</h3>
+            <br/>
+            <div class="row">
+               <div class="col-xs-8">
+                  At an abstract level, every data system is ultimately a "graph system" because every data system supports the representation of "things" (vertices) and their respective relationships 
+                  to one another (edges).  For instance, a relational database may have a people-table, where the rows denote person vertices and the columns denote properties of those individuals 
+                  (e.g. their name and age). Moreover, that relational database may also have a knows-table, where two columns reference primary keys in the people-table and the remaining columns 
+                  denote properties of those relationships (e.g. creation timestamp, strength of friendship, etc.). TinkerPop enables any data system to expose its implicit graph structure within the 
+                  lexicon of vertices and edges. From there, what differentiates each TinkerPop-enabled system are the various time/space-tradeoffs that were made for representing their "graph" in-memory, 
+                  on-disk, and across a multi-machine compute cluster. TinkerPop users have the luxury of choosing a graph system based on those design choices that are important for their application. 
+                  Moreover, they only need to concern themselves with learning the Gremlin traversal language as every TinkerPop-enabled graph system supports Gremlin.
+               </div>
+               <div class="col-xs-3">
+                  <img src="images/tinkerblocks.png" width="350px">
+               </div>
+            </div>
+            <br/>
+            It is (relatively) easy for a data system to become TinkerPop-enabled. There are two interface packages that need to be implemented with one of them being optional. Once implemented 
+            the Gremlin traversal machine can talk to the vendor's system and thus, so can any of their users' Gremlin traversals as well as any existing tools/technologies that have been designed 
+            to interact with a TinkerPop-enabled system.
+            <br/>
+            <br/>
+            <ol>
+               <li><strong>The Graph (required)</strong>: These foundational interfaces define the semantics of the operations on a graph, vertex, edge, and property. Once implemented, the vendor's data system can immediately be queried using Gremlin OLTP. However, vendors may want to provide a collection of vendor-specific compiler optimizations called traversal strategies which can leverage their product's unique features (e.g. global indices, vertex-centric indices, sort orders, sequential scanners, push-down predicates, etc.).</li>
+               <br/>
+               <li><strong>The GraphComputer (optional)</strong>: All OLAP-based graph processors must implement the primary graph interfaces mentioned above as well as a set of parallel-processing message-passing interfaces. However, it is possible for a data system to only implement the primary graph interfaces and still provide OLAP support to their users by integrating their system with an existing GraphComputer implementation such as, for example, SparkGraphComputer or GiraphGraphComputer (both are provided in Apache's distribution of TinkerPop).</li>
+            </ol>
+            <br/>
+            Finally, there are other tools and technologies that the vendor can leverage from TinkerPop such as Gremlin Server, Gremlin Console, and the like. The purpose of Apache TinkerPop is to make it easy for vendors to add graph functionality to their product and/or to build a product from scratch and immediately have a query language, server infrastructure, metrics/reporting integration, cluster-based analytics and more.
+         </div>
+         <br/>
+         <div class="container">
+            <h3>Query Language Designers</h3>
+            <br/>
+            <div class="row">
+               <div class="col-xs-3">
+                  <img src="images/gremlin-quill.png" width="200px">
+               </div>
+               <div class="col-xs-9">
+                  With the growth of NoSQL, for which graph databases are a subclass, many new database query languages have been developed. SQL has always been the industry standard, but now there exists others such as CQL, Datalog, and XQuery. Even in the graph database space there is SPARQL, Cypher, GraphQL, and of course, Gremlin. Much like the Java virtual machine is a host to multiple programming languages including Java, Scala, Groovy, Clojure, JavaScript, etc., the Gremlin traversal machine is a host to multiple query languages. The Gremlin traversal machine's instruction set ensures Turing Completeness and as such, any query language can compile to execute on the Gremlin traversal machine. There are three types of language designers. Below, each type will demonstrate the "same traversal" expressed in different languages. Ultimately, they all compile to the Gremlin traversal below which computes the average rating for the projects created by Gremlin's friends.
+               </div>
+            </div>
+         </div>
+         <br/>
+         <div class="container">
+            <div class="row">
+               <div class="col-xs-4">
+                  <pre style="padding:10px"><code class="language-javascript">g.V().has("person","name","gremlin").
+  out("knows").out("created").
+  hasLabel("project").
+  values("stars").mean()</code></pre>
+               </div>
+            </div>
+            <div class="col-xs-3"></div>
+         </div>
+         <br/>
+         <div class="container">
+            <div class="row">
+               <div class="col-xs-9">
+                  <br/>
+                  <strong>Distinct query language</strong>: Query languages such as SQL and SPARQL are significantly different from Gremlin in that they require a special purpose compiler in order to generate a traversal. For this reason, SQL and SPARQL Gremlin compilers currently exist. Note that, within reason, Gremlin compilers do not need to concern themselves with an optimal compilation (only a semantically correct compilation) as the Gremlin traversal machine will leverage traversal strategies for both compile-time and runtime optimizations. Moreover, the language designer can rest assured that queries in their language will be able to evaluate as either an OLTP or OLAP query. The example on the right is a SPARQL query that determines the average rating for Gremlin's friends' projects. It is because of the Gremlin traversal machine, that that SPARQL query can immediately execute over Spark (for instance).     
+               </div>
+               <div class="col-xs-3">
+                  <pre style="padding:10px;"><code class="language-javascript">SELECT AVG(?stars) WHERE {
+  ?a v:label person .
+  ?a v:name "gremlin" .
+  ?a e:knows ?b .
+  ?b e:created ?c .
+  ?c v:label "project" .
+  ?c v:stars ?stars
+}</code></pre>
+               </div>
+            </div>
+         </div>
+         <br/>
+         <br/>
+         <div class="container">
+            <div class="row">
+               <div class="col-xs-8">
+                  <strong>Gremlin language variants</strong>: There are various Gremlin language variants such as Gremlin-Scala. These languages interact directly with TinkerPop's GraphTraversal interface and are able to generate Gremlin traversals utilizing the same naming/style-conventions as Gremlin-Java. Moreover, where appropriate, they can deviate from convention in order to take advantage of the unique expressive qualities of the host language. For instance, Gremlin-Scala boasts advanced type safety and an "ASCII-art" mutation syntax.
+               </div>
+               <div class="col-xs-4">
+                  <pre style="padding:10px;"><code class="language-javascript">g.V.has('person','name','gremlin').
+  out('knows').out('created').
+  hasLabel('project').stars.mean</code></pre>
+               </div>
+            </div>
+         </div>
+         <br/>
+         <br/>
+         <div class="container">
+            <div class="row">
+               <div class="col-xs-8">
+                  <strong>Domain specific languages</strong>: A users's application logic typically represents its domain in terms of real-world objects, not "vertices" and "edges." While most application developers will become comfortable writing all their traversals in the vertex/edge-lexicon of Gremlin, it may be desirable to create a domain specific language for, perhaps, business users. To do so is simple. The language designer extends Traversal and interacts with an underlying GraphTraversal exposing "high-level" steps that may ultimately be composed of a complex sequence of "low-level" vertex/edge-steps. A major boon is that the DSL designer does not have to worry about compiler optimization as the "low-level" GraphTraversal representation will ultimately be subjected to traversal strategies prior to OLTP or OLAP evaluation. The example on the right is a hypothetical SocialDSL that allows users to query their graph from the perspective of people, projects, etc. and is thus bo
 und to that graph's particular social data schema.        
+               </div>
+               <div class="col-xs-4">
+                  <br/>
+                  <br/>
+                  <pre style="padding:10px;"><code class="language-javascript">SELECT(Average.of(Stars)).
+ FROM(Projects).
+ WHERE(Created.by(Friends.of("gremlin")))</code></pre>
+               </div>
+            </div>
+         </div>
+      </div>
+      <!-- /container -->
+      <br/>
+      <br/>
+      <div id="footer">
+         <div class="container">
+            <p class="muted credit">Apache TinkerPop, TinkerPop, Apache, Apache feather logo, and Apache TinkerPop project logo are either registered trademarks or trademarks of <a href="http://www.apache.org/">The Apache Software Foundation</a> in the United States and other countries.</p>
+         </div>
+      </div>
+   </body>
+</html>