From c22c6b72319849e4289c6e3dccf0b52b18bfbc0d Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Sat, 8 Nov 2025 09:53:44 +0800 Subject: [PATCH] =?UTF-8?q?fix(api):=20=E4=BF=AE=E5=A4=8D=E8=AE=B0?= =?UTF-8?q?=E5=BF=86=E5=8F=AF=E8=A7=86=E5=8C=96=E4=B8=AD=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=9A=84=E8=BE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在从内存管理器和文件加载图数据时,由于遍历所有记忆(memory)并收集其关联的边(edge)时没有进行去重处理,导致同一条边如果被多个记忆引用,会在最终的图谱中重复出现,造成前端可视化混乱。 为了解决这个问题,引入了一个集合(set)或字典(dict)来跟踪已经处理过的边的ID。在遍历边的过程中,只有当边的ID未被记录时,才会将其添加到最终的边列表中。这样可以确保每条边在图谱数据中只出现一次,保证了可视化结果的准确性。 --- src/api/memory_visualizer_router.py | 34 +++++++++++++++++------------ 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/api/memory_visualizer_router.py b/src/api/memory_visualizer_router.py index b35c1c074..e80e8ec0e 100644 --- a/src/api/memory_visualizer_router.py +++ b/src/api/memory_visualizer_router.py @@ -102,16 +102,21 @@ def load_graph_data_from_file(file_path: Optional[Path] = None) -> Dict[str, Any if node.get("id") } - edges_list = [ - { - **edge, - "from": edge.get("source", edge.get("source_id")), - "to": edge.get("target", edge.get("target_id")), - "label": edge.get("relation", ""), - "arrows": "to", - } - for edge in edges - ] + edges_list = [] + seen_edge_ids = set() + for edge in edges: + edge_id = edge.get("id") + if edge_id and edge_id not in seen_edge_ids: + edges_list.append( + { + **edge, + "from": edge.get("source", edge.get("source_id")), + "to": edge.get("target", edge.get("target_id")), + "label": edge.get("relation", ""), + "arrows": "to", + } + ) + seen_edge_ids.add(edge_id) stats = metadata.get("statistics", {}) total_memories = stats.get("total_memories", 0) @@ -151,7 +156,7 @@ def _format_graph_data_from_manager(memory_manager) -> Dict[str, Any]: all_memories = memory_manager.graph_store.get_all_memories() nodes_dict = {} - edges_list = [] + edges_dict = {} memory_info = [] for memory in all_memories: @@ -173,8 +178,8 @@ def _format_graph_data_from_manager(memory_manager) -> Dict[str, Any]: "title": f"{node.node_type.value}: {node.content}", } for edge in memory.edges: - edges_list.append( # noqa: PERF401 - { + if edge.id not in edges_dict: + edges_dict[edge.id] = { "id": edge.id, "from": edge.source_id, "to": edge.target_id, @@ -182,7 +187,8 @@ def _format_graph_data_from_manager(memory_manager) -> Dict[str, Any]: "arrows": "to", "memory_id": memory.id, } - ) + + edges_list = list(edges_dict.values()) stats = memory_manager.get_statistics() return {