| Crates.io | tribles |
| lib.rs | tribles |
| version | 0.5.1 |
| created_at | 2020-09-17 19:00:56.118603+00 |
| updated_at | 2025-01-13 16:56:15.138903+00 |
| description | The tribles knowledge base implementation for rust. |
| homepage | https://tribles.space |
| repository | |
| max_upload_size | |
| id | 289887 |
| size | 843,376 |

🚧🚧🚧 Please note that this is work in progress, so while a lot of things have settled by now, we still favour breaking backwards compatiblity for seeminly minor improvements. 🚧🚧🚧

“Insufficient facts always invite danger.”
— Mr. Spock
Trible Space is a data space and knowledge graph standard. It offers metadata management capabilities similar to file- and version-control systems, combined with the queryability and convenience of an embedded database, tailored towards use with simple blob storage. It is designed to be a holistic yet lightweight data storage solution that can be used in a variety of contexts, from embedded systems to distributed cloud services.
Our goal is to re-invent data storage from first principles and overcome the shortcomings of prior "Semantic Web"/triple-store technologies. By focusing on simplicity, canonical data formats, cryptographic identifiers, and clean distributed semantics, we aim to provide a lean, lightweight yet powerful toolkit for knowledge representation, database management, and data exchange use cases.
If you have any questions or want to chat about graph databases hop into our discord.
use tribles::prelude::*;
use tribles::prelude::valueschemas::*;
use tribles::prelude::blobschemas::*;
NS! {
pub namespace literature {
"8F180883F9FD5F787E9E0AF0DF5866B9" as author: GenId;
"0DBB530B37B966D137C50B943700EDB2" as firstname: ShortString;
"6BAA463FD4EAF45F6A103DB9433E4545" as lastname: ShortString;
"A74AA63539354CDA47F387A4C3A8D54C" as title: ShortString;
"FCCE870BECA333D059D5CD68C43B98F0" as page_count: R256;
"6A03BAF6CFB822F04DA164ADAAEB53F6" as quote: Handle<Blake3, LongString>;
}
}
fn main() -> std::io::Result<()> {
let mut blobs = BlobSet::new();
let mut set = TribleSet::new();
let author_id = ufoid();
// Note how the entity macro returns TribleSets that can be cheaply merged
// into our existing dataset.
set += literature::entity!(&author_id, {
firstname: "Frank",
lastname: "Herbert",
});
set += literature::entity!({
title: "Dune",
author: &author_id,
quote: blobs.insert("Deep in the human unconscious is a \
pervasive need for a logical universe that makes sense. \
But the real universe is always one step beyond logic."),
quote: blobs.insert("I must not fear. Fear is the \
mind-killer. Fear is the little-death that brings total \
obliteration. I will face my fear. I will permit it to \
pass over me and through me. And when it has gone past I \
will turn the inner eye to see its path. Where the fear \
has gone there will be nothing. Only I will remain.")
});
let title = "Dune";
// We can then find all entities matching a certain pattern in our dataset.
for (_, f, l, q) in find!(
(author: (), first: String, last: Value<_>, quote),
literature::pattern!(&set, [
{ author @
firstname: first,
lastname: last
},
{
title: (title),
author: author,
quote: quote
}])) {
let q: &str = blobs.get(q).unwrap();
println!("'{q}'\n - from {title} by {f} {}.", l.from_value::<&str>())
}
Ok(())
}
The best way to get started is to read the module documentation of the tribles crate. The following links provide an overview of the most important modules, in an order where you can start with the most basic concepts and work your way up to more advanced topics: