10个版本
新增 0.8.0 | 2024年8月11日 |
---|---|
0.7.2 | 2024年7月14日 |
0.7.0 | 2024年6月18日 |
0.6.9 | 2024年5月14日 |
0.6.5 | 2024年1月29日 |
#2134 in 数据库接口
315 每月下载量
用于 agdb_server
715KB
17K SLoC
agdb
图形数据库。
Agnesoft 图形数据库
Agnesoft 图数据库(简称 agdb)是一种持久、可选内存映射的图数据库,具有原生 'no-text' 查询对象。它可以作为主持久存储、数据分析平台以及快速内存缓存使用。其无类型的存储允许无缝、无停机时间或昂贵的迁移进行数据更新。所有查询都通过构建器模式或直接作为对象构建,无需特殊语言或文本解析。
主要功能
- 图表上的数据
- 附加到图元素(节点和边)的带类型的 键值属性
- 持久、平台无关的基于文件的存储(可在平台之间传输)
- ACID 兼容
- 对象查询带有构建器模式(无文本,无查询语言)
- 内存映射以快速查询
- 服务器模式
- 任何编程语言的 OpenAPI 客户端
- 云托管 SaaS 数据库
- Db 本身没有依赖
概述 [Db]
cargo add agdb
基本用法,展示创建数据库,用数据插入图元素并使用 select 和 search 查询它们。使用此代码的功能必须处理 agdb::DbError
和 agdb::QueryError
错误类型以使操作符 ?
生效
use agdb::{Db, DbId, QueryBuilder, UserValue, DbUserValue, Comparison::Equal};
let mut db = Db::new("db_file.agdb")?;
db.exec_mut(&QueryBuilder::insert().nodes().aliases("users").query())?;
#[derive(Debug, UserValue)]
struct User { db_id: Option<DbId>, name: String, }
let users = vec![User { db_id: None, name: "Alice".to_string(), },
User { db_id: None, name: "Bob".to_string(), },
User { db_id: None, name: "John".to_string(), }];
let users_ids = db.exec_mut(&QueryBuilder::insert().nodes().values(&users).query())?;
db.exec_mut(
&QueryBuilder::insert()
.edges()
.from("users")
.to(&users_ids)
.query(),
)?;
此代码创建了一个名为 user_db.agdb
的数据库,包含一个简单的包含 4 个节点的图。第一个节点别名为 users
,然后 Alice、Bob 和 John 的 3 个用户节点通过边连接到 users
节点。随机的 name
属性附加到用户节点。我们不是直接使用键插入值(这也是可能的),而是使用自己的类型并从 agdb::UserValue
继承,以便它可以与数据库一起使用。
您可以通过它们的 ID 选择图元素(节点和边),以获取与相关数据(键值属性)一起返回。让我们选择我们的用户并将结果转换为列表(注意我们只选择与我们的 User
类型相关的值,通过传递 User::db_keys()
)
let users: Vec<User> = db
.exec(
&QueryBuilder::select()
.values(User::db_keys())
.ids(&users_ids)
.query(),
)?
.try_into()?;
println!("{:?}", users);
// [User { db_id: Some(DbId(2)), username: "Alice" },
// User { db_id: Some(DbId(3)), username: "Bob" },
// User { db_id: Some(DbId(4)), username: "John" }]
您还可以根据条件在图中搜索以仅返回某些元素。例如
let user: User = db
.exec(
&QueryBuilder::select()
.values(User::db_keys())
.ids(
QueryBuilder::search()
.from("users")
.where_()
.key("name")
.value(Equal("Bob".into()))
.query(),
)
.query(),
)?
.try_into()?;
println!("{:?}", user);
// User { db_id: Some(DbId(3)), username: "Bob" }
有关数据库概念和基本数据类型,请参阅 概念。有关所有查询的全面概述,请参阅 查询 参考,或继续深入了解 高效的 agdb。
功能特性
agdb
功能 | 默认 | 描述 |
---|---|---|
derive | 是 | 启用 derive 宏以启用自定义用户类型可以直接与数据库一起使用。 |
opeanapi | 否 | 启用 ToSchema 宏在查询结构上,以便可以将它们导出为 json OpeanAPI/Swagger 架构。 |
serde | 否 | 启用使用 serde 的查询和 QueryResult 的序列化/反序列化。 |
agdb_api
功能 | 默认 | 描述 |
---|---|---|
reqwest | 否 | 使用 reqwest ,为 agdb API 客户端提供对 HttpClient 特性的引用实现。 |
决策树
flowchart TD;
A[Embedded or server?] --> Embedded
A --> B[Client or hosting?]
Embedded --> Studio[<a href='https://github.com/agnesoft/agdb/blob/main/docs/studio.md'>Studio</a>]
Embedded --> Queries[<a href='https://github.com/agnesoft/agdb/blob/main/docs/queries.md'>Queries</a>]
B --> Client
B --> Hosting
Client --> API[<a href='https://github.com/agnesoft/agdb/blob/main/docs/api.md'>API</a>]
Client --> Studio
Client --> Queries
Hosting --> Server[<a href='https://github.com/agnesoft/agdb/blob/main/docs/server.md'>Server</a>]
Hosting --> Cloud[<a href='https://github.com/agnesoft/agdb/blob/main/docs/cloud.md'>Cloud</a>]
路线图
以下为计划中的功能
功能 | 描述 |
---|---|
Agdb Studio | agdb 的图形界面 |
Python 客户端 | 使用 OpenAPI 生成的绑定生成的便利客户端。 |
Java 客户端 | 使用 OpenAPI 生成的绑定生成的便利客户端。 |
C# 客户端 | 使用 OpenAPI 生成的绑定生成的便利客户端。 |
C 客户端 | 使用 OpenAPI 生成的绑定生成的便利客户端。 |
C++ 客户端 | 使用 OpenAPI 生成的绑定生成的便利客户端。 |
数据复制与共识协议 | 通过使用 RAFT 协议将多个数据库节点连接起来,允许进行数据复制。 |
Agdb Playground | 免费公共云基础上的 playground,用于尝试 agdb 。 |
#[no_std] | agdb 不需要任何依赖,因此理论上应该是 no_std 友好的,但它可能需要一些开发与测试。 |
公共云服务 | 在公共云上托管的支持性商业 agdb 实例。 |
参考
依赖
~2–13MB
~149K SLoC