Saltearse al contenido

Changelog

Esta página es espejo de CHANGELOG.md en el repo del motor. El formato sigue Keep a Changelog; el versionado sigue de manera laxa Semantic Versioning.

v0.3.0 — 2026-05-18 · barrida de limitaciones de Cypher v0.2.1

Cierra las seis limitaciones del query engine documentadas en el README de v0.2.1 (MATCH (n) rechazado, MERGE con relación roto, id reservado, etc.). Una de ellas — la reserva de id — es breaking.

Arreglado

  • lower::combine ahora emite CrossProduct entre dos planes no-Empty en lugar de dropear el anterior, así MATCH (a:A) MATCH (b:B) CREATE (a)-[:R]->(b) propaga ambos bindings a CREATE.
  • find_merge_matches indexa Vec<CreateElement> por alias así MERGE (a)-[r:R]->(b) funciona contra el patrón con forma de CREATE.
  • execute_expand acepta edge_type=None; MATCH (a)-[r]->(b) y -[*1..N]-> funcionan sin un tipo de relación explícito.
  • LogicalPlan::NodeScan.label ahora es Option<String>; MATCH (n) sin label hace fan-out sobre cada label observado.

Breaking

  • id es ahora una propiedad de usuario; el NodeId interno pasa a _id. Antes, id secuestraba los literales de map de Cypher como el sigilo del NodeId interno. Después de esta release, id es una propiedad común de usuario; el NodeId interno es _id. La función id(n) de Cypher sigue devolviendo el NodeId interno.

    Migración. Renombrar {id: $uuid}{_id: $uuid} donde la intención sea el NodeId interno. Usá n._id (accessor) o id(n) (función) para leerlo. n.id ahora lee la propiedad de usuario (o Null).

v0.2.1 — 2026-05-18 · fix de CI

El tag py-v0.2.0 construyó cada wheel pero el paso de publish se salteó. v0.2.1 shippea el mismo código con las expectativas de los tests puestas al día. Sin cambios al motor.

v0.2.0 — 2026-05-18 · historia de self-host

Agregado

  • Backend de almacenamiento file:// con manifest CAS completo vía flock por namespace + rename(2) atómico.
  • Backend de almacenamiento gs:// para Google Cloud Storage.
  • Backend de almacenamiento az:// para Azure Blob Storage.
  • Crate y binario namidb-server — daemon HTTP en Rust que expone una API REST. Endpoints: POST /v0/cypher, GET /v0/health, GET /v0/version, POST /v0/admin/flush. Auth con bearer token, flush periódico, Dockerfile, mapeo completo de tipos JSON ↔ Cypher.
  • docker-compose.yml en la raíz del repo — MinIO + bucket-init + namidb-server.
  • Parser de URIs compartido usado por el cliente de Python, el CLI y el servidor.
  • Diagramas de arquitectura y despliegue con variantes para dark-mode.

Cambiado

  • El CLI namidb run aprende --store <uri> para runs durables contra cualquier backend. Por defecto memory://default cuando se omite.
  • tg.Client(uri) de Python delega el parseo de URI a la implementación compartida de Rust.

Arreglado

  • La expectativa de indent del plan-explain alineada con el tree-renderer.

v0.1.0 — release pública inicial

Primera release pública bajo Business Source License 1.1 (Change Date: 2029-05-18, Change License: Apache License 2.0).

Motor

  • Parser de Cypher / GQL cubriendo un subset estricto de GQL (ISO/IEC 39075:2024) + openCypher 9. Ejecución de punta a punta de las queries LDBC SNB Interactive Complex Read IC01–IC12.
  • Escrituras vía Cypher: CREATE, MERGE, SET, DELETE, DETACH DELETE, REMOVE. Durables en commit_batch.
  • Optimizador basado en costos con predicate pushdown, projection pushdown, join reorder, conversión a hash-join, hash semi-join y pruning de row-groups de Parquet.
  • Ejecutor vectorizado morsel-driven con representación intermedia factorizada opcional (RFC-017).

Storage

  • Almacenamiento columnar sobre object storage: SSTs de nodes en Parquet, formato custom de edge-SST con CSR adjacency (RFC-002), compresión zstd, bloom filters, índices de fence-pointer.
  • Corrección sin coordinación vía manifest CAS.
  • Caches en capas (AdjacencyCache, NodeViewCache, SstCache).

Clientes

  • Bindings de Python (pip install namidb), wheels abi3.
  • CLI: namidb parse, namidb explain --verbose, namidb run.

Proyecto

  • Workspace de 8 crates.
  • 18 RFCs de diseño en docs/rfc/.
  • Harness de benchmark sintético con forma de LDBC con un runner pareado de Kùzu.