queries.rs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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 Entity {
  53. pub entity_name: String,
  54. }
  55. pub struct Relationship {
  56. pub from: Entity,
  57. pub to: Entity,
  58. pub edge_name: String,
  59. }
  60. #[derive(Serialize, Deserialize)]
  61. pub struct insert_entityInput {
  62. pub entity_name_in: String,
  63. }
  64. #[handler]
  65. pub fn insert_entity(input: &HandlerInput, response: &mut Response) -> Result<(), GraphError> {
  66. let data: insert_entityInput = match sonic_rs::from_slice(&input.request.body) {
  67. Ok(data) => data,
  68. Err(err) => return Err(GraphError::from(err)),
  69. };
  70. let mut remapping_vals = RemappingMap::new();
  71. let db = Arc::clone(&input.graph.storage);
  72. let mut txn = db.graph_env.write_txn().unwrap();
  73. let node = G::new_mut(Arc::clone(&db), &mut txn)
  74. .add_n(
  75. "Entity",
  76. Some(props! { "entity_name" => data.entity_name_in.clone() }),
  77. Some(&["entity_name"]),
  78. )
  79. .collect_to::<Vec<_>>();
  80. let mut return_vals: HashMap<String, ReturnValue> = HashMap::new();
  81. return_vals.insert(
  82. "node".to_string(),
  83. ReturnValue::from_traversal_value_array_with_mixin(
  84. node.clone(),
  85. remapping_vals.borrow_mut(),
  86. ),
  87. );
  88. txn.commit().unwrap();
  89. response.body = sonic_rs::to_vec(&return_vals).unwrap();
  90. Ok(())
  91. }
  92. #[derive(Serialize, Deserialize)]
  93. pub struct get_entityInput {
  94. pub entity_name_in: String,
  95. }
  96. #[handler]
  97. pub fn get_entity(input: &HandlerInput, response: &mut Response) -> Result<(), GraphError> {
  98. let data: get_entityInput = match sonic_rs::from_slice(&input.request.body) {
  99. Ok(data) => data,
  100. Err(err) => return Err(GraphError::from(err)),
  101. };
  102. let mut remapping_vals = RemappingMap::new();
  103. let db = Arc::clone(&input.graph.storage);
  104. let txn = db.graph_env.read_txn().unwrap();
  105. let node = G::new(Arc::clone(&db), &txn)
  106. .n_from_type("Entity")
  107. .filter_ref(|val, txn| {
  108. if let Ok(val) = val {
  109. Ok(G::new_from(Arc::clone(&db), &txn, val.clone())
  110. .check_property("entity_name")
  111. .map_value_or(false, |v| *v == data.entity_name_in)?)
  112. } else {
  113. Ok(false)
  114. }
  115. })
  116. .collect_to::<Vec<_>>();
  117. let mut return_vals: HashMap<String, ReturnValue> = HashMap::new();
  118. return_vals.insert(
  119. "node".to_string(),
  120. ReturnValue::from_traversal_value_array_with_mixin(
  121. node.clone(),
  122. remapping_vals.borrow_mut(),
  123. ),
  124. );
  125. txn.commit().unwrap();
  126. response.body = sonic_rs::to_vec(&return_vals).unwrap();
  127. Ok(())
  128. }
  129. #[derive(Serialize, Deserialize)]
  130. pub struct insert_relationshipInput {
  131. pub from_entity_label: String,
  132. pub to_entity_label: String,
  133. pub edge_name_in: String,
  134. }
  135. #[handler]
  136. pub fn insert_relationship(
  137. input: &HandlerInput,
  138. response: &mut Response,
  139. ) -> Result<(), GraphError> {
  140. let data: insert_relationshipInput = match sonic_rs::from_slice(&input.request.body) {
  141. Ok(data) => data,
  142. Err(err) => return Err(GraphError::from(err)),
  143. };
  144. let mut remapping_vals = RemappingMap::new();
  145. let db = Arc::clone(&input.graph.storage);
  146. let mut txn = db.graph_env.write_txn().unwrap();
  147. let from_entity = G::new(Arc::clone(&db), &txn)
  148. .n_from_index("entity_name", &data.from_entity_label)
  149. .collect_to::<Vec<_>>();
  150. let to_entity = G::new(Arc::clone(&db), &txn)
  151. .n_from_index("entity_name", &data.to_entity_label)
  152. .collect_to::<Vec<_>>();
  153. let e = G::new_mut(Arc::clone(&db), &mut txn)
  154. .add_e(
  155. "Relationship",
  156. Some(props! { "edge_name" => data.edge_name_in.clone() }),
  157. from_entity.id(),
  158. to_entity.id(),
  159. true,
  160. EdgeType::Node,
  161. )
  162. .collect_to::<Vec<_>>();
  163. let mut return_vals: HashMap<String, ReturnValue> = HashMap::new();
  164. return_vals.insert(
  165. "e".to_string(),
  166. ReturnValue::from_traversal_value_array_with_mixin(e.clone(), remapping_vals.borrow_mut()),
  167. );
  168. txn.commit().unwrap();
  169. response.body = sonic_rs::to_vec(&return_vals).unwrap();
  170. Ok(())
  171. }