ArcadeDB Developer Center

Drivers, protocols and query languages in one place. Pick your language, copy a working sample, and connect. ArcadeDB ships official HTTP and gRPC clients, a native Java API, and wire-protocol compatibility that lets PostgreSQL, Neo4j, MongoDB and Redis clients talk to it unchanged.

Connect, create, query: pick your language

Every sample below connects to a server, writes a two-person graph and asks who Alice knows. They assume a server on localhost with the root password playwithdata and an existing database called mydb. The fastest way to get there is one Docker command from the Deployment Center, then:

curl -X POST http://localhost:2480/api/v1/server -u root:playwithdata \
  -H "Content-Type: application/json" -d '{"command":"create database mydb"}'

All samples talk to a running server, the client-server deployment. Java and Python can also run the whole database inside your process: see embedded Java and embedded Python.

Install: com.arcadedb:arcadedb-engine:26.10.1 (embedded, runs in your JVM)

try (DatabaseFactory factory = new DatabaseFactory("./databases/mydb")) {
  Database db = factory.exists() ? factory.open() : factory.create();
  db.transaction(() -> {
    db.getSchema().getOrCreateVertexType("Person");
    db.getSchema().getOrCreateEdgeType("KNOWS");
    MutableVertex alice = db.newVertex("Person").set("name", "Alice").save();
    MutableVertex bob = db.newVertex("Person").set("name", "Bob").save();
    alice.newEdge("KNOWS", bob);
  });
  try (ResultSet rs = db.query("sql",
      "SELECT expand(out('KNOWS')) FROM Person WHERE name = :name", Map.of("name", "Alice"))) {
    rs.stream().forEach(r -> System.out.println(r.getProperty("name")));
  }
  db.close();
}

To reach a server instead, add com.arcadedb:arcadedb-network and open new RemoteDatabase("localhost", 2480, "mydb", "root", "playwithdata"): it exposes the same query(language, command, params) and command(...) calls. For gRPC use arcadedb-grpc-client. The official Neo4j Java driver also works over Bolt. Docs: Java API, remote API, Java tutorial.

Install: pip install arcadedb-driver (Python 3.10+, sync and async)

from arcadedb_driver import ArcadeDBServer, basic_auth

with ArcadeDBServer(base_url="http://localhost:2480", auth=basic_auth("root", "playwithdata")) as srv:
    db = srv.db("mydb")
    db.command(language="cypher",
               command="CREATE (:Person {name: $a})-[:KNOWS]->(:Person {name: $b})",
               params={"a": "Alice", "b": "Bob"})
    env = db.query(language="cypher",
                   command="MATCH (:Person {name: $name})-[:KNOWS]->(f) RETURN f.name AS friend",
                   params={"name": "Alice"})
    for row in env.result:  # check env.truncated before trusting a partial answer
        print(row["friend"])

Use AsyncArcadeDBServer for asyncio, and arcadedb-driver-grpc for streaming workloads. Docs: Python HTTP driver, Python gRPC driver. Want the database inside your Python process instead? pip install arcadedb-embedded.

Install: npm install @arcadedb/driver (Node.js 20+ and browsers, ESM only)

import { createClient, basicAuth } from "@arcadedb/driver";

const server = createClient({ baseUrl: "http://localhost:2480", auth: basicAuth("root", "playwithdata") });
const db = server.db("mydb");

await db.command({
  language: "sqlscript",
  command: `CREATE VERTEX TYPE Person IF NOT EXISTS; CREATE EDGE TYPE KNOWS IF NOT EXISTS;
    LET a = CREATE VERTEX Person SET name = :a; LET b = CREATE VERTEX Person SET name = :b;
    CREATE EDGE KNOWS FROM $a TO $b;`,
  params: { a: "Alice", b: "Bob" },
});
const { result, truncated } = await db.query({
  language: "cypher",
  command: "MATCH (:Person {name: $name})-[:KNOWS]->(f) RETURN f.name AS friend",
  params: { name: "Alice" },
});
console.log(result.map((row) => row.friend), truncated);

Import it, do not require() it. For server-to-server streaming use @arcadedb/driver-grpc (Node, Bun and Deno; no browser build). Docs: JS HTTP driver, JS gRPC driver.

Install: go get github.com/ArcadeData/arcadedb-drivers/go/arcadedb@latest

ctx := context.Background()
srv, err := arcadedb.NewServer("http://localhost:2480", arcadedb.WithBasicAuth("root", "playwithdata"))
if err != nil {
	log.Fatal(err)
}
defer srv.Close()
db := srv.DB("mydb")

_, err = db.Command(ctx, arcadedb.Cypher,
	"CREATE (:Person {name: $a})-[:KNOWS]->(:Person {name: $b})", map[string]any{"a": "Alice", "b": "Bob"})
if err != nil {
	log.Fatal(err)
}
env, err := db.Query(ctx, arcadedb.Cypher,
	"MATCH (:Person {name: $name})-[:KNOWS]->(f) RETURN f.name AS friend", map[string]any{"name": "Alice"})
if err != nil {
	log.Fatal(err)
}
for _, row := range env.Result { // check env.Truncated before trusting a partial answer
	fmt.Println(row["friend"])
}

Every call takes a context.Context; there is no default timeout, so set deadlines on the context. The gRPC client is go/arcadedbgrpc. Docs: Go HTTP driver, Go gRPC driver, Go quickstart.

No official ArcadeDB .NET package yet. The documented route for Cypher is the Neo4j driver over Bolt. Install: dotnet add package Neo4j.Driver and enable the Bolt plugin on the server (port 7687).

using Neo4j.Driver;

await using var driver = GraphDatabase.Driver("bolt://localhost:7687",
    AuthTokens.Basic("root", "playwithdata"));
await using var session = driver.AsyncSession(o => o.WithDatabase("mydb"));

await session.RunAsync("CREATE (:Person {name: $a})-[:KNOWS]->(:Person {name: $b})",
    new { a = "Alice", b = "Bob" });
var cursor = await session.RunAsync(
    "MATCH (:Person {name: $name})-[:KNOWS]->(f) RETURN f.name AS friend", new { name = "Alice" });
await foreach (var record in cursor)
    Console.WriteLine(record["friend"].As<string>());

For SQL, Npgsql works over the PostgreSQL wire protocol; add Server Compatibility Mode=NoTypeLoading to the connection string. Plain HttpClient against the HTTP/JSON API needs no package at all. Docs: C# connection options, Bolt.

No driver needed: any language that can send an HTTP request can use ArcadeDB.

# Create two people and an edge
curl -X POST http://localhost:2480/api/v1/command/mydb -u root:playwithdata \
  -H "Content-Type: application/json" \
  -d '{"language":"cypher","command":"CREATE (:Person {name: $a})-[:KNOWS]->(:Person {name: $b})","params":{"a":"Alice","b":"Bob"}}'

# Who does Alice know?
curl -X POST http://localhost:2480/api/v1/query/mydb -u root:playwithdata \
  -H "Content-Type: application/json" \
  -d '{"language":"cypher","command":"MATCH (:Person {name: $name})-[:KNOWS]->(f) RETURN f.name AS friend","params":{"name":"Alice"}}'

The server publishes an OpenAPI spec and Swagger UI at /api/v1/docs, and the spec is attached to every GitHub release. Docs: HTTP API reference.

These languages have no official ArcadeDB package. They connect through a standard driver for one of the wire protocols ArcadeDB speaks, as documented in the ArcadeDB docs.

LanguageDocumented clientsDocs
Rustpostgres (PostgreSQL), neo4rs (Bolt), reqwest (HTTP)Rust
Rubypg, neo4j-ruby-driver, Net::HTTPRuby
Clibpq, libcurlC
C++libpqxx, cpp-httplibC++
RRPostgres, httr2R
ElixirHTTPoison, Req (HTTP)Elixir
JVM via JDBCPostgreSQL JDBC driverJDBC

Anything with a gRPC toolchain can also generate a client from arcadedb-server.proto, which is attached to every ArcadeDB release.

One question, four query languages

ArcadeDB runs SQL, OpenCypher, Gremlin and GraphQL on the same engine and the same records, so you can pick the language per query rather than per database. Teams moving from Neo4j keep their Cypher (see ArcadeDB vs Neo4j); teams building a knowledge graph often mix SQL for filtering with Cypher for traversals. Start with this tiny dataset:

-- SQL script (language "sqlscript"): Alice knows Bob and Carol
CREATE VERTEX TYPE Person; CREATE EDGE TYPE KNOWS;
CREATE VERTEX Person SET name = 'Alice';
CREATE VERTEX Person SET name = 'Bob';
CREATE VERTEX Person SET name = 'Carol';
CREATE EDGE KNOWS FROM (SELECT FROM Person WHERE name = 'Alice') TO (SELECT FROM Person WHERE name = 'Bob');
CREATE EDGE KNOWS FROM (SELECT FROM Person WHERE name = 'Alice') TO (SELECT FROM Person WHERE name = 'Carol');

Each tab asks the same question, "who does Alice know?", and returns Bob and Carol.

MATCH (:Person {name: 'Alice'})-[:KNOWS]->(f:Person)
RETURN f.name AS friend

Native OpenCypher engine. Also reachable over Bolt with any Neo4j driver. Cypher reference

-- traversal function
SELECT name FROM (SELECT expand(out('KNOWS')) FROM Person WHERE name = 'Alice')

-- or pattern matching
MATCH {type: Person, where: (name = 'Alice')}-KNOWS->{as: f}
RETURN f.name AS friend

ArcadeDB SQL adds graph traversal (out(), in(), both()) and MATCH to standard SELECT. SQL reference

g.V().has('Person', 'name', 'Alice').out('KNOWS').values('name')

Runs through the HTTP API with "language": "gremlin", or through Gremlin Server (port 8182) with any Apache TinkerPop driver. Gremlin reference

# 1. Declare the types once per database open (requires the updateSchema right)
type Query { personByName(name: String): Person }
type Person {
  name: String
  friends: [Person] @relationship(type: "KNOWS", direction: OUT)
}

# 2. Query
{ personByName(name: "Alice") { name friends { name } } }

GraphQL type definitions are not stored in the database: submit them after the database is opened, then query. GraphQL reference

The MongoDB query language is available too, through the MongoDB wire protocol. All four languages above work from every driver on this page by changing the language field.

Official drivers

The Python, TypeScript and Go clients live in ArcadeData/arcadedb-drivers. Each one is generated from the OpenAPI spec or the Protobuf contract that the ArcadeDB server publishes, and CI fails the build if the generated code drifts from the contract. All six are Apache-2.0 and released together; version 0.2.0 was generated against ArcadeDB server 26.10.1. They are pre-1.0, so pin a version. The Java clients ship with every ArcadeDB release and share its version number.

LanguagePackageTransportInstallStatusLinks
Pythonarcadedb-driverHTTP pip install arcadedb-driver0.2.0, pre-1.0 PyPI · Docs
Pythonarcadedb-driver-grpcgRPC pip install arcadedb-driver-grpc0.2.0, pre-1.0 PyPI · Docs
TypeScript / JS@arcadedb/driverHTTP npm install @arcadedb/driver0.2.0, pre-1.0 npm · Docs
TypeScript / JS@arcadedb/driver-grpcgRPC npm install @arcadedb/driver-grpc0.2.0, pre-1.0 npm · Docs
Go.../go/arcadedbHTTP go get github.com/ArcadeData/arcadedb-drivers/go/arcadedb@latest0.2.0, pre-1.0 pkg.go.dev · Docs
Go.../go/arcadedbgrpcgRPC go get github.com/ArcadeData/arcadedb-drivers/go/arcadedbgrpc@latest0.2.0, pre-1.0 pkg.go.dev · Docs
Javacom.arcadedb:arcadedb-engineEmbedded Maven / Gradle, version 26.10.1Released with ArcadeDB Maven Central · Docs
Javacom.arcadedb:arcadedb-networkHTTP Maven / Gradle, version 26.10.1Released with ArcadeDB Docs
Javacom.arcadedb:arcadedb-grpc-clientgRPC Maven / Gradle, version 26.10.1Released with ArcadeDB Docs

HTTP or gRPC?

Use HTTP by default: it works in browsers and serverless functions, needs the fewest dependencies, and fits existing proxies and gateways. Reach for gRPC when the workload is sustained server-to-server traffic, such as streaming large result sets or bulk inserts over one long-lived connection. The gRPC drivers have no browser build because the server's gRPC endpoint is plain HTTP/2 gRPC without gRPC-Web. The HTTP drivers return the whole result envelope, including a truncated flag, so always check it before treating a result as complete. The background is in the native drivers announcement.

Wire protocols

One ArcadeDB server can speak several protocols at once, all against the same databases. HTTP is always on; the others are server plugins you enable with arcadedb.server.plugins (the Docker section of the Deployment Center has a command that turns them all on). The client-server guide covers each protocol in depth.

ProtocolDefault portEnableClient to useDocs
HTTP / JSON2480Always on The official HTTP drivers, Java RemoteDatabase, or any HTTP client. Every query language, plus Studio and admin. HTTP API
gRPC50051gRPC:com.arcadedb.server.grpc.GrpcServerPlugin The official gRPC drivers, Java arcadedb-grpc-client, or a client generated from arcadedb-server.proto. gRPC API
PostgreSQL wire5432Postgres:com.arcadedb.postgres.PostgresProtocolPlugin psql, PostgreSQL JDBC, psycopg, pg, pgx, Npgsql, and BI tools. Prefix with {cypher}, {gremlin} or {graphql} to switch language. PostgreSQL
Neo4j Bolt7687Bolt:com.arcadedb.bolt.BoltProtocolPlugin Official Neo4j drivers for Java, Python, JavaScript, .NET and Go work unchanged: point them at bolt://host:7687. Bolt
MongoDB wire27017MongoDB:com.arcadedb.mongo.MongoDBProtocolPlugin Standard MongoDB drivers, such as pymongo. MongoDB
Redis wire6379Redis:com.arcadedb.redis.RedisProtocolPlugin Any Redis client, such as redis-py, for transient and persistent key-value access. Redis
Gremlin Server8182GremlinServer:com.arcadedb.server.gremlin.GremlinServerPlugin Apache TinkerPop drivers (Java, Python, JavaScript, .NET, Go). Gremlin
MCP2480, /api/v1/mcpBundled in the standard distribution LLM clients that speak the Model Context Protocol. MCP server

Keep building

Everything else you need, from reference docs to free courses with a certificate in the ArcadeDB Academy.

Run your first query in five minutes

Start a server with Docker, install the driver for your language, and paste a sample from above.

Frequently Asked Questions

Does ArcadeDB have official drivers?

Yes. The arcadedb-drivers repository publishes six Apache-2.0 clients: an HTTP and a gRPC client each for Python (arcadedb-driver, arcadedb-driver-grpc on PyPI), TypeScript/JavaScript (@arcadedb/driver, @arcadedb/driver-grpc on npm) and Go (github.com/ArcadeData/arcadedb-drivers/go/arcadedb and go/arcadedbgrpc). Java applications use the ArcadeDB Java API from Maven Central, either embedded (arcadedb-engine) or remote (arcadedb-network for HTTP, arcadedb-grpc-client for gRPC).

Should I use the HTTP or the gRPC driver?

Start with HTTP. It works everywhere, including browsers and serverless functions, and needs the fewest dependencies. Move a workload to gRPC when it is throughput-sensitive server-to-server traffic, such as large streamed result sets or bulk inserts. Browsers cannot use the gRPC driver, because the ArcadeDB gRPC server has no gRPC-Web endpoint.

Can I use Neo4j drivers with ArcadeDB?

Yes. Enable the Bolt plugin (Bolt:com.arcadedb.bolt.BoltProtocolPlugin) and the server listens on port 7687. The official Neo4j drivers for Java, Python, JavaScript, .NET and Go connect to bolt://host:7687 and run Cypher against ArcadeDB without code changes beyond the connection URL and credentials.

Is there an ArcadeDB driver for .NET and C#?

There is no official ArcadeDB .NET package yet. The documented routes are the Neo4j.Driver package over the Bolt protocol for Cypher, Npgsql over the PostgreSQL wire protocol for SQL (add Server Compatibility Mode=NoTypeLoading to the connection string), or HttpClient against the HTTP/JSON API.

Which query languages can my application send to ArcadeDB?

SQL, OpenCypher, Gremlin, GraphQL and the MongoDB query language all run on the same engine and the same data. Over HTTP and in the native drivers you pick the language per call with the language field; over the PostgreSQL protocol you prefix the statement with {cypher}, {gremlin} or {graphql}.