use text_to_cypher::{ChatMessage, ChatRequest, ChatRole, TextToCypherClient, core};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
#[cfg(feature = "server")]
tracing_subscriber::fmt().with_max_level(tracing::Level::INFO).init();
println!("=== Text-to-Cypher Library Usage Examples ===\n");
let api_key = std::env::var("OPENAI_API_KEY")
.or_else(|_| std::env::var("ANTHROPIC_API_KEY"))
.or_else(|_| std::env::var("GEMINI_API_KEY"))
.expect("Please set OPENAI_API_KEY, ANTHROPIC_API_KEY, or GEMINI_API_KEY environment variable");
let model = "gpt-4o-mini"; let falkordb_connection = "falkor://127.0.0.1:6379";
let graph_name = "demo_graph";
println!("Example 1: Using TextToCypherClient");
println!("=====================================");
example_with_client(&api_key, model, falkordb_connection, graph_name).await?;
println!("\nExample 2: Using Core Functions Directly");
println!("=========================================");
example_with_core_functions(&api_key, model, falkordb_connection, graph_name).await?;
println!("\nExample 3: Generate Cypher Only");
println!("================================");
example_cypher_only(&api_key, model, falkordb_connection, graph_name).await?;
println!("\n=== All examples completed successfully! ===");
Ok(())
}
async fn example_with_client(
api_key: &str,
model: &str,
falkordb_connection: &str,
graph_name: &str,
) -> Result<(), Box<dyn std::error::Error>> {
let client = TextToCypherClient::new(model, api_key, falkordb_connection);
println!("Discovering graph schema...");
match client.discover_schema(graph_name).await {
Ok(schema) => {
println!("Schema discovered: {schema}");
}
Err(e) => {
println!("Note: Schema discovery failed (graph may not exist yet): {e}");
println!("This is okay - continuing with examples...");
}
}
let request = ChatRequest {
messages: vec![ChatMessage {
role: ChatRole::User,
content: "Create a simple example with 3 people nodes named Alice, Bob, and Charlie".to_string(),
}],
};
println!("\nProcessing question: {:?}", request.messages[0].content);
match client.text_to_cypher(graph_name, request).await {
Ok(response) => {
println!("✓ Success!");
if let Some(query) = &response.cypher_query {
println!(" Generated Query: {query}");
}
if let Some(result) = &response.cypher_result {
println!(" Query Result: {result}");
}
if let Some(answer) = &response.answer {
println!(" AI Answer: {answer}");
}
}
Err(e) => {
println!("✗ Error: {e}");
}
}
Ok(())
}
async fn example_with_core_functions(
api_key: &str,
model: &str,
falkordb_connection: &str,
graph_name: &str,
) -> Result<(), Box<dyn std::error::Error>> {
println!("Step 1: Creating GenAI client...");
let genai_client = core::create_genai_client(Some(api_key));
println!("Step 2: Discovering graph schema...");
let schema = match core::discover_graph_schema(falkordb_connection, graph_name).await {
Ok(s) => {
println!(" ✓ Schema discovered");
s
}
Err(e) => {
println!(" Note: Using empty schema (graph may not exist): {e}");
"{}".to_string()
}
};
println!("Step 3: Generating Cypher query...");
let chat_request = ChatRequest {
messages: vec![ChatMessage {
role: ChatRole::User,
content: "Find all people nodes".to_string(),
}],
};
match core::generate_cypher_query(&chat_request, &schema, &genai_client, model).await {
Ok(query) => {
println!(" ✓ Query generated: {query}");
println!("Step 4: Executing query...");
match core::execute_cypher_query(&query, graph_name, falkordb_connection, true).await {
Ok(result) => {
println!(" ✓ Query executed successfully");
println!(" Result: {result}");
println!("Step 5: Generating natural language answer...");
match core::generate_final_answer(&chat_request, &query, &result, &genai_client, model).await {
Ok(answer) => {
println!(" ✓ Answer generated: {answer}");
}
Err(e) => {
println!(" ✗ Failed to generate answer: {e}");
}
}
}
Err(e) => {
println!(" ✗ Query execution failed: {e}");
}
}
}
Err(e) => {
println!(" ✗ Query generation failed: {e}");
}
}
Ok(())
}
async fn example_cypher_only(
api_key: &str,
model: &str,
falkordb_connection: &str,
graph_name: &str,
) -> Result<(), Box<dyn std::error::Error>> {
let client = TextToCypherClient::new(model, api_key, falkordb_connection);
let request = ChatRequest {
messages: vec![ChatMessage {
role: ChatRole::User,
content: "Find all people who have more than 5 friends".to_string(),
}],
};
println!("Generating Cypher query for: {:?}", request.messages[0].content);
match client.cypher_only(graph_name, request).await {
Ok(response) => {
println!("✓ Query generated successfully!");
if let Some(query) = &response.cypher_query {
println!(" Generated Query: {query}");
println!("\n You can now:");
println!(" 1. Review the query for correctness");
println!(" 2. Execute it manually");
println!(" 3. Modify it as needed");
}
}
Err(e) => {
println!("✗ Error: {e}");
}
}
Ok(())
}