Driver FixRecommendedSound, Wi-Fi or graphics acting up? Check drivers firstFind missing or outdated drivers fast.Check DriversOctober DealsAmazon USOctober deal check: compare before you payAmazon US: current deals, useful picks and tech finds.Check DealsPC HealthRecommendedCrashes, freezes, slowdowns? Check your PC nowSpot repairable issues before they interrupt work.Check PC×
Skip to content
World desk7 min

Embedded Graphs in Node.js: Comparing Kùzu and SQLite Recursive CTEs

Kùzu offers a graph-native model with Cypher, but its repository is archived and its npm package is deprecated. SQLite recursive CTEs run on the built-in node:sqlite module. Here is how the two compare for a Node.js project.
Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

For most Node.js projects starting now, SQLite recursive CTEs are the lower-risk way to traverse connected data, because they run on a relational engine you can keep maintaining. Kùzu offers a more graph-native model and the Cypher query language, but its GitHub repository describes the project as archived and its npm package is marked deprecated and no longer supported. That status should decide the question before feature fit does. Neither option has a sourced speed advantage for your workload, so measure with your own data before you choose on performance.

What you are actually choosing between

The two options differ in data model and query language, not just in how they are packaged. Kùzu is an embedded property graph database. You declare node tables and relationship tables with typed properties, and you query patterns with Cypher. SQLite is a relational database. Graph-shaped data lives in ordinary tables, usually an edge table with a source and a destination column, and you traverse it with SQL. SQLite’s documentation describes recursive common table expressions as a way to run “hierarchical or recursive queries of trees and graphs, a capability that is not otherwise available in the SQL language” (SQLite WITH clause documentation).

As an Amazon Associate I earn from qualifying purchases.

So this is a comparison of two modeling styles. It is not a like-for-like API comparison, and it does not tell you which engine executes a given traversal faster.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Project status comes first for Kùzu

Before you design around Kùzu, check two things. The Kùzu GitHub repository states that the project is archived, and it is distributed under the MIT license. The npm package listing for kuzu marks the package as deprecated and “no longer supported.”

In practical terms, versions already published to npm may keep installing and running, but you should not expect new fixes or runtime compatibility work from the upstream project. Treat Kùzu as a dependency you would have to maintain yourself. If you are evaluating it for a long-lived service, that is the main decision factor, and it outweighs the modeling advantages described below. The Kùzu installation documentation still shows npm install kuzu, so the install path exists even though its support status has changed.

The same traversal in each model

Take a small social graph: people connected by a KNOWS relationship, and the question “who can Ann reach within three hops, following KNOWS in the outgoing direction?” The examples below are illustrative. They assume the schema shown and an outgoing-only traversal, and they do not represent a tested benchmark.

Kùzu with Cypher

In Kùzu, the schema is declared as node and relationship tables. A minimal schema for this example looks like this, though you should confirm the exact DDL against the Kùzu documentation for the version you install:

Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
CREATE NODE TABLE Person(name STRING, PRIMARY KEY(name));
CREATE REL TABLE KNOWS(FROM Person TO Person);

The traversal then reads like the pattern it describes. A variable-length relationship with a bounded range covers one to three hops:

MATCH (a:Person {name: 'Ann'})-[:KNOWS*1..3]->(b:Person)
RETURN DISTINCT b.name;

The bounded range is what keeps this query finite on graphs with cycles. The pattern expresses intent directly, which is the main reason graph-centric teams find Cypher easier to read than recursive SQL.

SQLite with a recursive CTE

In SQLite, the same data is two tables. The edge table is the graph:

CREATE TABLE person(name TEXT PRIMARY KEY);
CREATE TABLE knows(
  src TEXT NOT NULL,
  dst TEXT NOT NULL,
  PRIMARY KEY (src, dst)
);

The traversal is a recursive CTE. It starts from a seed row, joins the edge table at each step, and stops at a depth limit:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
WITH RECURSIVE reach(name, depth) AS (
  SELECT ?, 0
  UNION
  SELECT k.dst, r.depth + 1
  FROM reach r
  JOIN knows k ON k.src = r.name
  WHERE r.depth < 3
)
SELECT DISTINCT name
FROM reach
WHERE depth >= 1;

Three details in this query are deliberate, and each one is your responsibility in SQL:

  • Cycle handling. UNION rather than UNION ALL discards repeated (name, depth) rows, so a cycle does not generate unbounded duplicate output. The depth cap is what guarantees termination.
  • Depth limit. The WHERE r.depth < 3 condition is the traversal boundary. Remove it and a cyclic graph can keep expanding.
  • Seed inclusion. Ann can reappear at depth 2 or 3 if the graph loops back to her. The outer depth >= 1 filter keeps her in the result only when she is reached through at least one edge.

For undirected traversal, you would add a second join condition or a union of both edge directions. For a path, rather than a set of reachable nodes, you would carry the path as a column, which makes the query more verbose.

Calling the SQLite version from Node.js

Node.js ships a built-in node:sqlite module, so the SQLite approach needs no third-party database driver. The Node.js v24.21.0 SQLite documentation lists its history as added in v22.5.0 and classifies its stability as 1.2, Release candidate, in that release’s docs.

Two constraints follow from that. First, the stability label belongs to a specific release line, so state the Node version in your project and check the docs for that exact version before you rely on the module in production. Second, a built-in module that is still a release candidate can change between releases. Pin your Node version and test on upgrade.

What’s actually slowing this PC down?

Pick the symptom - the matching free tool is one click away.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
import { DatabaseSync } from 'node:sqlite';

const db = new DatabaseSync('graph.db');
const reachable = db.prepare(`
  WITH RECURSIVE reach(name, depth) AS (
    SELECT ?, 0
    UNION
    SELECT k.dst, r.depth + 1
    FROM reach r
    JOIN knows k ON k.src = r.name
    WHERE r.depth < 3
  )
  SELECT DISTINCT name FROM reach WHERE depth >= 1
`);

console.log(reachable.all('Ann'));

This uses a parameter placeholder for the starting node, so the seed value is bound rather than concatenated into the SQL string.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Performance: what is and is not established

No benchmark in the sources cited for this article compares Kùzu and SQLite recursive CTEs under Node.js for the same dataset, query semantics, and environment. Any claim that one is faster is therefore not supported by the evidence here. Graph size, traversal depth, branching factor, whether the query is a full reachability scan or a bounded lookup, and whether the database is read-heavy or write-heavy can each reverse the result.

If you need a speed answer, run your own measurement. Keep the following fixed across both engines:

  1. Use the same hardware, operating system, and Node.js version, and record them.
  2. Generate or load the same graph into both systems, and record how long loading takes separately from query time.
  3. Use identical query semantics: the same direction, the same maximum depth, the same cycle behavior, and the same result shape.
  4. Run warm-up queries first, then repeat the measured runs many times and report the spread, not a single number.
  5. Record the cache state, whether the database was freshly opened, and the exact database versions.

Choosing between them

The table summarizes the trade-offs. Cells marked “not stated” mean the cited sources do not establish that value.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Decision axis Kùzu SQLite recursive CTEs
Data model Property graph with typed node and relationship tables (Kùzu repository) Relational tables; graph edges stored as rows (SQLite documentation)
Query language Cypher pattern matching, including bounded variable-length relationships SQL with a recursive CTE; you write the join, termination, and cycle handling
Node.js integration Installed from npm with npm install kuzu (Kùzu installation documentation) Built in as node:sqlite; history lists v22.5.0 as added, stability 1.2 Release candidate in v24.21.0 docs (Node.js SQLite documentation)
Maintenance status Repository archived; npm package deprecated and “no longer supported” (npm listing) Depends on the Node.js release line you target; check its documentation
Performance on your workload Not stated by the cited sources for this comparison Not stated by the cited sources for this comparison

When SQLite recursive CTEs fit

  • Your data already lives in SQLite or another relational schema, and traversals are occasional rather than the core of every request.
  • You need a dependency that is built into the runtime and not tied to a third-party project’s support status.
  • Your team is comfortable writing recursive SQL and reasoning about termination, cycles, and depth limits.

When Kùzu’s model may fit, with caveats

  • You are building a graph-centric workload where most queries are patterns over typed nodes and relationships, and Cypher would make them clearer.
  • You accept that you will own the maintenance of the dependency, including any compatibility issues with future Node.js releases.
  • Your evaluation shows, on your own data, a benefit large enough to justify that ownership.

If you are starting a new project and have no existing graph tooling, the archived status and deprecated package make Kùzu hard to recommend for production. Use it for prototyping or for a bounded experiment if you want to compare modeling styles directly.

The Bottom Line

Choose SQLite recursive CTEs for a Node.js project unless you are willing to maintain an archived, deprecated dependency. Kùzu’s graph-native modeling is a real advantage for graph-heavy domains, but it does not outweigh the upstream status for new production adoption. Whichever you choose, pin your Node.js version, because the node:sqlite stability label is release-specific, and measure your own workload before deciding on speed.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

Leave a Reply

Your email address will not be published. Required fields are marked *

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

More from the Wire

  1. World desk4 min
    How to Spot an AI Voice Scam Before Sending MoneyDon’t rely on how a caller sounds. Pause, call back through a known number, and verify the emergency with another trusted person before sending money.
  2. Mountain View desk4 min
    Google’s SynthID Detector: How to Check AI-Generated Images, Video and AudioGoogle’s SynthID Detector looks for an embedded watermark in supported images, video and audio. Here is what its results do—and do not—show.
  3. Redmond desk20 min
    How to create a link to File or Folder in Windows 11Windows 11 gives you several ways to point to a file or folder without moving or duplicating it. You can create a desktop shortcut,…
Recommended PC Tool
Recommended PC Tool
Crashes, No Sound, or Screen Glitches?Free driver scan
Windows Errors? Fix Them Before They SpreadFree repair scan

Two free Windows tools

One Free Minute Could Fix That PC

Before you go - each of these free tools takes about a minute and tackles what quietly slows a Windows PC down.

Special offer. View Outbyte info, uninstall instructions, EULA, and Privacy Policy.