use cypherlite_core::{DatabaseConfig, SyncMode};
use cypherlite_query::api::CypherLite;
fn main() {
let tmp_dir = tempfile::tempdir().expect("failed to create temp directory");
let config = DatabaseConfig {
path: tmp_dir.path().join("knowledge.cyl"),
wal_sync_mode: SyncMode::Normal,
..Default::default()
};
let mut db = CypherLite::open(config).expect("failed to open database");
println!("=== CypherLite Knowledge Graph Example ===\n");
println!("1. Building knowledge graph...\n");
db.execute(
"CREATE (r:AI {name: 'RAG', importance: 9})\
-[:USES]->\
(kg:AI {name: 'Knowledge Graph', importance: 9})\
-[:IS_A]->\
(gdb:DB {name: 'Graph Database', importance: 9})",
)
.expect("create RAG chain");
db.execute(
"CREATE (gdb:DB {name: 'Property Graph', importance: 8})\
-[:USES]->\
(idx:DS {name: 'Index', importance: 7})\
-[:IMPLEMENTED_BY]->\
(bt:DS {name: 'B-Tree', importance: 6})",
)
.expect("create storage chain");
db.execute(
"CREATE (cy:QL {name: 'Cypher', importance: 8})\
-[:USES]->\
(pm:QL {name: 'Pattern Matching', importance: 7})",
)
.expect("create cypher chain");
db.execute(
"CREATE (tr:Algo {name: 'Traversal', importance: 8})\
-[:INCLUDES]->\
(bfs:Algo {name: 'BFS', importance: 6})",
)
.expect("create traversal-bfs chain");
db.execute(
"CREATE (tr:Algo {name: 'Traversal2', importance: 8})\
-[:INCLUDES]->\
(dfs:Algo {name: 'DFS', importance: 6})",
)
.expect("create traversal-dfs chain");
db.execute("CREATE (a:Researcher {name: 'Alice', field: 'AI'})")
.expect("create Alice");
db.execute("CREATE (b:Engineer {name: 'Bob', field: 'databases'})")
.expect("create Bob");
println!(" Created concept nodes (AI, DB, DS, QL, Algo labels)");
println!(" Created relationship chains between concepts");
println!(" Created Researcher and Engineer nodes\n");
println!("2. What does Cypher use? (single-hop traversal)");
let result = db
.execute("MATCH (c:QL {name: 'Cypher'})-[:USES]->(target) RETURN target.name")
.expect("cypher uses query");
for row in &result.rows {
let name: String = row.get_as("target.name").unwrap_or_default();
println!(" Cypher -> {name}");
}
println!();
println!("3. Variable-length paths: All concepts reachable from 'RAG' (1..3 hops)");
let result = db
.execute("MATCH (start:AI {name: 'RAG'})-[*1..3]->(related) RETURN related.name")
.expect("var-length traversal");
for row in &result.rows {
let name: String = row.get_as("related.name").unwrap_or_default();
println!(" -> {name}");
}
println!();
println!("4. High-importance DB concepts (importance >= 8):");
let result = db
.execute("MATCH (c:DB) WHERE c.importance >= 8 RETURN c.name, c.importance")
.expect("filtered query");
for row in &result.rows {
let name: String = row.get_as("c.name").unwrap_or_default();
let imp: i64 = row.get_as("c.importance").unwrap_or_default();
println!(" {name} (importance: {imp})");
}
println!();
println!("5. Count of AI concepts:");
let result = db
.execute("MATCH (c:AI) WITH count(c) AS cnt RETURN cnt")
.expect("count AI");
for row in &result.rows {
let cnt: i64 = row.get_as("cnt").unwrap_or_default();
println!(" AI concepts: {cnt}");
}
let result = db
.execute("MATCH (c:Algo) WITH count(c) AS cnt RETURN cnt")
.expect("count Algo");
for row in &result.rows {
let cnt: i64 = row.get_as("cnt").unwrap_or_default();
println!(" Algo concepts: {cnt}");
}
println!();
println!("6. Creating index on :AI(name) for fast lookups...");
db.execute("CREATE INDEX idx_ai_name ON :AI(name)")
.expect("create index");
let result = db
.execute("MATCH (c:AI {name: 'RAG'}) RETURN c.name, c.importance")
.expect("indexed lookup");
for row in &result.rows {
let name: String = row.get_as("c.name").unwrap_or_default();
let imp: i64 = row.get_as("c.importance").unwrap_or_default();
println!(" Found via index: {name} (importance: {imp})");
}
println!();
println!("7. Traversal: Knowledge Graph -[:IS_A]-> Graph Database");
let result = db
.execute("MATCH (kg:AI {name: 'Knowledge Graph'})-[:IS_A]->(target:DB) RETURN target.name")
.expect("is_a traversal");
for row in &result.rows {
let name: String = row.get_as("target.name").unwrap_or_default();
println!(" Knowledge Graph IS_A {name}");
}
println!();
println!("8. Researchers (OPTIONAL MATCH for outgoing edges):");
let result = db
.execute("MATCH (r:Researcher) RETURN r.name, r.field")
.expect("researchers");
for row in &result.rows {
let name: String = row.get_as("r.name").unwrap_or_default();
let field: String = row.get_as("r.field").unwrap_or_default();
println!(" {name} - field: {field}");
}
let result = db
.execute("MATCH (e:Engineer) RETURN e.name, e.field")
.expect("engineers");
for row in &result.rows {
let name: String = row.get_as("e.name").unwrap_or_default();
let field: String = row.get_as("e.field").unwrap_or_default();
println!(" {name} - field: {field}");
}
println!();
println!("=== Done! Knowledge graph cleaned up automatically. ===");
}