Chisle
The coding-agent plugin that bills 52% of a bare model across 20 live tasks. Terse persona + tool-output compressor + context diet.
Application‑native graph database with constant‑time queries and no query language
Developer toolsGitHub @agnesoftOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
Repository information has not been collected yet.
No updates detected yet. GitHub releases will appear here.
Agnesoft Graph Database
Translation pending
Loading the full README.
Read the full 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.
This is the beginning of the README. Read the rest at the original. Read the full README ↗