blob: e86dde93b80cfa9f58ae689e964027109b160a1b [file] [view]
# Graph support
`Client` includes the `executeGraph()` method to execute graph queries:
```javascript
const client = new cassandra.Client({
contactPoints: ['host1', 'host2'],
localDataCenter: 'dc1',
graphOptions: { name: 'demo' }
});
// executeGraph() method returns a Promise
client.executeGraph('g.V()')
.then(function (result) {
const vertex = result.first();
console.log(vertex.label);
});
```
Alternatively, you can use the callback-based execution:
```javascript
client.executeGraph('g.V()', function (err, result) {
assert.ifError(err);
const vertex = result.first();
// ...
});
```
## Graph Options
You can set default graph options when initializing `Client` which will be used for all graph statements. For
example, to avoid providing a `graphName` option in each `executeGraph()` call:
```javascript
const cassandra = require('cassandra-driver');
const client = new cassandra.Client({
contactPoints: ['host1', 'host2'],
localDataCenter: 'dc1',
graphOptions: { name: 'demo' }
});
```
These options may be overridden by specifying the [execution profile](../execution-profiles) when calling `executeGraph()`:
```javascript
// Use a different graph name than the one provided when creating the client instance
const result = await client.executeGraph(query, params, { executionProfile: 'graph-oltp' });
const vertex = result.first();
console.log(vertex.label);
```
You can check out more info on [Execution Profiles](../execution-profiles).
## Handling Results
Graph queries return a `GraphResultSet`, which is an [iterable][iterable] of items. The format of the data returned is
dependent on the data requested.
Retrieving property values:
```javascript
const result = await client.executeGraph('g.V().hasLabel("person").values("name")');
for (const name of result) {
console.log(name);
}
```
Retrieving vertices:
```javascript
const result = await client.executeGraph('g.V().hasLabel("person")');
for (const vertex of result) {
console.log(vertex.label);
}
```
Retrieving edges:
```javascript
const result = await client.executeGraph('g.E()');
for (const edge of result) {
console.log(edge.label);
}
```
### Parameters
Graph traversal execution supports named parameters. Parameters must be passed in as an object:
```javascript
const traversal = 'g.addV(vertexLabel).property("name", username)';
await client.executeGraph(traversal, { vertexLabel: 'person', username: 'marko' });
```
### Graph types
The DataStax Node.js driver supports a wide variety of TinkerPop types and [DSE types](../datatypes/). For graph
types that don't have a native JavaScript representation, the driver provides the [`types`
module](../../api/module.types/).
For example:
```javascript
const { types } = require('cassandra-driver');
const { Uuid, InetAddress } = types;
const traversal = 'g.addV("sample").property("uid", uid).property("ip_address", address)';
await client.execute(traversal, { uid: Uuid.random(), address: InetAddress.fromString('10.0.0.100') });
```
The same types are also supported for traversal execution results:
```javascript
const rs = await client.execute('g.V().hasLabel("sample").values("ip_address")');
for (const ip of rs) {
console.log(ip instanceof InetAddress); // true
}
```
#### User-defined types
User-defined types (UDTs) are supported in the Node.js driver using JavaScript objects.
```javascript
const rs = await client.execute('g.V().hasLabel("sample").values("user_address")');
for (const address of rs) {
console.log(`User address is ${address.street}, ${address.city} ${address.state}`);
}
```
In order to use a UDT as a parameter, you must wrap the object instance using `asUdt()` function to provide
additional information to properly represent the UDT on the server.
```javascript
const { datastax } = require('cassandra-driver');
const { asUdt } = datastax.graph;
// Get the UDT metadata
const udtInfo = await client.metadata.getUdt(graphName, 'address');
// Build the UDT
const address = asUdt({ street: '123 Priam St.', city: 'My City', state: 'MY' }, udtInfo);
const traversal = 'g.addV("sample").property("uid", uid).property("user_address", address)';
// Use the UDT as parameter
await client.execute(traversal, { uid: Uuid.random(), address });
```
[iterable]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#iterable
[modern-graph]: http://tinkerpop.apache.org/docs/3.4.5/reference/#graph-computing