PyrraNet/nescioDB

GitHub: PyrraNet/nescioDB

nescioDB 是一个以「无知」为核心概念的 Rust 概率数据库,专为存储、融合和查询不确定、矛盾且随时间衰退的证据而设计。

Stars: 1 | Forks: 0

nescioDB logo

nescioDB — 知道自己不知道什么的数据库

crates.io docs.rs CI MIT license Rust 1.75+

文档 · 五分钟教程 · HTTP API · 文件格式 · Rust API

**nescio** *(拉丁语:“我不知道”)* 是一个**概率数据库**,专为不确定、矛盾和衰退的数据而设计 —— 它是一个嵌入式 Rust 库和 HTTP/JSON 服务器,将“无知”作为一等公民对象进行存储。一个没有证据的字段并不是 `NULL` —— 它是一个最大熵的区域。证据会缩小这些区域,时间会再次扩大它们,而数据库能够告诉你接下来该获取什么证据。 你存储的不是具体的值,而是**声明 (claims)**:谁在什么时候说了什么,以及它们的可靠性如何。其他的一切 —— 可信区域、以比特为单位的熵、答案 —— 都是在查询时推导出来的。每个来源都有半衰期;旧的声明对数据失去影响力是基于物理学规律的,而不是依靠 TTL。 ## 动词 | 动词 | 回答 | |---|---| | `bound` | 已知的信息 —— 以比特为单位的可信区域和熵 | | `sample` | 一个具体的、一致的世界,在特定 seed 下是确定性的 | | `resolve` | 哪些成本最低的证据可以将熵降至目标值以下 | | `find` | 哪些实体*肯定* / *可能*位于某个范围内 | | `join` | 匹配某种关系的实体对 —— 每个实体对都带有一个概率*和*一个三值确定性,因为连接两个区域本身就是不确定的 | | `certainly` | 三值谓词:`true` / `possible` / `false` | ## 用例 专为本质上不确定、矛盾和衰退的数据而构建: - **线索与公司数据** —— 从可靠性参差不齐的来源进行数据丰富;数据新鲜度是物理学规律,而不是一个 `updated_at` 列 - **OSINT 与调查** —— 带有来源信息的相互矛盾的声明,`resolve` 会告诉你接下来该验证什么 - **传感器融合** —— 将带噪声的测量值作为区间,结合各来源的特定可靠性进行融合 - **房地产情报** —— 用价格区域代替点猜测;将可比性搜索作为一种不确定的 join 操作 - **实体解析与去重** —— `join --op same` 以概率*和*确定性对候选重复项进行评分 ## 快速开始 ``` cargo install nescio nescio init mydb --template real-estate nescio ingest mydb --entity villa_1 --slot price --interval 900000..1000000 \ --source broker --at 2026-06-25 nescio bound mydb --entity villa_1 --slot price --at 2026-07-03 ``` ``` BOUND villa_1.price as of 2026-07-03 region (95%): [570000, 1210000] entropy: 4.20 of 7.64 bits (knowledge 45%) MAP estimate: 905000 ``` 一年后再问一次 —— 使用相同的命令,加上 `--at 2027-07-03` —— 你会发现区域自行扩大了。使用 `nescio forget-source` 删除一个来源,每个推导出的区域都会正确地扩大:这里不存在可能会“忘记去遗忘”的聚合操作。 join 操作比较的是不确定的区域,因此每个匹配项都带有一个概率和一个确定性: ``` nescio join mydb --op approx --left price --right price --tol 50000 # comparable properties nescio join mydb --op gt --left price --right price --certain # A certainly dearer than B nescio join mydb --op same --left city --right city # entity resolution: candidate duplicates ``` ## 作为服务器 (HTTP/JSON API) ``` nescio serve mydb --port 7777 ``` ``` curl 'localhost:7777/bound?entity=villa_1&slot=price&at=2026-07-03' ``` 支持通过 HTTP/JSON 使用所有动词,可从任何语言进行调用。一个进程独占管理该数据库;读取操作并行运行,写入操作则是独占的。 针对 [Python](clients/python/)、[TypeScript](clients/typescript/) 和 [Java](clients/java/) 的强类型客户端封装了这些动词 —— 全都是零依赖且支持单文件 vendoring。 ## 作为 Rust 库 ``` use nescio::prelude::*; use nescio::time::now_unix; use std::path::Path; let db = Db::open(Path::new("mydb"))?; let q = Query::new(&db, now_unix()); let bound = q.bound("villa_1", "price", 0.95)?; println!("{:.2} bits", bound.entropy_bits); ``` ## 横向对比 - **vs. SQL 中的 `NULL`** —— `NULL` 仅表示“没有值”。而 nescio 能指出*有多少*是未知的(以比特为单位的熵),什么是仍然可信的(区域),以及哪些证据可以缩小未知范围。经典的关系型数据库只是一种特殊情况:每个声明都是一条公理,每个区域都只是一个点。 - **vs. 概率数据库** (MayBMS, Trio, BayesDB) —— 这些系统将概率附加在原本“干净”的表中的元组上。nescio 建模的是*证据本身* —— 来源的可靠性、衰退、矛盾 —— 并在查询时推导分布,因此遗忘某个来源是精确的,而非近似处理。 - **vs. TTL 和缓存过期** —— TTL 是一种断崖式的删除。而半衰期衰退会持续扩大不确定性:旧数据会优雅地降级而不是突然消失,并且数据库能够报告对于特定决策而言,数据旧到*什么程度才算*太旧。 ## 性能 在 M 系列 MacBook 上测量,包含 200,000 个实体 / 400,000 条证据记录 (`cargo run --release --example bench`): ``` ingest (group commit, one fsync) ~1.1M records/s open / log replay ~1.2M records/s bound 4.5 µs (8.6 µs with couplings) resolve < 1 ms ``` 服务器并行运行读取操作;每一次写入在得到确认之前都是持久化 (durable) 的。 ## 存储 一个数据库就是一个目录。配置是人类可读的 JSON;而证据日志 是一种紧凑的、仅追加的二进制格式(比 JSONL 小约 2.6 倍,在重放时 无解析成本)。`nescio export` 可以随时将其重构为人类可读的 JSONL,而 `nescio import` 则执行反向操作。 ``` mydb/ schema.json slots and couplings sources.json reliability, half-life, axiomatic priors.json shared priors log.bin the evidence log (append-only binary) ``` ## 许可证 [MIT](LICENSE)
标签:HTTP API, JS文件枚举, Rust, 信息熵, 可视化界面, 数据库, 概率数据库, 网络流量审计, 逆向工具, 通知系统