33Created Date: Monday January 12th 2026
44Author: Christian Nonis <alch.infoemail@gmail.com>
55-----
6- Last Modified: Thursday January 29th 2026 8:43:59 pm
6+ Last Modified: Monday February 2nd 2026 10:04:06 pm
77Modified By: Christian Nonis <alch.infoemail@gmail.com>
88-----
99"""
1010
11- from typing import Dict , List , Literal , Tuple
11+ from typing import Dict , List , Literal , Optional , Tuple
1212import numpy as np
1313
1414from src .adapters .interfaces .graph import PredicateWithFlowKey
@@ -70,15 +70,22 @@ def retrieve_sibilings(
7070 - connections (List[EntitySynergy]): a list of EntitySynergy entries representing related entities; may be empty.
7171 """
7272
73+ _embedding_cache : Dict [Tuple [str , str ], Optional [np .ndarray ]] = {}
74+
7375 def _get_first_embedding (ids : List [str ], store : str ):
74- _embeddings = vector_store_adapter .get_by_ids (
75- ids ,
76- store = store ,
77- brain_id = self .brain_id ,
78- )
79- if not _embeddings :
76+ if not ids :
8077 return None
81- return _embeddings [0 ].embeddings
78+ key = (ids [0 ], store )
79+ if key not in _embedding_cache :
80+ _embeddings = vector_store_adapter .get_by_ids (
81+ ids ,
82+ store = store ,
83+ brain_id = self .brain_id ,
84+ )
85+ _embedding_cache [key ] = (
86+ _embeddings [0 ].embeddings if _embeddings else None
87+ )
88+ return _embedding_cache [key ]
8289
8390 def _association_score (tn_score , rel_score , multiplier ):
8491 return (
@@ -95,6 +102,11 @@ def _upsert_connection(seed_node: Node, neighbor_node: Node, score: float):
95102 association_score = score ,
96103 )
97104 else :
105+ if seed_node .uuid in (
106+ n .uuid
107+ for n in positivep_connections [neighbor_node .uuid ].connected_by
108+ ):
109+ return
98110 pas = positivep_connections [neighbor_node .uuid ].association_score
99111 nas = score
100112 n_association_score = wmean ([pas , nas ], FACTORS_INCREMENTAL_WEIGHT )
@@ -128,17 +140,30 @@ def _collect_seed_nodes_for_neighbor(neighbor):
128140 ],
129141 brain_id = self .brain_id ,
130142 )
131- collected_embeddings = []
143+ rel_v_ids = []
144+ next_tuples = []
132145 for t in next_rels [neighbor [0 ].uuid ]:
133146 if target_node .uuid in [t [2 ].uuid , t [0 ].uuid ]:
134147 continue
135148 v_id = t [1 ].properties .get ("v_id" )
136149 if not v_id :
137150 continue
138- target_embedding_for_edge = _get_first_embedding (
139- [v_id ],
151+ rel_v_ids .append (v_id )
152+ next_tuples .append ((v_id , t ))
153+ rel_embeddings_map = {}
154+ if rel_v_ids :
155+ rel_vectors = vector_store_adapter .get_by_ids (
156+ rel_v_ids ,
140157 store = "relationships" ,
158+ brain_id = self .brain_id ,
141159 )
160+ for vid , v in zip (rel_v_ids , rel_vectors ):
161+ if v .embeddings is not None :
162+ _embedding_cache [(vid , "relationships" )] = v .embeddings
163+ rel_embeddings_map [vid ] = v .embeddings
164+ collected_embeddings = []
165+ for v_id , t in next_tuples :
166+ target_embedding_for_edge = rel_embeddings_map .get (v_id )
142167 if not target_embedding_for_edge :
143168 continue
144169 collected_embeddings .append (target_embedding_for_edge )
@@ -186,6 +211,48 @@ def _process_seed(seed_node: Node, direct: bool, target_embeddings):
186211 brain_id = self .brain_id ,
187212 )
188213
214+ rel_ids_to_fetch = []
215+ node_ids_to_fetch = []
216+ for edge_uuid , n in _neighbors_event .items ():
217+ for e in n :
218+ if e [2 ].uuid != target_node .uuid and set (e [2 ].labels ).intersection (
219+ target_node .labels
220+ ):
221+ edge_vid = edges_map [edge_uuid ].properties .get ("v_id" )
222+ if edge_vid :
223+ rel_ids_to_fetch .append (edge_vid )
224+ en_vid = e [1 ].properties .get ("v_id" )
225+ if en_vid :
226+ rel_ids_to_fetch .append (en_vid )
227+ neighbor_node_vid = e [2 ].properties .get ("v_id" )
228+ if neighbor_node_vid :
229+ node_ids_to_fetch .append (neighbor_node_vid )
230+ for dn in _neighbors_direct [seed_node .uuid ]:
231+ if dn [1 ].uuid != target_node .uuid :
232+ n_vid = dn [0 ].properties .get ("v_id" )
233+ if n_vid :
234+ rel_ids_to_fetch .append (n_vid )
235+ unique_rel_ids = list (dict .fromkeys (rel_ids_to_fetch ))
236+ if unique_rel_ids :
237+ rel_vectors = vector_store_adapter .get_by_ids (
238+ unique_rel_ids ,
239+ store = "relationships" ,
240+ brain_id = self .brain_id ,
241+ )
242+ for vid , v in zip (unique_rel_ids , rel_vectors ):
243+ if v .embeddings is not None :
244+ _embedding_cache [(vid , "relationships" )] = v .embeddings
245+ unique_node_ids = list (dict .fromkeys (node_ids_to_fetch ))
246+ if unique_node_ids :
247+ node_vectors = vector_store_adapter .get_by_ids (
248+ unique_node_ids ,
249+ store = "nodes" ,
250+ brain_id = self .brain_id ,
251+ )
252+ for vid , v in zip (unique_node_ids , node_vectors ):
253+ if v .embeddings is not None :
254+ _embedding_cache [(vid , "nodes" )] = v .embeddings
255+
189256 _neighbors = []
190257 for edge_uuid , n in _neighbors_event .items ():
191258 for e in n :
@@ -234,9 +301,6 @@ def _process_seed(seed_node: Node, direct: bool, target_embeddings):
234301 found_embeddings ,
235302 target_embeddings ,
236303 )
237- print (
238- f"[{ seed_node .name } ] -> { tn_score } { rel_score } "
239- )
240304 _neighbors .append (
241305 (
242306 _association_score (
0 commit comments