use allsource_core::prime::{Direction, EntityId, Prime};
use serde_json::json;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let prime = Prime::open_in_memory().await?;
let alice_id = prime
.add_node("person", json!({"name": "Alice", "role": "engineer"}))
.await?;
let bob_id = prime
.add_node("person", json!({"name": "Bob", "role": "manager"}))
.await?;
let project_id = prime
.add_node(
"project",
json!({"name": "AllSource Prime", "status": "active"}),
)
.await?;
let alice = EntityId::node("person", alice_id.as_str()).to_string();
let bob = EntityId::node("person", bob_id.as_str()).to_string();
let project = EntityId::node("project", project_id.as_str()).to_string();
println!("Created: Alice={alice}, Bob={bob}, Project={project}");
prime.add_edge(&alice, &project, "works_on", None).await?;
prime.add_edge(&bob, &project, "manages", None).await?;
prime
.add_edge(&bob, &alice, "mentors", Some(json!({"since": "2025-01"})))
.await?;
let stats = prime.stats();
println!(
"\nGraph: {} nodes, {} edges",
stats.total_nodes, stats.total_edges
);
let team = prime.neighbors(&project, None, Direction::Incoming);
println!("\nProject team:");
for member in &team {
println!(" - {} ({})", member.properties["name"], member.node_type);
}
let mentees = prime.neighbors(&bob, Some("mentors"), Direction::Outgoing);
println!("\nBob mentors:");
for m in &mentees {
println!(" - {}", m.properties["name"]);
}
if let Some(path) = prime.shortest_path(&alice, &bob, None) {
println!("\nPath Alice → Bob: {} hops", path.len() - 1);
for node in &path {
println!(" → {}", node.properties["name"]);
}
}
prime
.update_node(
&alice,
json!({"level": "senior", "languages": ["Rust", "Python"]}),
)
.await?;
let alice_node = prime.get_node(&alice).unwrap();
println!(
"\nAlice updated: level={}, languages={:?}",
alice_node.properties["level"], alice_node.properties["languages"]
);
let history = prime.history(&alice).await?;
println!("\nAlice's history ({} events):", history.len());
for entry in &history {
println!(" {} at {}", entry.event_type, entry.timestamp);
}
let sg = prime.subgraph(&alice, 2);
println!(
"\nAlice's 2-hop subgraph: {} nodes, {} edges",
sg.nodes.len(),
sg.edges.len()
);
prime.shutdown().await?;
println!("\nDone.");
Ok(())
}