Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 17 additions & 1 deletion graphiti_core/utils/maintenance/edge_operations.py
Original file line number Diff line number Diff line change
Expand Up @@ -273,12 +273,28 @@ async def resolve_extracted_edges(
embedder = clients.embedder
await create_entity_edge_embeddings(embedder, extracted_edges)

valid_edges_list: list[list[EntityEdge]] = await semaphore_gather(
forward_edges_list: list[list[EntityEdge]] = await semaphore_gather(
*[
EntityEdge.get_between_nodes(driver, edge.source_node_uuid, edge.target_node_uuid)
for edge in extracted_edges
]
)
inverse_edges_list: list[list[EntityEdge]] = await semaphore_gather(
*[
EntityEdge.get_between_nodes(driver, edge.target_node_uuid, edge.source_node_uuid)
for edge in extracted_edges
]
)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The two semaphore_gather calls are sequential, but forward_edges_list and inverse_edges_list don't depend on each other. Consider combining them into a single parallel call to reduce latency:

Suggested change
forward_edges_list: list[list[EntityEdge]] = await semaphore_gather(
*[
EntityEdge.get_between_nodes(driver, edge.source_node_uuid, edge.target_node_uuid)
for edge in extracted_edges
]
)
inverse_edges_list: list[list[EntityEdge]] = await semaphore_gather(
*[
EntityEdge.get_between_nodes(driver, edge.target_node_uuid, edge.source_node_uuid)
for edge in extracted_edges
]
)
all_edge_queries = [
EntityEdge.get_between_nodes(driver, edge.source_node_uuid, edge.target_node_uuid)
for edge in extracted_edges
] + [
EntityEdge.get_between_nodes(driver, edge.target_node_uuid, edge.source_node_uuid)
for edge in extracted_edges
]
all_results: list[list[EntityEdge]] = await semaphore_gather(*all_edge_queries)
n = len(extracted_edges)
forward_edges_list = all_results[:n]
inverse_edges_list = all_results[n:]


valid_edges_list: list[list[EntityEdge]] = []
for forward_edges, inverse_edges in zip(forward_edges_list, inverse_edges_list, strict=True):
seen_uuids: set[str] = set()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The variable seen_uuids shadows the seen dict used earlier in the function (line 256). While not a bug due to scope, consider using a more descriptive name like combined_edge_uuids to avoid confusion during code review.

combined: list[EntityEdge] = []
for edge in [*forward_edges, *inverse_edges]:
if edge.uuid not in seen_uuids:
seen_uuids.add(edge.uuid)
combined.append(edge)
valid_edges_list.append(combined)

related_edges_results: list[SearchResults] = await semaphore_gather(
*[
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
[project]
name = "graphiti-core"
description = "A temporal graph building library"
version = "0.28.1"
version = "0.29.0"
authors = [
{ name = "Paul Paliychuk", email = "paul@getzep.com" },
{ name = "Preston Rasmussen", email = "preston@getzep.com" },
Expand Down
Loading