SynapCores v2.1.1 — The graph engine grows up

Published on October 11, 2026

SynapCores v2.1.1-ce — Release Notes

v2.1.1 makes the graph engine production-fast — Cypher writes are up to ~2,300× quicker, point lookups drop from ~48 ms to sub-millisecond, and a new bulk-ingest endpoint loads six-figure graphs in seconds — and restores API compatibility for the bundled UI and the official SDKs.

If you are on v2.1.0, upgrade now. v2.1.0 rejects queries sent by the bundled web UI and by the Python (0.5.0) and Node (0.6.1) SDKs (timeout_secs: unknown field). v2.1.1 fixes this. Hand-written HTTP clients were not affected.


New Features

Cypher secondary indexes — graph lookups go sub-millisecond

Nodes are now indexed by label and by property value, and the planner seeds MATCH from the index instead of scanning the graph. Patterns anchored on their last element are planned in reverse, so "who points at X" questions stop walking the whole graph. On a 20k-node / 60k-edge benchmark:

Operation v2.1.0 v2.1.1
MERGE existing nodes 21.8 nodes/s 32,040 nodes/s
MERGE new nodes 10.6 nodes/s 16,209 nodes/s
MERGE edges 3.3 edges/s 7,732 edges/s
MATCH point read by property 48.2 ms 0.4 ms
End-anchored in-edge query 310 ms 0.48 ms
count(*) over a label 60.4 ms 7.9 ms

Existing graphs are indexed automatically on first use after upgrade — no migration step, and every index hit is verified against the stored node before it is returned.

Business benefit: code intelligence, fraud rings, dependency graphs — interactive graph workloads that were previously batch-only now answer in milliseconds on the same single binary as your SQL and vectors.

Where that puts us against dedicated graph engines

Same dataset, same machine, one engine at a time, against Kuzu 0.11.3 and Neo4j 5 Community:

Query shape SynapCores v2.1.1 Kuzu Neo4j CE
point lookup by property 0.52 ms 0.22 ms 3.01 ms
1-hop out-neighbors 0.55 ms 0.91 ms 3.17 ms
variable-length 1..3 1.21 ms 3.06 ms 6.98 ms
in-edges, end-anchored 0.51 ms 1.04 ms 13.68 ms
count(*) over a label 7.87 ms 0.24 ms 2.43 ms

SynapCores is the fastest of the three on traversals (1-hop, variable-length, end-anchored), ~2.4× behind Kuzu on point reads, and still 3.2× behind Neo4j on label counts. Kuzu's offline CSV COPY remains the bulk-load throughput leader; it is a stop-the-world import path, not an online API.

Bulk graph ingest — POST /v1/graph/bulk

One request loads up to 500,000 nodes and edges: endpoints resolve by request-local keys, UUIDs, or the new property index; nodes match idempotently (merge_nodes_on); duplicate edges are skipped and counted; exact created/matched/skipped counters come back in the response. Measured: ~84,000 edges/s, ~112,000 entities/s combined — re-running the same payload changes nothing and reports it honestly.

Business benefit: loading a 150k-edge code graph drops from hours of per-edge calls to about two seconds, with one API call and exact accounting. Note: this path does not emit per-entity graph change events.

Cypher language completeness

  • CREATE (...) is now a first-class clause (always-create semantics; creating a duplicate (src,type,dst) edge returns an error rather than silently matching).
  • Self-loop patterns ((a)-[:R]->(a)) match correctly under relationship isomorphism, including in variable-length traversals.
  • Standalone UNWIND [...] AS x RETURN x executes.

Query timeouts are now enforced server-side

timeout_secs on /v1/query/execute and /v1/query/batch is honored: a query that exceeds it returns HTTP 408 (query_timeout) instead of running on. The bundled UI's 300 s default and both SDKs' timeout parameters now do what they say.


Bug Fixes

  • /v1/query/execute and /v1/query/batch accept timeout_secs / timeoutSecs; v2.1.0 rejected these requests, breaking the bundled UI and the Python and Node SDKs. Unknown fields are still rejected.
  • pull nli-default follows HuggingFace's CDN redirects again (download remains SHA-256-pinned).
  • Node create/update accepts the singular label alias used by some clients.
  • macOS packaging validation no longer fails behind /tmp symlinks.
  • Release QA now replays the exact wire shapes sent by the bundled UI and both SDKs against every candidate binary, so a client-contract break of this class cannot pass the gates again.

Upgrade notes

  • Drop-in binary/container swap from v2.1.0 or v2.0.0; node indexes backfill lazily on first graph access.
  • macOS/Linux tarball installs: upgrade the whole extracted folder, not the binary alone. The engine loads the bundled ONNX Runtime from lib/ beside the executable; a binary-only copy leaves NLI model loads failing with "ONNX Runtime library ... is missing". Alternatively set ORT_DYLIB_PATH to the extracted lib/libonnxruntime.dylib (.so on Linux).
  • Behavior change: Cypher CREATE of an edge that already exists (same source, type, and destination) now errors; use MERGE for find-or-create semantics.