尚未收集仓库信息。
尚未检测到更新。GitHub 发布版本后会显示在这里。
Agnesoft Graph Database
翻译准备中
正在加载完整 README。
查看完整 README ↗The Agnesoft Graph Database (aka agdb) is application native database without compromises. It is persistent, optionally memory mapped graph database with native object 'no-text' queries. It can be used as a main persistent storage, data analytics platform as well as fast in-memory cache. Its typed schema-less data store allows for flexible and seamless data updates with no downtime or costly migrations. All queries are constructed via a builder pattern or directly as objects with no special language or text parsing.
agdb is application native database.Technical features:
where_().key(...).regex(...)cargo add agdb
Basic usage demonstrating creating a database, inserting graph elements with data and querying them back with select and search. The function using this code must handle agdb::DbError for operator ? to work (i.e. fn foo() -> Result<(), agdb::DbError>):
use agdb::{Db, DbId, QueryBuilder, DbType};
let mut db = Db::new("db_file.agdb")?;
db.exec_mut(QueryBuilder::insert().nodes().aliases("users").query())?;
#[derive(Debug, DbType)]
struct User { db_id: Option<DbId>, name: String, }
let users = vec![User { db_id: None, name: "Alice".into(), },
User { db_id: None, name: "Bob".into(), },
User { db_id: None, name: "John".into(), }];
let users_ids = db.exec_mut(QueryBuilder::insert().nodes().values(&users).query())?;
db.exec_mut(
QueryBuilder::insert()
.edges()
.from("users")
.to(&users_ids)
.query(),
)?;
This code creates a database called db_file.agdb with a simple graph of 4 nodes. The first node is aliased users and 3 user nodes for Alice, Bob and John are then connected with edges to the users node. The arbitrary name property is attached to the user nodes. Rather than inserting values directly with keys (which is also possible) we use our own type and derive from agdb::DbType to allow it to be used with the database.
You can select the graph elements (both nodes & edges) with their ids to get them back with their associated data (key-value properties). Let's select our users and convert the result into the list (notice we select only values relevant to our User type with passing User::db_keys()):
let users: Vec<User> = db
.exec(
QueryBuilder::select()
.elements::<User>()
.ids(&users_ids)
.query(),
)?
.try_into()?;
println!("{:?}", users);
// [User { db_id: Some(DbId(2)), name: "Alice" },
// User { db_id: Some(DbId(3)), name: "Bob" },
// User { db_id: Some(DbId(4)), name: "John" }]
You can also search through the graph to get back only certain elements based on conditions. For example:
let user: User = db
.exec(
QueryBuilder::select()
.elements::<User>()
.search()
.from("users")
.where_()
.key("name")
.value("Bob")
.query(),
)?
.try_into()?;
println!("{:?}", user);
// User { db_id: Some(DbId(3)), name: "Bob" }
String comparisons can also use regex matching when the regex feature is enabled:
let users: Vec<User> = db
.exec(
QueryBuilder::select()
.elements::<User>()
.search()
.from("users")
.where_()
.key("name")
.regex("^A")
.query(),
)?
.try_into()?;
For database concepts and primitive data types see concepts. For comprehensive overview of all queries see the queries reference or continue with more in-depth efficient agdb.
以上为 README 的开头部分。其余内容请阅读原文。 查看完整 README ↗