TundraDB

In-Memory Graph Database with Relational Joins

TundraDB combines graph traversals with SQL-style join semantics, bitemporal versioning, edge-aware MATCH/UPDATE, and Apache Arrow columnar output — built in C++23.

Get Started TundraQL Reference Live Demo

Why TundraDB?

🔗

Graph + Relational

Traverse edges like a graph DB, but with INNER, LEFT, RIGHT, and FULL OUTER join semantics for precise control over results.

🕐

Bitemporal Versioning

Every node tracks VALIDTIME (real-world truth) and TXNTIME (database knowledge). Time-travel queries with zero overhead when disabled.

🏹

Arrow-Native Output

Query results are Apache Arrow tables — zero-copy interop with Pandas, Spark, DuckDB, and any Arrow-compatible tool.

In-Memory Performance

Arena-allocated nodes, LLVM DenseMap for hot paths, Intel TBB for parallel traversal. No disk I/O during queries.

📐

Schema-First Design

Typed schemas enable fixed-layout memory, compile-time field access, and schema validation on writes.

🧭

Edge-Aware Queries

Bind edge aliases in MATCH, filter with WHERE e.field, select e.field or e, and update edge fields via UPDATE MATCH ... SET e.field = ....

💾

Parquet Persistence

Snapshot-based COMMIT writes shards and edges to Parquet files with JSON metadata. Fast cold-start recovery.

Quick Start

A complete session in TundraQL — schema, edge schema, edge update, edge filter, and edge selection.

Define schemas (nodes + edges) Step 1
CREATE SCHEMA User (name: STRING, age: INT64);
CREATE SCHEMA Company (name: STRING, size: INT64);
CREATE EDGE SCHEMA WORKS_AT (since: INT64, role: STRING);
Create nodes Step 2
CREATE NODE User (name = "Alice", age = 30) RETURN id;  // → id: 0
CREATE NODE User (name = "Bob",   age = 25) RETURN id;  // → id: 1
CREATE NODE Company (name = "Google", size = 3000);            // → id: 0
Create edges Step 3
CREATE EDGE WORKS_AT FROM User(1) TO Company(0);
UPDATE MATCH (u:User)-[e:WORKS_AT]->(c:Company)
    SET e.since = 2025, e.role = "engineer";
Query using edge fields Step 4
MATCH (u:User)-[e:WORKS_AT]->(c:Company)
    WHERE e.since = 2025
    SELECT u.name, c.name, e.since, e.role;

// Select full edge alias (all edge columns)
MATCH (u:User)-[e:WORKS_AT]->(c:Company)
    SELECT e;
Persist to disk Step 5
COMMIT;

Documentation

🏗️

System Architecture

Database layers, sharding, memory arenas, temporal versioning, and persistence internals.

Explore →
📖

TundraQL Reference

Complete language reference — CREATE, MATCH, DELETE, WHERE, SELECT, JOIN types, data types.

Read docs →
🎮

Live Query Demo

Interactive step-through of query execution with graph visualization. See how MATCH works in real-time.

Try it →
🔬

Algorithm Deep Dive

Mathematical foundations — BFS row generation, join semantics, tree merging, complexity analysis.

Deep dive →

Built With

🏹

Apache Arrow

Columnar output format

📦

Apache Parquet

On-disk persistence

Intel TBB

Parallel traversal

🔧

LLVM

DenseMap, SmallVector

📝

ANTLR4

Query parser

🧊

C++23

Core language