{"id":13472369,"url":"https://github.com/cozodb/cozo","last_synced_at":"2025-05-12T07:50:12.821Z","repository":{"id":62096207,"uuid":"551374215","full_name":"cozodb/cozo","owner":"cozodb","description":"A transactional, relational-graph-vector database that uses Datalog for query. The hippocampus for AI!","archived":false,"fork":false,"pushed_at":"2024-12-04T12:49:06.000Z","size":9853,"stargazers_count":3620,"open_issues_count":40,"forks_count":114,"subscribers_count":43,"default_branch":"main","last_synced_at":"2025-05-12T05:42:44.375Z","etag":null,"topics":["client-server","cozo","cozoscript","cross-platform","database","datalog","embedded-database","graph","graph-algorithms","graph-database","graphdb","relational-database","single-executable"],"latest_commit_sha":null,"homepage":"https://cozodb.org","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cozodb.png","metadata":{"files":{"readme":"README-zh.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-10-14T09:28:11.000Z","updated_at":"2025-05-11T13:47:38.000Z","dependencies_parsed_at":"2023-02-18T21:15:24.437Z","dependency_job_id":"79d6a45a-9112-4f7b-99c9-32c7e3c6f310","html_url":"https://github.com/cozodb/cozo","commit_stats":{"total_commits":1521,"total_committers":5,"mean_commits":304.2,"dds":0.0269559500328731,"last_synced_commit":"5edfba32cf7e1fdd5d7a7275deeaca9b9c4638ff"},"previous_names":[],"tags_count":21,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cozodb%2Fcozo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cozodb%2Fcozo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cozodb%2Fcozo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cozodb%2Fcozo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cozodb","download_url":"https://codeload.github.com/cozodb/cozo/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253692208,"owners_count":21948312,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["client-server","cozo","cozoscript","cross-platform","database","datalog","embedded-database","graph","graph-algorithms","graph-database","graphdb","relational-database","single-executable"],"created_at":"2024-07-31T16:00:54.136Z","updated_at":"2025-05-12T07:50:12.798Z","avatar_url":"https://github.com/cozodb.png","language":"Rust","funding_links":[],"categories":["Rust","Applications","Research \u0026 Data Analysis","Databases","graph","\u003ca name=\"Rust\"\u003e\u003c/a\u003eRust"],"sub_categories":["Database"],"readme":"\u003cimg src=\"static/logo_c.png\" width=\"200\" height=\"175\" alt=\"Logo\"\u003e\n\n[![docs](https://img.shields.io/readthedocs/cozo/latest)](https://docs.cozodb.org/zh_CN/latest/)\n[![cozo-node](https://img.shields.io/npm/v/cozo-node)](https://www.npmjs.com/package/cozo-node)\n[![npm (web)](https://img.shields.io/npm/v/cozo-lib-wasm?label=browser)](https://www.npmjs.com/package/cozo-lib-wasm)\n[![Crates.io](https://img.shields.io/crates/v/cozo)](https://crates.io/crates/cozo)\n[![docs.rs](https://img.shields.io/docsrs/cozo?label=docs.rs)](https://docs.rs/cozo)\n[![pypi](https://img.shields.io/pypi/v/pycozo)](https://pypi.org/project/pycozo/)\n[![java](https://img.shields.io/maven-central/v/io.github.cozodb/cozo_java?label=java)](https://mvnrepository.com/artifact/io.github.cozodb/cozo_java)\n[![clj](https://img.shields.io/maven-central/v/io.github.cozodb/cozo-clj?label=clj)](https://mvnrepository.com/artifact/io.github.cozodb/cozo-clj)\n[![android](https://img.shields.io/maven-central/v/io.github.cozodb/cozo_android?label=android)](https://mvnrepository.com/artifact/io.github.cozodb/cozo_android)\n[![pod](https://img.shields.io/cocoapods/v/CozoSwiftBridge)](https://github.com/cozodb/cozo/tree/main/cozo-lib-swift)\n[![Go](https://img.shields.io/github/v/release/cozodb/cozo-lib-go?label=go)](https://github.com/cozodb/cozo-lib-go)\n[![C](https://img.shields.io/github/v/release/cozodb/cozo?label=C)](https://github.com/cozodb/cozo/releases)\n[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/cozodb/cozo/build.yml?branch=main)](https://github.com/cozodb/cozo/actions/workflows/build.yml)\n[![GitHub](https://img.shields.io/github/license/cozodb/cozo)](https://github.com/cozodb/cozo/blob/main/LICENSE.txt)\n\n# Cozo 数据库\n\n## 🎉🎉🎉 新版本发布 🎉🎉🎉\n\nCozoDB v0.6 已发布！本版本在 Datalog 内引入了带有 HNSW 索引的向量搜索，可以与即席连接、递归 Datalog 和经典的整个图算法等强大功能无缝集成。这显著扩展了 CozoDB 的可能性。 [详情见此](https://docs.cozodb.org/en/latest/releases/v0.6.html)。\n\n## 简介\n\n[ 中文文档 | [English](./README.md) ]\n\nCozo是一个事务型关系型数据库：\n\n* 一个 **可嵌入** 的数据库；\n* 一个使用 **Datalog** 作为查询语句的数据库；\n* 一个专注于 **图数据、图算法** 的数据库；\n* 一个可进行 **历史穿梭** 查询的数据库；\n* 一个支持 **高性能、高并发** 的数据库。\n\n### “可嵌入”是什么意思？\n\n如果某个数据库能在不联网的手机上使用，那它大概就是嵌入式的。举例来说，SQLite 是嵌入式的，而 MySQL、Postgres、Oracle 等不是（它们是客户端—服务器（CS）架构的数据库）。\n\n\u003e 如果数据库与你的主程序在同一进程中运行，那么它就是 _嵌入式_ 数据库。与此相对，在使用 _客户端—服务器_ 架构的数据库时，主程序需要通过特定的接口（通常是网络接口）访问数据库，而数据库也可能运行在另一台机器或独立的集群上。嵌入式数据库使用简单，资源占用少，并可以在更广泛的环境中使用。\n\u003e\n\u003e Cozo 同时也支持以客户端—服务器模式运行。因此，Cozo 是一个 _可嵌入_ 而不是仅仅是 _嵌入式_ 的数据库。在客户端—服务器模式下，Cozo 可以更充分地发挥服务器的性能。\n\n### “图数据”有什么用？\n\n从本质上来说，数据一定是相互关联、自关联的，而这种关联的数学表达便是 _图_ （也叫 _网络_）。只有考虑这些关联，才能更深入地洞察数据背后的逻辑。\n\n\u003e 大多数现有的 _图数据库_ 强制要求按照属性图（property graph）的范式存储数据。与此相对，Cozo 使用传统的关系数据模型。关系数据模型有存储逻辑简单、功能强劲等优点，并且处理图数据也毫无问题。更重要的是，数据的洞察常常需要挖掘隐含的关联，而关系数据模型作为关系 _代数_（relational algebra）可以很好地处理此类问题。比较而言，因为其不构成一个代数，属性图模型仅仅能够将显性的图关系作为图数据处理，可组合性很弱。\n\n### “Datalog”好在哪儿？\n\nDatalog 1977 年便出现了，它可表达所有的 _关系型查询_，而它与 SQL 比起来的优势在于其对 _递归_ 的表达。由于执行逻辑不同，Datalog 对于递归的运行，通常比相应的 SQL 查询更快。Datalog 的可组合性、模块性都很优秀，使用它，你可以逐层、清晰地表达所需的查询。\n\n\u003e 递归对于图查询尤其重要。Cozo 使用的 Datalog 方言 叫做 CozoScript，其允许在一定条件下混合使用聚合查询与递归，从而进一步增强了 Datalog 的表达能力。同时，Cozo内置了图分析中常用的一些算法（如 PageRank 等），调用简单。\n\u003e\n\u003e 对 Datalog 有进一步了解以后，你会发现 Datalog 的 _规则_ 类似于编程语言中的函数。规则的一大特点是其可组合性：将一个查询分解为多个渐进的规则可使查询更清晰、易维护，且不会有效率上的损失。与此相对的，复杂的 SQL 查询语句通常表达为多层嵌套的“select-from-where”，可读性、可维护性都不高。\n\n### 历史穿梭？\n\n在数据库中，“历史穿梭”的意思是记录数据的一切变化，以允许针对某一时刻的数据进行执行查询，用来窥探历史。\n\n\u003e 在某种意义上，这使数据库成为 _不可变_ 数据库，因为没有数据会被真正删除。\n\u003e \n\u003e 每一项额外的功能都有其代价。如果不使用某个功能，理想的状态是不必为这个功能的代价埋单。在 Cozo 中，不是所有数据表都自动支持历史穿梭，这就把是否需要此功能、是否愿意支付代价的选择权交到了用户手里。\n\u003e \n\u003e [这个](https://docs.cozodb.org/zh_CN/latest/releases/v0.4.html)关于历史穿梭的小故事可能启发出一些历史穿梭的应用场景。\n\n\n### “高性能、高并发”，有多高？\n\n我们在一台 2020 年的 Mac Mini 上，使用 RocksDB 持久性存储引擎（Cozo 支持多种存储引擎）做了性能测试：\n\n* 对一个有 160 万行的表进行查询：读、写、改的混合事务性查询可达到每秒 10 万次，而只读查询可达到每秒 25 万次。在此过程中，数据库使用的内存峰值仅为50MB。\n* 备份数据的速度为每秒约 100 万行，恢复速度为每秒约 40 万行。备份、恢复的速度不随表单数据增长而变慢。\n* 分析查询：扫描一个有 160 万行的表大约需要 1 秒（根据具体查询语句大约有上下 2 倍以内的差异）。查询所需时间与查询所涉及的行数大致成比例，而内存使用主要决定于返回集合的大小。\n* 对于一个有 160 万个顶点，3100 万条边的图数据表，“两跳”图查询（如查询某人的朋友的朋友都有谁）可在 1 毫秒内完成。\n* Pagerank 算法速度：1 万个顶点，12 万条边：50 毫秒以内；10 个万顶点，170 万条边：1 秒以内；160 万个顶点，3100 万条边：30秒以内。\n\n更多的细节参见[此文](https://docs.cozodb.org/zh_CN/latest/releases/v0.3.html)。\n\n## 学习 Cozo\n\n你得先安装一个数据库才能开始学，对吧？不一定：Cozo 是“嵌入式”的，所以我们直接把它通过 WASM 嵌入到浏览器里了！打开[这个页面](https://www.cozodb.org/wasm-demo/)，然后：\n\n* [Cozo 入门教程](https://docs.cozodb.org/zh_CN/latest/tutorial.html)\n\n当然也可以一步到位：先翻到后面了解如何在熟悉的环境里安装原生 Cozo 数据库，再开始学习。\n\n### 一些示例\n\n通过以下示例，可在正式开始学习之前对 Cozo 的查询先有个感性认识。\n\n假设有个表，名为 `*route`，含有两列，名为 `fr` 和 `to`，其中数据为机场代码（如 `FRA` 是法兰克福机场的代码），且每行数据表示一个飞行航线。\n\n从 `FRA` 可以不转机到达多少个机场：\n```\n?[count_unique(to)] := *route{fr: 'FRA', to}\n```\n\n| count_unique(to) |\n|------------------|\n| 310              |\n\n从 `FRA` 出发，转机一次，可以到达多少个机场：\n```\n?[count_unique(to)] := *route{fr: 'FRA', to: stop},\n                       *route{fr: stop, to}\n```\n\n| count_unique(to) |\n|------------------|\n| 2222             |\n\n从 `FRA` 出发，转机任意次，可以到达多少个机场：\n```\nreachable[to] := *route{fr: 'FRA', to}\nreachable[to] := reachable[stop], *route{fr: stop, to}\n?[count_unique(to)] := reachable[to]\n```\n\n| count_unique(to) |\n|------------------|\n| 3462             |\n\n从 `FRA` 出发，按所需的最少转机次数排序，到达哪两个机场需要最多的转机次数：\n```\nshortest_paths[to, shortest(path)] := *route{fr: 'FRA', to},\n                                      path = ['FRA', to]\nshortest_paths[to, shortest(path)] := shortest_paths[stop, prev_path],\n                                      *route{fr: stop, to},\n                                      path = append(prev_path, to)\n?[to, path, p_len] := shortest_paths[to, path], p_len = length(path)\n\n:order -p_len\n:limit 2\n```\n\n| to  | path                                              | p_len |\n|-----|---------------------------------------------------|-------|\n| YPO | `[\"FRA\",\"YYZ\",\"YTS\",\"YMO\",\"YFA\",\"ZKE\",\"YAT\",\"YPO\"]` | 8     |\n| BVI | `[\"FRA\",\"AUH\",\"BNE\",\"ISA\",\"BQL\",\"BEU\",\"BVI\"]`        | 7     |\n\n`FRA` 和 `YPO` 这两个机场之间最短的路径以及其实际飞行里程是多少：\n```\nstart[] \u003c- [['FRA']]\nend[] \u003c- [['YPO]]\n?[src, dst, distance, path] \u003c~ ShortestPathDijkstra(*route[], start[], end[])\n```\n\n| src | dst | distance | path                                                   |\n|-----|-----|----------|--------------------------------------------------------|\n| FRA | YPO | 4544.0   | `[\"FRA\",\"YUL\",\"YVO\",\"YKQ\",\"YMO\",\"YFA\",\"ZKE\",\"YAT\",\"YPO\"]` |\n\n当查询语句有错时，Cozo 会提供明确有用的错误信息：\n```\n?[x, Y] := x = 1, y = x + 1\n```\n\n\u003cpre\u003e\u003cspan style=\"color: rgb(204, 0, 0);\"\u003eeval::unbound_symb_in_head\u003c/span\u003e\u003cspan\u003e\n\n  \u003c/span\u003e\u003cspan style=\"color: rgb(204, 0, 0);\"\u003e×\u003c/span\u003e\u003cspan\u003e Symbol 'Y' in rule head is unbound\n   ╭────\n \u003c/span\u003e\u003cspan style=\"color: rgba(0, 0, 0, 0.5);\"\u003e1\u003c/span\u003e\u003cspan\u003e │ ?[x, Y] := x = 1, y = x + 1\n   · \u003c/span\u003e\u003cspan style=\"font-weight: bold; color: rgb(255, 0, 255);\"\u003e     ─\u003c/span\u003e\u003cspan\u003e\n   ╰────\n\u003c/span\u003e\u003cspan style=\"color: rgb(0, 153, 255);\"\u003e  help: \u003c/span\u003e\u003cspan\u003eNote that symbols occurring only in negated positions are not considered bound\n\u003c/span\u003e\u003c/pre\u003e\n\n## 安装 Cozo\n\n建议先学习，再安装。当然反过来我们也不反对。\n\nCozo 可以安装在一大堆不同的语言与环境中：\n\n| 语言/环境                                                                                                 | 官方支持的平台                                                                                              | 存储引擎  |\n|-------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------|-------|\n| [Python](https://github.com/cozodb/pycozo)（[国内镜像](https://gitee.com/cozodb/pycozo)）                   | Linux (x86_64), Mac (ARM64, x86_64), Windows (x86_64)                                                | MQR   |\n| [NodeJS](./cozo-lib-nodejs)                                                                           | Linux (x86_64, ARM64), Mac (ARM64, x86_64), Windows (x86_64)                                         | MQR   |\n| [浏览器](./cozo-lib-wasm)                                                                                | 支持[WASM](https://developer.mozilla.org/en-US/docs/WebAssembly#browser_compatibility)的浏览器（较新的浏览器全都支持） | M     |\n| [Java (JVM)](https://github.com/cozodb/cozo-lib-java)（[国内镜像](https://gitee.com/cozodb/cozo-lib-java)） | Linux (x86_64, ARM64), Mac (ARM64, x86_64), Windows (x86_64)                                         | MQR   |\n| [Clojure (JVM)](https://github.com/cozodb/cozo-clj)（[国内镜像](https://gitee.com/cozodb/cozo-clj)）        | Linux (x86_64, ARM64), Mac (ARM64, x86_64), Windows (x86_64)                                         | MQR   |\n| [安卓](https://github.com/cozodb/cozo-lib-android)（[国内镜像](https://gitee.com/cozodb/cozo-lib-android)）   | Android (ARM64, ARMv7, x86_64, x86)                                                                  | MQ    |\n| [iOS/macOS (Swift)](./cozo-lib-swift)                                                                 | iOS (ARM64, 模拟器), Mac (ARM64, x86_64)                                                                | MQ    |\n| [Rust](https://docs.rs/cozo/)                                                                         | 任何支持`std`的[平台](https://doc.rust-lang.org/nightly/rustc/platform-support.html)（源代码编译）                 | MQRST |\n| [Go](https://github.com/cozodb/cozo-lib-go)（[国内镜像](https://gitee.com/cozodb/cozo-lib-go)）             | Linux (x86_64, ARM64), Mac (ARM64, x86_64), Windows (x86_64)                                         | MQR   |\n| [C/C++/支持 C FFI 的语言](./cozo-lib-c)                                                                    | Linux (x86_64, ARM64), Mac (ARM64, x86_64), Windows (x86_64)                                         | MQR   |\n| [独立的 HTTP 服务](./cozo-bin)                                                                             | Linux (x86_64, ARM64), Mac (ARM64, x86_64), Windows (x86_64)                                         | MQRST |\n\n“存储引擎”列中各个字母的含义：\n\n* M: 基于内存的非持久性存储引擎\n* Q: 基于 [SQLite](https://www.sqlite.org/) 的存储引擎\n* R: 基于 [RocksDB](http://rocksdb.org/) 的存储引擎\n* S: 基于 [Sled](https://github.com/spacejam/sled) 的存储引擎\n* T: 基于 [TiKV](https://tikv.org/) 的分布式存储引擎\n\nCozo 的 [Rust API 文档](https://docs.rs/cozo/)（英文）中有一些额外的关于存储选择的建议。\n\n你也可以尝试为其它平台、语言、引擎自行编译 Cozo。可能需要调整一些代码，但总体来说不难。\n\n### 优化基于 RocksDB 的存储引擎\n\nRocksDB 有五花八门的选项以供用户进行性能调优。但是调优这个问题太复杂了，就连 RocksDB 他们自己也搞不定，所以实际生产中他们用的是强化学习来自动调优。对于 95% 的用户来说，费这个劲根本不值得，尤其是 Cozo “开箱”的设置就已经相当快、足够快了。\n\n如果你坚信你是剩下那 5% 里面的：当你用 RocksDB 引擎创建 CozoDB 实例时，你提供过一个存储数据的目录路径。如果在这个目录里创建一个名为`options`的文件，RocksDB 引擎便会将其解读为 [RocksDB 选项文件](https://github.com/facebook/rocksdb/wiki/RocksDB-Options-File)\n并应用其中的设置。如果使用的是独立的 `cozo` 程序，激活此功能时会有一条提示日志。\n\n每次 RocksDB 引擎启动时，存储目录下的 `data/OPTIONS-XXXXXX` 文件会记录当前应用设置。你可以把这个文件拷贝出来，在其基础上修改。如果你不是 RocksDB 的专家，建议只改动那些你大概知道什么意思的数字型选项。设置不当可能会搞乱、搞坏数据库。\n\n## Cozo 的架构\n\nCozo 数据库有三个上下游部分组成，其中每部分只调用下游部分的接口。\n\n\u003ctable\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\u003ctd\u003e(\u003ci\u003e用户代码\u003c/i\u003e)\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e语言/环境包装\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e查询引擎\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e存储引擎\u003c/td\u003e\u003c/tr\u003e\n\u003ctr\u003e\u003ctd\u003e(\u003ci\u003e操作系统\u003c/i\u003e)\u003c/td\u003e\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\n### 存储引擎\n\n在存储引擎这一部分里，Cozo 定义了一个存储接口（Rust 中的 `trait`），这个接口的功能是对二进制数据的键值进行存储及范围扫描。目前这个接口有以下官方实现：\n\n* 基于内存的非持久性存储引擎\n* 基于 [SQLite](https://www.sqlite.org/) 的存储引擎\n* 基于 [RocksDB](http://rocksdb.org/) 的存储引擎\n* 基于 [Sled](https://github.com/spacejam/sled) 的存储引擎\n* 基于 [TiKV](https://tikv.org/) 的分布式存储引擎\n\n不是所有的二进制包都包含以上所有引擎。这些引擎中，SQLite 引擎具有特殊地位：Cozo 使用它的文件作为备份文件，用以在不同引擎的 Cozo 之间交换数据。Rust 使用者可以轻松实现自己的引擎（不是说写一个引擎很轻松，这里意思是把现有的引擎接入到 Cozo 里很轻松）。\n\nCozo 使用 _面向行_ 而非 _面向列_ 的二进制存储格式。在这个格式中，对键的存储通过 [memcomparable](https://github.com/facebook/mysql-5.6/wiki/MyRocks-record-format#memcomparable-format) 的方法将复合键存储为一个字节数组，而直接对这些字节数组按照字节顺序排序就能得到正确的语义排序。这也意味着直接用 SQL 查询在 SQLite 引擎中存储的数据得到的结果看起来像是乱码。实现存储引擎本身的接口并不需要了解这个格式。\n\n### 查询引擎\n\n查询引擎部分实现了以下功能：\n\n* 各种函数、聚合算子、算法的实现\n* 表单数据结构的定义（schema）\n* 数据库查询事务（transaction）\n* 查询语句的编译\n* 查询的执行\n\n这部分包含 Cozo 项目的大部分代码。关于查询的执行，文档中[有一整章](https://docs.cozodb.org/zh_CN/latest/execution.html)来详细介绍。\n\nCozo 的 [Rust API](https://docs.rs/cozo/) 实际上就是查询引擎的公共接口。\n\n### 语言、环境封装\n\nCozo 的 Rust 以外的所有语言、环境都只是对 Rust API 的进一步封装。例如，在独立服务器（cozo）中，Rust API 被封装为了 HTTP 端点，而在 Cozo-Node 中，同步的Rust API 被封装为基于 JavaScript 运行时的异步 API。\n\n封装 Rust API 不难，如果你想让 Cozo 在其它语言上跑起来可以试试。Rust 有一些现成的库用来与其它语言交互。如果你想用某个语言而没有现成的交互库，我们建议你直接封装 Cozo 的 C 语言 API。官方支持的 Go 库就是这么实现的（通过 cgo）。\n\n## 项目进程\n\nCozo 一开始预想的功能已经实现得不少了，但是项目仍然年轻得很。欢迎各界朋友使用并提出宝贵意见。\n\nCozo 1.0 之前的版本不承诺语法、API 的稳定性或存储兼容性。\n\n## 许可证和贡献\n\nCozo 以 MPL-2.0 或其更高版本授权。如果你有兴趣为该项目贡献代码，请看[这里](CONTRIBUTING.md)。","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcozodb%2Fcozo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcozodb%2Fcozo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcozodb%2Fcozo/lists"}