use graphlite_sdk::{Error, GraphLite};
use serde::Deserialize;
#[derive(Debug, Deserialize)]
#[allow(dead_code)]
struct Person {
name: String,
age: f64,
}
fn main() -> Result<(), Error> {
println!("=== GraphLite SDK Basic Usage Example ===\n");
println!("1. Opening database...");
let db_path = "/tmp/graphlite_sdk_example";
let db = GraphLite::open(db_path)?;
println!(" ✓ Database opened at {}\n", db_path);
println!("2. Creating session...");
let session = db.session("admin")?;
println!(" ✓ Session created for user 'admin'\n");
println!("3. Creating schema and graph...");
session.execute("CREATE SCHEMA IF NOT EXISTS example")?;
session.execute("USE SCHEMA example")?;
session.execute("CREATE GRAPH IF NOT EXISTS social")?;
session.execute("USE GRAPH social")?;
println!(" ✓ Schema and graph created\n");
println!("4. Inserting data with transaction...");
{
let mut tx = session.transaction()?;
tx.execute("CREATE (p:Person {name: 'Alice', age: 30})")?;
tx.execute("CREATE (p:Person {name: 'Bob', age: 25})")?;
tx.execute("CREATE (p:Person {name: 'Charlie', age: 35})")?;
tx.commit()?;
println!(" ✓ Inserted 3 persons\n");
}
println!("5. Querying data...");
let result = session.query("MATCH (p:Person) RETURN p.name as name, p.age as age")?;
println!(" Found {} persons:", result.rows.len());
for row in &result.rows {
if let (Some(name), Some(age)) = (row.get_value("name"), row.get_value("age")) {
println!(" - Name: {:?}, Age: {:?}", name, age);
}
}
println!();
println!("6. Using query builder...");
let result = session
.query_builder()
.match_pattern("(p:Person)")
.where_clause("p.age > 25")
.return_clause("p.name as name, p.age as age")
.order_by("p.age DESC")
.execute()?;
println!(" Found {} persons over 25:", result.rows.len());
for row in &result.rows {
if let (Some(name), Some(age)) = (row.get_value("name"), row.get_value("age")) {
println!(" - Name: {:?}, Age: {:?}", name, age);
}
}
println!();
println!("7. Using typed deserialization...");
let result = session.query("MATCH (p:Person) RETURN p.name as name, p.age as age")?;
let typed = graphlite_sdk::TypedResult::from(result);
let people: Vec<Person> = typed.deserialize_rows()?;
println!(" Deserialized {} persons:", people.len());
for person in &people {
println!(" - {:?}", person);
}
println!();
println!("8. Demonstrating transaction rollback...");
{
let mut tx = session.transaction()?;
tx.execute("CREATE (p:Person {name: 'David', age: 40})")?;
println!(" Created person 'David' in transaction");
}
println!(" Transaction rolled back (David not persisted)\n");
let result = session.query("MATCH (p:Person) RETURN count(p) as count")?;
if let Some(row) = result.rows.first() {
if let Some(count) = row.get_value("count") {
println!(" Person count after rollback: {:?}\n", count);
}
}
println!("=== Example completed successfully ===");
Ok(())
}