use chaotic_semantic_memory::prelude::*;
#[tokio::main]
async fn main() -> Result<()> {
println!("πΈοΈ Knowledge Graph\n");
let framework = ChaoticSemanticFramework::builder()
.without_persistence()
.build()
.await?;
let entities = ["rust", "programming", "memory", "ai", "python", "safety"];
for entity in &entities {
framework
.inject_concept(*entity, HVec10240::random())
.await?;
}
println!(" β
Injected {} entities\n", entities.len());
let edges: Vec<(&str, &str, f32)> = vec![
("rust", "programming", 0.95), ("rust", "safety", 0.90), ("rust", "memory", 0.85), ("python", "programming", 0.95), ("python", "ai", 0.80), ("ai", "memory", 0.70), ("safety", "memory", 0.75), ];
for (from, to, strength) in &edges {
framework.associate(from, to, *strength).await?;
println!(" π {from} β {to} ({strength:.2})");
}
println!("\nπ Graph Structure:");
for entity in &entities {
let neighbors = framework.get_associations(entity).await?;
if neighbors.is_empty() {
println!(" {entity}: (no outbound edges)");
} else {
let neighbor_str: Vec<String> = neighbors
.iter()
.map(|(id, s)| format!("{id}({s:.2})"))
.collect();
println!(" {entity}: {}", neighbor_str.join(", "));
}
}
let start = "rust";
println!("\nπ 2-hop traversal from '{start}':");
let hop1 = framework.get_associations(start).await?;
println!(
" Hop 1: {:?}",
hop1.iter().map(|(id, _)| id).collect::<Vec<_>>()
);
let mut hop2_set: Vec<(String, String, f32)> = Vec::new();
for (neighbor, _) in &hop1 {
let hop2 = framework.get_associations(neighbor).await?;
for (target, strength) in &hop2 {
if target != start && !hop1.iter().any(|(n, _)| n == target) {
hop2_set.push((neighbor.clone(), target.clone(), *strength));
}
}
}
if hop2_set.is_empty() {
println!(" Hop 2: (no new entities reached)");
} else {
for (via, target, strength) in &hop2_set {
println!(" Hop 2: {start} β {via} β {target} ({strength:.2})");
}
}
println!("\nβ
Knowledge graph demo complete!");
Ok(())
}