queries.rs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. use chrono::{DateTime, Utc};
  2. use get_routes::handler;
  3. use heed3::RoTxn;
  4. use helix_db::helix_engine::vector_core::vector::HVector;
  5. use helix_db::{
  6. exclude_field, field_remapping, identifier_remapping, traversal_remapping, value_remapping,
  7. };
  8. use helix_db::{
  9. helix_engine::graph_core::ops::{
  10. bm25::search_bm25::SearchBM25Adapter,
  11. g::G,
  12. in_::{in_::InAdapter, in_e::InEdgesAdapter, to_n::ToNAdapter, to_v::ToVAdapter},
  13. out::{
  14. from_n::FromNAdapter, from_v::FromVAdapter, out::OutAdapter, out_e::OutEdgesAdapter,
  15. },
  16. source::{
  17. add_e::{AddEAdapter, EdgeType},
  18. add_n::AddNAdapter,
  19. e_from_id::EFromIdAdapter,
  20. e_from_type::EFromTypeAdapter,
  21. n_from_id::NFromIdAdapter,
  22. n_from_index::NFromIndexAdapter,
  23. n_from_type::NFromTypeAdapter,
  24. },
  25. tr_val::{Traversable, TraversalVal},
  26. util::{
  27. dedup::DedupAdapter, drop::Drop, filter_mut::FilterMut, filter_ref::FilterRefAdapter,
  28. map::MapAdapter, paths::ShortestPathAdapter, props::PropsAdapter, range::RangeAdapter,
  29. update::UpdateAdapter,
  30. },
  31. vectors::{
  32. brute_force_search::BruteForceSearchVAdapter, insert::InsertVAdapter,
  33. search::SearchVAdapter,
  34. },
  35. },
  36. helix_engine::types::GraphError,
  37. helix_gateway::router::router::HandlerInput,
  38. node_matches, props,
  39. protocol::count::Count,
  40. protocol::remapping::{RemappingMap, ResponseRemapping},
  41. protocol::response::Response,
  42. protocol::{
  43. filterable::Filterable, id::ID, remapping::Remapping, return_values::ReturnValue,
  44. value::Value,
  45. },
  46. };
  47. use sonic_rs::{Deserialize, Serialize};
  48. use std::cell::RefCell;
  49. use std::collections::{HashMap, HashSet};
  50. use std::sync::Arc;
  51. use std::time::Instant;
  52. pub struct User {
  53. pub name: String,
  54. }
  55. pub struct EmbeddingOf {
  56. pub from: User,
  57. pub to: Embedding,
  58. pub category: String,
  59. }
  60. pub struct Embedding {
  61. pub content: String,
  62. }
  63. #[derive(Serialize, Deserialize)]
  64. pub struct to_vInput {
  65. pub query: Vec<f64>,
  66. pub k: i32,
  67. pub data: String,
  68. }
  69. #[handler]
  70. pub fn to_v(input: &HandlerInput, response: &mut Response) -> Result<(), GraphError> {
  71. let data: to_vInput = match sonic_rs::from_slice(&input.request.body) {
  72. Ok(data) => data,
  73. Err(err) => return Err(GraphError::from(err)),
  74. };
  75. let mut remapping_vals = RemappingMap::new();
  76. let db = Arc::clone(&input.graph.storage);
  77. let txn = db.graph_env.read_txn().unwrap();
  78. let user = G::new(Arc::clone(&db), &txn)
  79. .n_from_index("name", &"John Doe")
  80. .collect_to::<Vec<_>>();
  81. let mut return_vals: HashMap<String, ReturnValue> = HashMap::new();
  82. return_vals.insert(
  83. "user".to_string(),
  84. ReturnValue::from_traversal_value_array_with_mixin(
  85. user.clone(),
  86. remapping_vals.borrow_mut(),
  87. ),
  88. );
  89. txn.commit().unwrap();
  90. response.body = sonic_rs::to_vec(&return_vals).unwrap();
  91. Ok(())
  92. }
  93. #[derive(Serialize, Deserialize)]
  94. pub struct addInput {
  95. pub vec: Vec<f64>,
  96. }
  97. #[handler]
  98. pub fn add(input: &HandlerInput, response: &mut Response) -> Result<(), GraphError> {
  99. let data: addInput = match sonic_rs::from_slice(&input.request.body) {
  100. Ok(data) => data,
  101. Err(err) => return Err(GraphError::from(err)),
  102. };
  103. let mut remapping_vals = RemappingMap::new();
  104. let db = Arc::clone(&input.graph.storage);
  105. let mut txn = db.graph_env.write_txn().unwrap();
  106. let user = G::new_mut(Arc::clone(&db), &mut txn)
  107. .add_n(
  108. "User",
  109. Some(props! { "name" => "John Doe" }),
  110. Some(&["name"]),
  111. )
  112. .collect_to::<Vec<_>>();
  113. let embedding = G::new_mut(Arc::clone(&db), &mut txn)
  114. .insert_v::<fn(&HVector, &RoTxn) -> bool>(
  115. &data.vec,
  116. "Embedding",
  117. Some(props! { "content" => "Hello, world!" }),
  118. )
  119. .collect_to::<Vec<_>>();
  120. G::new_mut(Arc::clone(&db), &mut txn)
  121. .add_e(
  122. "EmbeddingOf",
  123. Some(props! { "category" => "test" }),
  124. user.id(),
  125. embedding.id(),
  126. true,
  127. EdgeType::Node,
  128. )
  129. .collect_to::<Vec<_>>();
  130. let mut return_vals: HashMap<String, ReturnValue> = HashMap::new();
  131. return_vals.insert(
  132. "user".to_string(),
  133. ReturnValue::from_traversal_value_array_with_mixin(
  134. user.clone(),
  135. remapping_vals.borrow_mut(),
  136. ),
  137. );
  138. txn.commit().unwrap();
  139. response.body = sonic_rs::to_vec(&return_vals).unwrap();
  140. Ok(())
  141. }