Go Driver

Connect to Traverse from Go using the official Neo4j Bolt driver.

Install

go get github.com/neo4j/neo4j-go-driver/v6

Connect

package main

import (
    "context"
    "fmt"
    "github.com/neo4j/neo4j-go-driver/v6/neo4j"
)

func main() {
    ctx := context.Background()

    driver, err := neo4j.NewDriver(
        "bolt://localhost:7690",
        neo4j.NoAuth(),
    )
    if err != nil {
        panic(err)
    }
    defer driver.Close(ctx)

    // With authentication
    driver, _ = neo4j.NewDriver(
        "bolt://localhost:7690",
        neo4j.BasicAuth("admin", "s3cret", ""),
    )
}

Run Queries

result, err := neo4j.ExecuteQuery(ctx, driver,
    "MATCH (n:Person) WHERE n.age > $minAge RETURN n.name, n.age",
    map[string]any{"minAge": 25},
    neo4j.EagerResultTransformer,
)
if err != nil {
    panic(err)
}

for _, record := range result.Records {
    name, _ := record.Get("n.name")
    age, _ := record.Get("n.age")
    fmt.Println(name, age)
}

Select a Database

result, err := neo4j.ExecuteQuery(ctx, driver,
    "MATCH (n) RETURN count(n) AS count",
    nil,
    neo4j.EagerResultTransformer,
    neo4j.ExecuteQueryWithDatabase("mydb"),
)

Write Data

_, err := neo4j.ExecuteQuery(ctx, driver,
    "CREATE (p:Person {name: $name, age: $age})",
    map[string]any{"name": "Alice", "age": 30},
    neo4j.EagerResultTransformer,
)
if err != nil {
    panic(err)
}

Session-Based Queries

session := driver.NewSession(ctx, neo4j.SessionConfig{
    DatabaseName: "mydb",
})
defer session.Close(ctx)

result, err := session.Run(ctx,
    "MATCH (n:Person) RETURN n.name",
    nil,
)
if err != nil {
    panic(err)
}

for result.Next(ctx) {
    name, _ := result.Record().Get("n.name")
    fmt.Println(name)
}

Transactions

session := driver.NewSession(ctx, neo4j.SessionConfig{})
defer session.Close(ctx)

// Transaction function (recommended — auto-retries on transient errors)
_, err := session.ExecuteWrite(ctx,
    func(tx neo4j.ManagedTransaction) (any, error) {
        _, err := tx.Run(ctx,
            "CREATE (p:Person {name: $name, age: $age})",
            map[string]any{"name": "Dave", "age": 28},
        )
        return nil, err
    },
)

// Explicit transaction
tx, err := session.BeginTransaction(ctx)
if err != nil {
    panic(err)
}
tx.Run(ctx, "CREATE (p:Person {name: 'Bob'})", nil)
tx.Run(ctx, "CREATE (p:Person {name: 'Carol'})", nil)
tx.Commit(ctx)

Graph Types

result, _ := neo4j.ExecuteQuery(ctx, driver,
    "MATCH (n:Person)-[r:KNOWS]->(m) RETURN n, r, m LIMIT 1",
    nil, neo4j.EagerResultTransformer,
)
record := result.Records[0]

nodeVal, _ := record.Get("n")
node := nodeVal.(neo4j.Node)
fmt.Println(node.Labels)           // [Person]
fmt.Println(node.Props["name"])    // property access

relVal, _ := record.Get("r")
rel := relVal.(neo4j.Relationship)
fmt.Println(rel.Type)              // KNOWS

Close the Driver

driver.Close(ctx)

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