#![allow(unused_imports, clippy::useless_vec)]
use oxirs_vec::{
embeddings::{EmbeddableContent, EmbeddingStrategy},
sparql_integration::{
SparqlVectorService, VectorServiceArg, VectorServiceConfig, VectorServiceResult,
},
Vector,
};
#[test]
fn test_vec_similar_function() {
let config = VectorServiceConfig::default();
let mut service = SparqlVectorService::new(config, EmbeddingStrategy::SentenceTransformer)
.expect("Failed to create vector service");
let content1 =
EmbeddableContent::Text("Machine learning and artificial intelligence".to_string());
let content2 = EmbeddableContent::Text("Deep learning neural networks".to_string());
let content3 = EmbeddableContent::Text("Natural language processing".to_string());
let content4 = EmbeddableContent::Text("Computer vision and image recognition".to_string());
service
.add_resource_embedding("http://example.org/ml1", &content1)
.unwrap();
service
.add_resource_embedding("http://example.org/ml2", &content2)
.unwrap();
service
.add_resource_embedding("http://example.org/nlp", &content3)
.unwrap();
service
.add_resource_embedding("http://example.org/cv", &content4)
.unwrap();
let args = vec![
VectorServiceArg::IRI("http://example.org/ml1".to_string()),
VectorServiceArg::Number(3.0),
VectorServiceArg::Number(0.0),
];
let result = service.execute_function("similar", &args).unwrap();
match result {
VectorServiceResult::SimilarityList(results) => {
assert!(!results.is_empty());
assert!(results.len() <= 3); }
_ => panic!("Expected SimilarityList result"),
}
}
#[test]
fn test_vec_similarity_function() {
let config = VectorServiceConfig::default();
let mut service = SparqlVectorService::new(config, EmbeddingStrategy::SentenceTransformer)
.expect("Failed to create vector service");
let content1 = EmbeddableContent::Text("Machine learning algorithms".to_string());
let content2 = EmbeddableContent::Text("Machine learning techniques".to_string());
let content3 = EmbeddableContent::Text("Cooking recipes and food".to_string());
service
.add_resource_embedding("http://example.org/ml1", &content1)
.unwrap();
service
.add_resource_embedding("http://example.org/ml2", &content2)
.unwrap();
service
.add_resource_embedding("http://example.org/cooking", &content3)
.unwrap();
let args_similar = vec![
VectorServiceArg::IRI("http://example.org/ml1".to_string()),
VectorServiceArg::IRI("http://example.org/ml2".to_string()),
];
let result_similar = service
.execute_function("similarity", &args_similar)
.unwrap();
match result_similar {
VectorServiceResult::Number(similarity) => {
assert!(
(-1.0..=1.0).contains(&similarity),
"Similarity should be between -1 and 1, got: {similarity}"
);
}
_ => panic!("Expected Number result"),
}
let args_dissimilar = vec![
VectorServiceArg::IRI("http://example.org/ml1".to_string()),
VectorServiceArg::IRI("http://example.org/cooking".to_string()),
];
let result_dissimilar = service
.execute_function("similarity", &args_dissimilar)
.unwrap();
match result_dissimilar {
VectorServiceResult::Number(similarity) => {
assert!(
(-1.0..=1.0).contains(&similarity),
"Similarity should be between -1 and 1, got: {similarity}"
);
}
_ => panic!("Expected Number result"),
}
}
#[test]
fn test_vec_embed_text_function() {
let config = VectorServiceConfig::default();
let mut service = SparqlVectorService::new(config, EmbeddingStrategy::SentenceTransformer)
.expect("Failed to create vector service");
let args = vec![VectorServiceArg::String(
"This is a test document about vectors".to_string(),
)];
let result = service.execute_function("embed_text", &args).unwrap();
match result {
VectorServiceResult::Vector(vector) => {
assert!(vector.dimensions > 0);
let values = vector.as_f32();
assert!(!values.is_empty());
}
_ => panic!("Expected Vector result"),
}
}
#[test]
fn test_vec_search_text_function() {
let config = VectorServiceConfig::default();
let mut service = SparqlVectorService::new(config, EmbeddingStrategy::SentenceTransformer)
.expect("Failed to create vector service");
let docs = vec![
(
"http://example.org/doc1",
"Information retrieval and search engines",
),
("http://example.org/doc2", "Database management systems"),
(
"http://example.org/doc3",
"Search algorithms and data structures",
),
];
for (uri, text) in docs {
let content = EmbeddableContent::Text(text.to_string());
service.add_resource_embedding(uri, &content).unwrap();
}
let args = vec![
VectorServiceArg::String("search algorithms".to_string()),
VectorServiceArg::Number(2.0),
];
let result = service.execute_function("search_text", &args).unwrap();
match result {
VectorServiceResult::SimilarityList(results) => {
assert!(!results.is_empty());
assert!(results.len() <= 2); }
_ => panic!("Expected SimilarityList result"),
}
}
#[test]
fn test_vector_similarity_function() {
let config = VectorServiceConfig::default();
let mut service = SparqlVectorService::new(config, EmbeddingStrategy::SentenceTransformer)
.expect("Failed to create vector service");
let vec1 = Vector::new(vec![1.0, 0.0, 0.0]);
let vec2 = Vector::new(vec![0.0, 1.0, 0.0]);
let vec3 = Vector::new(vec![1.0, 0.0, 0.0]);
let args_orthogonal = vec![
VectorServiceArg::Vector(vec1.clone()),
VectorServiceArg::Vector(vec2.clone()),
];
let result_orthogonal = service
.execute_function("vector_similarity", &args_orthogonal)
.unwrap();
match result_orthogonal {
VectorServiceResult::Number(similarity) => {
assert!(
(similarity - 0.0).abs() < 0.001,
"Orthogonal vectors should have 0 similarity"
);
}
_ => panic!("Expected Number result"),
}
let args_identical = vec![
VectorServiceArg::Vector(vec1.clone()),
VectorServiceArg::Vector(vec3.clone()),
];
let result_identical = service
.execute_function("vector_similarity", &args_identical)
.unwrap();
match result_identical {
VectorServiceResult::Number(similarity) => {
assert!(
(similarity - 1.0).abs() < 0.001,
"Identical vectors should have 1.0 similarity"
);
}
_ => panic!("Expected Number result"),
}
}
#[test]
fn test_sparql_service_query_generation() {
use oxirs_vec::sparql_integration::VectorOperation;
let config = VectorServiceConfig::default();
let service = SparqlVectorService::new(config, EmbeddingStrategy::TfIdf)
.expect("Failed to create vector service");
let find_similar_op = VectorOperation::FindSimilar {
resource: "http://example.org/resource1".to_string(),
limit: Some(10),
threshold: Some(0.8),
};
let query = service.generate_service_query(&find_similar_op);
assert!(query.contains("vec:similar"));
assert!(query.contains("http://example.org/resource1"));
assert!(query.contains("LIMIT 10"));
let calc_similarity_op = VectorOperation::CalculateSimilarity {
resource1: "http://example.org/resource1".to_string(),
resource2: "http://example.org/resource2".to_string(),
};
let query = service.generate_service_query(&calc_similarity_op);
assert!(query.contains("vec:similarity"));
assert!(query.contains("http://example.org/resource1"));
assert!(query.contains("http://example.org/resource2"));
}