Tu grafo en S3
El caso de uso principal. Tu base de datos en grafo vive en tu bucket de S3.
-
Instalar el cliente
Ventana de terminal pip install namidbCargo.toml [dependencies]namidb = "0.3"tokio = { version = "1", features = ["full"] } -
Exportar las credenciales de AWS (o apoyarse en un rol IAM de EC2 / EKS / Lambda)
Ventana de terminal export AWS_ACCESS_KEY_ID=AKIA...export AWS_SECRET_ACCESS_KEY=...export AWS_DEFAULT_REGION=us-east-1Los únicos permisos IAM que NamiDB necesita sobre el bucket son
s3:GetObject,s3:PutObject,s3:DeleteObject,s3:ListBucket. Eso es todo. Sin tabla de locks de DynamoDB, sin servicio separado de metadata. -
Abrir (o bootstrapear) un namespace
import namidb as tgclient = tg.Client("s3://my-bucket/data?ns=prod®ion=us-east-1")use namidb::storage::{parse_uri, WriterSession};let (store, paths) = parse_uri("s3://my-bucket/data?ns=prod®ion=us-east-1")?;let mut writer = WriterSession::open(store, paths).await?; -
Escribir Cypher
client.cypher("CREATE (a:Person {name: 'Alice', age: 30})")client.cypher("CREATE (b:Person {name: 'Bob', age: 25})")client.cypher("MATCH (a:Person {name: 'Alice'}), (b:Person {name: 'Bob'}) ""CREATE (a)-[:KNOWS {since: 2020}]->(b)")result = client.cypher("MATCH (p:Person) WHERE p.age >= $min RETURN p.name AS name, p.age AS age",params={"min": 18},)print(result.to_pandas()) -
Reinicia el proceso. Abre un notebook en otra máquina con el mismo URI.
El grafo sigue ahí. El bucket es la base de datos.
Por qué funciona
- Los conditional writes (
If-Match/If-None-Match) sobre S3 reemplazan el consenso externo. El objeto manifest se muta por compare-and-swap, así que dos writers pueden competir y solo uno gana — el que pierde reintenta contra la nueva versión. - Single-writer-per-namespace con epoch fencing. Los lectores escalan libremente; solo un mutador a la vez por namespace.
- La durabilidad es la que te da S3: 99.999999999% (11 nueves) de durabilidad de objeto, replicación multi-AZ.
- El costo escala a cero cuando ningún cliente abre el namespace — no hay compute corriendo, no hay tabla de DynamoDB aprovisionada.
Usar Cloudflare R2 para egress cero
R2 no cobra egress y tiene soporte completo de conditional writes
compatible con S3. Mismo esquema, con el endpoint de R2 y region=auto:
import namidb as tg
client = tg.Client( "s3://my-bucket?ns=prod" "&endpoint=https://<ACCOUNT_ID>.r2.cloudflarestorage.com" "®ion=auto")Si estás corriendo NamiDB fuera de AWS — en Cloudflare Workers, Fly.io, tu VPS, tu laptop — R2 casi siempre es la decisión correcta.
¿Y los backups?
aws s3 sync s3://my-bucket/data/ ./backup-2026-05-19/Eso es todo. NamiDB nunca escribe a ningún otro lado.
Multi-tenancy
Cada namespace es una carpeta bajo el prefijo de tu bucket:
s3://my-bucket/data/├── tenant-acme/│ ├── manifest.json│ ├── wal/│ └── sst/├── tenant-globex/│ ├── manifest.json│ ├── wal/│ └── sst/└── tenant-initech/ ├── ...Cada ?ns=… abre un namespace aislado. Operativamente:
los tenants son carpetas.
Siguiente
- Referencia de Cypher — qué puedes consultar hoy.
- Operación / Gramática de URIs — cada backend y cada flag.
- Self-host con Docker Compose — API REST con boundary de red por delante del bucket.