JavaScript Driver

Connect to Traverse from Node.js or the browser using the official Neo4j Bolt driver.

Install

npm install neo4j-driver

Connect

import neo4j from 'neo4j-driver';

const driver = neo4j.driver('bolt://localhost:7690');

// With authentication
const driver = neo4j.driver(
  'bolt://localhost:7690',
  neo4j.auth.basic('admin', 's3cret')
);

Run Queries

const { records, summary } = await driver.executeQuery(
  'MATCH (n:Person) WHERE n.age > $minAge RETURN n.name, n.age',
  { minAge: neo4j.int(25) },
);

for (const record of records) {
  console.log(record.get('n.name'), record.get('n.age').toNumber());
}

Select a Database

const { records } = await driver.executeQuery(
  'MATCH (n) RETURN count(n) AS count',
  {},
  { database: 'mydb' },
);
console.log(records[0].get('count').toNumber());

Write Data

await driver.executeQuery(
  'CREATE (p:Person {name: $name, age: $age})',
  { name: 'Alice', age: neo4j.int(30) },
);

Session-Based Queries

const session = driver.session({ database: 'mydb' });
const result = await session.run('MATCH (n:Person) RETURN n.name');

for (const record of result.records) {
  console.log(record.get('n.name'));
}

await session.close();

Transactions

const session = driver.session();

// Transaction function (recommended — auto-retries on transient errors)
await session.executeWrite(async tx => {
  await tx.run(
    'CREATE (p:Person {name: $name, age: $age})',
    { name: 'Dave', age: neo4j.int(28) }
  );
});

// Explicit transaction
const tx = session.beginTransaction();
await tx.run("CREATE (p:Person {name: 'Bob'})");
await tx.run("CREATE (p:Person {name: 'Carol'})");
await tx.commit();

await session.close();

Integer Handling

Bolt integers are 64-bit. The driver uses neo4j.Integer to avoid JavaScript precision loss:

// Creating integers
const age = neo4j.int(42);

// Reading integers
const val = record.get('age');
console.log(val.toNumber());  // safe if within Number.MAX_SAFE_INTEGER
console.log(val.toString());  // always safe

Graph Types

const { records } = await driver.executeQuery(
  'MATCH (n:Person)-[r:KNOWS]->(m) RETURN n, r, m LIMIT 1'
);
const record = records[0];

const node = record.get('n');
console.log(node.labels);             // ['Person']
console.log(node.properties.name);    // property access

const rel = record.get('r');
console.log(rel.type);                // 'KNOWS'

Close the Driver

await driver.close();

Note: Traverse speaks Bolt 5.1–6.0. See Bolt Protocol for details.