Skip to content

Commit 3bdfc93

Browse files
Merge pull request #11 from Lumen-Labs/development
Development
2 parents e1ca99b + b0d429c commit 3bdfc93

File tree

4 files changed

+82
-18
lines changed

4 files changed

+82
-18
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<p align="center">
2-
<img src="https://img.shields.io/badge/version-2.4.2--dev-blue?style=for-the-badge" alt="Version"/>
2+
<img src="https://img.shields.io/badge/version-2.4.4--dev-blue?style=for-the-badge" alt="Version"/>
33
<img src="https://img.shields.io/badge/python-3.11+-green?style=for-the-badge&logo=python&logoColor=white" alt="Python"/>
44
<img src="https://img.shields.io/badge/license-AGPLv3%20%2B%20Commons%20Clause-purple?style=for-the-badge" alt="License"/>
55
</p>

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "brainapi2"
3-
version = "2.4.2-dev"
3+
version = "2.4.4-dev"
44
description = "Version 2.x.x of the BrainAPI memory layer."
55
authors = [
66
{name = "Christian",email = "alch.infoemail@gmail.com"}

src/core/search/entity_sibilings.py

Lines changed: 79 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@
33
Created Date: Monday January 12th 2026
44
Author: 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
77
Modified 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
1212
import numpy as np
1313

1414
from 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(

src/services/api/constants/requests.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,5 +274,5 @@ class GetEntityStatusResponse(BaseModel):
274274
node: Node
275275
exists: bool
276276
has_relationships: bool
277-
relationships: List[Tuple[Relationship, Node]]
277+
relationships: List[Tuple[Predicate, Node]]
278278
observations: List[Observation]

0 commit comments

Comments
 (0)