pub mod cypher_extensions;
pub mod graph_neural;
pub mod rag_integration;
pub mod semantic_search;
pub mod vector_index;
pub use cypher_extensions::{SimilarityPredicate, VectorCypherExecutor, VectorCypherParser};
pub use graph_neural::{
GnnConfig, GraphEmbedding, GraphNeuralEngine, LinkPrediction, NodeClassification,
};
pub use rag_integration::{Context, Evidence, RagConfig, RagEngine, ReasoningPath};
pub use semantic_search::{ClusterResult, SemanticPath, SemanticSearch, SemanticSearchConfig};
pub use vector_index::{EmbeddingConfig, HybridIndex, VectorIndexType};
use crate::error::Result;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HybridQuery {
pub graph_pattern: String,
pub vector_constraint: Option<VectorConstraint>,
pub limit: usize,
pub min_score: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VectorConstraint {
pub query_vector: Vec<f32>,
pub embedding_property: String,
pub top_k: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HybridResult {
pub graph_match: serde_json::Value,
pub score: f32,
pub explanation: Option<String>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_hybrid_query_creation() {
let query = HybridQuery {
graph_pattern: "MATCH (n:Document) RETURN n".to_string(),
vector_constraint: None,
limit: 10,
min_score: 0.8,
};
assert_eq!(query.limit, 10);
}
}