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 xexecutes.
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/executeand/v1/query/batchaccepttimeout_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-defaultfollows HuggingFace's CDN redirects again (download remains SHA-256-pinned).- Node create/update accepts the singular
labelalias used by some clients. - macOS packaging validation no longer fails behind
/tmpsymlinks. - 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 setORT_DYLIB_PATHto the extractedlib/libonnxruntime.dylib(.soon Linux). - Behavior change: Cypher
CREATEof an edge that already exists (same source, type, and destination) now errors; useMERGEfor find-or-create semantics.