use semantic_memory::{GraphDirection, MemoryConfig, MemoryStore};
use std::path::PathBuf;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber_init();
let config = MemoryConfig {
base_dir: PathBuf::from("/tmp/semantic-memory-example"),
..Default::default()
};
let store = MemoryStore::open(config)?;
println!("Adding facts...");
store
.add_fact(
"general",
"Rust is a systems programming language focused on safety and performance",
None,
None,
)
.await?;
store
.add_fact(
"general",
"Python is widely used for data science and machine learning",
None,
None,
)
.await?;
store
.add_fact(
"general",
"JavaScript is the language of the web, running in all browsers",
None,
None,
)
.await?;
store
.add_fact(
"user",
"Josh prefers Rust for systems work and Python for scripting",
None,
None,
)
.await?;
store
.add_fact(
"user",
"The homelab runs NixOS on three servers",
None,
None,
)
.await?;
println!("\nSearching for 'systems programming'...");
let results = store
.search("systems programming", Some(3), None, None)
.await?;
for (i, result) in results.iter().enumerate() {
println!(
" {}. [score: {:.4}] {}",
i + 1,
result.score,
result.content
);
}
println!("\nExplainable search for 'systems programming'...");
let explained = store
.search_explained("systems programming", Some(3), None, None)
.await?;
for (i, hit) in explained.iter().enumerate() {
println!(
" {}. [rrf: {:.4}] bm25_rank={:?} vector_rank={:?} reranked={} | {}",
i + 1,
hit.breakdown.rrf_score,
hit.breakdown.bm25_rank,
hit.breakdown.vector_rank,
hit.breakdown.vector_reranked_from_f32,
hit.result.content
);
}
println!("\nFTS search for 'Python'...");
let results = store.search_fts_only("Python", Some(3), None, None).await?;
for (i, result) in results.iter().enumerate() {
println!(
" {}. [score: {:.4}] {}",
i + 1,
result.score,
result.content
);
}
let stats = store.stats().await?;
println!("\nDatabase stats:");
println!(" Facts: {}", stats.total_facts);
println!(" Documents: {}", stats.total_documents);
println!(" Model: {:?}", stats.embedding_model);
let graph = store.graph_view();
let namespace_edges = graph.neighbors("namespace:general", GraphDirection::Outgoing, 1)?;
println!("\nGraph edges from namespace:general:");
for edge in namespace_edges.iter().take(3) {
println!(" {} -> {}", edge.source, edge.target);
}
std::fs::remove_dir_all("/tmp/semantic-memory-example").ok();
Ok(())
}
fn tracing_subscriber_init() {
let _ = std::io::stderr();
}