Fluent API queries

(a.k.a. Gremlin Language Variant - with extensions)

The DSE Java driver provides utilities to create a GraphStatement out of the popular open-source graph computing framework Apache TinkerPop. The query language for Apache Tinkerpop is called Gremlin and it is defined by a set of functions and variables defined in the Traversal API.

The Traversal API is a set of functions that define a Gremlin traversal, the graph operation to execute. In the DSE Java driver a traversal is considered like a query, that can be wrapped inside a GraphStatement.

Here’s how to create a GraphStatement out of a Apache TinkerPop Traversal:

// traversal() returns a dummy GraphTraversalSource that is not meant to be iterated itself
GraphTraversalSource g = DseGraph.traversal();
GraphTraversal traversal = g.V().has("name", "marko"); // Java-based Gremlin Traversal API, more comfortable than a String query

GraphStatement graphStatement = DseGraph.statementFromTraversal(traversal);

Executing a GraphStatement is explained in the statement execution section.

Note: using the Fluent API (and the DseGraph class) requires adding the module dse-java-driver-graph as a dependency. It can be found on Maven as:

<dependency>
    <groupId>com.datastax.dse</groupId>
    <artifactId>dse-java-driver-graph</artifactId>
    <version>1.9.0</version>
</dependency>
Gremlin Domain Specific Languages

The Gremlin language can be extended to match a user’s specific use cases and make the development of graph traversals easier. Doing so would require a GraphTraversal class that exposes their domain-specific grammar and methods and need this new grammar via the Fluent API.

As of DSE Java driver 1.4.0, the DseGraph class exposes additional utilities to create a traversal source equipped with custom user-defined traversal methods easily.

After generating a custom GraphTraversalSource as explained in the TinkerPop documentation, users may use it directly to create a GraphStatement out of a traversal. Here’s an example using GraphStatements:

// see TinkerPop documentation link for the generation of SocialTraversalSource
SocialTraversalSource gSocial = DseGraph.traversal(SocialTraversalSource.class);

GraphStatement gs = DseGraph.statementFromTraversal(gSocial.persons("marko").knows("vadas"));
DSE Search Text and Geo Gremlin predicates

For ease of use, DSE Search and Geo predicates are directly integrated and provided in the Fluent API.

Here’s an example allowing to use DSE Search to do an index search on a text field:

GraphTraversalSource g = DseGraph.traversal();
GraphTraversal traversal = g.V().has("textProp", Search.tokenPrefix("1")).next();

GraphStatement graphStatement = DseGraph.statementFromTraversal(traversal);

Or here is how to use the Geo class to do location-based traversals using DSE Search Geo indexing features:

GraphTraversalSource g = DseGraph.traversal();

Point center = Geo.point(12, 14);
double radius = 3;
GraphTraversal traversal = g.V().has("point", Geo.inside(center, radius));

GraphStatement graphStatement = DseGraph.statementFromTraversal(traversal);

Please check out the Javadocs of the Geo and Search classes to see all the available predicates.

Batch mutations with the Fluent API

The DSE Java driver allows to batch multiple graph updates inside a single transaction via the Fluent API.

To do so, the DseGraph class is necessary to create a TraversalBatch object. This object will be the holder of all the graph mutations the user wishes to apply within the same transaction.

All operations will be applied if the execution completes successfully or none if any of the operation fails.

Once the TraversalBatch instance has been successfully populated with the desired traversal mutations, the TraversalBatch needs to be converted into a GraphStatement to be executed on the DseSession, with the instance method TraversalBatch#asGraphStatement(). Then on the created GraphStatement, all the usual Graph options will be available.

Here’s a code example:

GraphTraversalSource g = DseGraph.traversal();
TraversalBatch batch = DseGraph.batch();
// Add two vertices
batch.add(g.addV("person").property("name", "batch1").property("age", 1));
batch.add(g.addV("person").property("name", "batch2").property("age", 2));
// Add an edge between
batch.add(g.V().has("name", "batch1").as("v1").V().has("name", "batch2").addE("knows").from("v1").property("weight", 2.3f));
GraphStatement statement = batch.asGraphStatement(); 
statement.setConsistencyLevel(ConsistencyLevel.LOCAL_ONE);

It is also possible to add a TraversalBatch to another, via the TraversalBatch#addAll method.

Check out the Java doc of the DseGraph.batch() method for more information.

The TraversalBatch feature is only usable against DSE 6.0+.

Prepared statements

Prepared graph statements are not supported by DSE yet (they will be added in the near future).