Merge commit 'd803bfe2b1fe7f5e219e50ac20d6801a0a58ac75' as 'vendor/ruvector'
This commit is contained in:
161
vendor/ruvector/examples/graph/hybrid_search.rs
vendored
Normal file
161
vendor/ruvector/examples/graph/hybrid_search.rs
vendored
Normal file
@@ -0,0 +1,161 @@
|
||||
//! Hybrid Vector-Graph Search Example
|
||||
//!
|
||||
//! This example demonstrates combining vector similarity search
|
||||
//! with graph traversal for powerful hybrid queries:
|
||||
//! - Vector embeddings on graph nodes
|
||||
//! - Semantic similarity search
|
||||
//! - Graph-constrained vector search
|
||||
//! - Ranking by combined scores
|
||||
|
||||
fn main() {
|
||||
println!("=== RuVector Graph - Hybrid Search ===\n");
|
||||
|
||||
// TODO: Once the graph and vector APIs are integrated, implement:
|
||||
|
||||
println!("1. Initialize Hybrid Database");
|
||||
// let db = GraphDatabase::open("./data/hybrid_db.db")?;
|
||||
// let vector_store = db.enable_vector_index("embeddings", 768)?;
|
||||
|
||||
println!(" ✓ Created graph database with vector indexing");
|
||||
|
||||
println!("\n2. Create Nodes with Vector Embeddings");
|
||||
// Create documents with text embeddings
|
||||
// let doc1 = db.create_node()
|
||||
// .label("Document")
|
||||
// .property("title", "Introduction to Rust")
|
||||
// .property("content", "Rust is a systems programming language...")
|
||||
// .embedding(embedding_model.encode("Introduction to Rust..."))
|
||||
// .execute()?;
|
||||
|
||||
// let doc2 = db.create_node()
|
||||
// .label("Document")
|
||||
// .property("title", "Advanced Rust Patterns")
|
||||
// .property("content", "This article covers advanced patterns...")
|
||||
// .embedding(embedding_model.encode("Advanced Rust Patterns..."))
|
||||
// .execute()?;
|
||||
|
||||
println!(" ✓ Created documents with vector embeddings");
|
||||
|
||||
println!("\n3. Create Relationships");
|
||||
// Create citation relationships
|
||||
// db.create_relationship()
|
||||
// .from(doc2)
|
||||
// .to(doc1)
|
||||
// .type("CITES")
|
||||
// .execute()?;
|
||||
|
||||
println!(" ✓ Created citation relationships");
|
||||
|
||||
println!("\n4. Semantic Search (Vector Only)");
|
||||
// let query = "memory safety in programming";
|
||||
// let query_embedding = embedding_model.encode(query);
|
||||
|
||||
// let results = db.vector_search()
|
||||
// .index("embeddings")
|
||||
// .query(query_embedding)
|
||||
// .top_k(5)
|
||||
// .execute()?;
|
||||
|
||||
// println!(" Query: '{}'", query);
|
||||
// for (doc, score) in results {
|
||||
// println!(" - {} (score: {:.4})", doc.property("title"), score);
|
||||
// }
|
||||
|
||||
println!("\n5. Graph-Constrained Vector Search");
|
||||
// Find similar documents that are cited by "Advanced Rust Patterns"
|
||||
// let results = db.hybrid_query()
|
||||
// .cypher(r#"
|
||||
// MATCH (source:Document {title: 'Advanced Rust Patterns'})-[:CITES]->(cited:Document)
|
||||
// RETURN cited
|
||||
// "#)
|
||||
// .vector_similarity(query_embedding, 0.7) // minimum similarity threshold
|
||||
// .execute()?;
|
||||
|
||||
// println!(" Cited documents similar to query:");
|
||||
// for doc in results {
|
||||
// println!(" - {}", doc.property("title"));
|
||||
// }
|
||||
|
||||
println!("\n6. Ranked Hybrid Search");
|
||||
// Combine vector similarity and graph metrics
|
||||
// let results = db.hybrid_query()
|
||||
// .vector_search(query_embedding)
|
||||
// .graph_metric("pagerank")
|
||||
// .combine_scores(|vector_score, graph_score| {
|
||||
// 0.7 * vector_score + 0.3 * graph_score
|
||||
// })
|
||||
// .top_k(10)
|
||||
// .execute()?;
|
||||
|
||||
// println!(" Top results (vector + graph ranking):");
|
||||
// for (doc, combined_score, details) in results {
|
||||
// println!(" - {} (score: {:.4}, vector: {:.4}, graph: {:.4})",
|
||||
// doc.property("title"),
|
||||
// combined_score,
|
||||
// details.vector_score,
|
||||
// details.graph_score
|
||||
// );
|
||||
// }
|
||||
|
||||
println!("\n7. Multi-Hop Vector Search");
|
||||
// Find documents connected through multiple hops, ranked by similarity
|
||||
// let results = db.hybrid_query()
|
||||
// .cypher(r#"
|
||||
// MATCH path = (start:Document {title: 'Introduction to Rust'})
|
||||
// -[:CITES|:RELATED_TO*1..3]->
|
||||
// (end:Document)
|
||||
// RETURN end, length(path) as distance
|
||||
// "#)
|
||||
// .vector_similarity(query_embedding, 0.6)
|
||||
// .penalty_per_hop(0.1) // Reduce score for each hop
|
||||
// .execute()?;
|
||||
|
||||
// println!(" Multi-hop search results:");
|
||||
// for (doc, score, distance) in results {
|
||||
// println!(" - {} (score: {:.4}, hops: {})",
|
||||
// doc.property("title"), score, distance
|
||||
// );
|
||||
// }
|
||||
|
||||
println!("\n8. Filtered Vector Search with Graph Constraints");
|
||||
// Complex hybrid query with multiple constraints
|
||||
// let results = db.hybrid_query()
|
||||
// .cypher(r#"
|
||||
// MATCH (doc:Document)-[:AUTHORED_BY]->(author:Person)
|
||||
// WHERE author.institution = 'MIT'
|
||||
// AND doc.year >= 2020
|
||||
// RETURN doc
|
||||
// "#)
|
||||
// .vector_search(query_embedding)
|
||||
// .top_k(5)
|
||||
// .execute()?;
|
||||
|
||||
// println!(" MIT papers since 2020 similar to query:");
|
||||
// for (doc, score) in results {
|
||||
// println!(" - {} (score: {:.4})", doc.property("title"), score);
|
||||
// }
|
||||
|
||||
println!("\n9. Performance Comparison");
|
||||
// Compare pure vector vs hybrid search
|
||||
// let start = std::time::Instant::now();
|
||||
// let vector_results = db.vector_search()
|
||||
// .query(query_embedding)
|
||||
// .top_k(100)
|
||||
// .execute()?;
|
||||
// let vector_time = start.elapsed();
|
||||
|
||||
// let start = std::time::Instant::now();
|
||||
// let hybrid_results = db.hybrid_query()
|
||||
// .vector_search(query_embedding)
|
||||
// .graph_filter(/* some constraint */)
|
||||
// .top_k(100)
|
||||
// .execute()?;
|
||||
// let hybrid_time = start.elapsed();
|
||||
|
||||
// println!(" Vector-only: {:?}", vector_time);
|
||||
// println!(" Hybrid: {:?}", hybrid_time);
|
||||
// println!(" Overhead: {:.2}%", (hybrid_time.as_secs_f64() / vector_time.as_secs_f64() - 1.0) * 100.0);
|
||||
|
||||
println!("\n=== Example Complete ===");
|
||||
println!("\nNote: This is a template. Actual implementation pending graph API exposure.");
|
||||
}
|
||||
Reference in New Issue
Block a user