From 92bd3d9a47396d6c7227e04c3ee86f61ca133600 Mon Sep 17 00:00:00 2001 From: Lars Date: Sun, 28 Dec 2025 11:52:49 +0100 Subject: [PATCH] bug fix --- app/frontend/ui_graph_service.py | 48 +++++++++++++++++--------------- 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/app/frontend/ui_graph_service.py b/app/frontend/ui_graph_service.py index 061cca7..b62b572 100644 --- a/app/frontend/ui_graph_service.py +++ b/app/frontend/ui_graph_service.py @@ -271,9 +271,10 @@ class GraphExplorerService: ) # WICHTIG: Wir müssen genug Kanten laden, um alle "Titel#Abschnitt" Varianten zu finden # Verwende paginierte Suche, um sicherzustellen, dass wir alle Kanten durchsuchen + # OPTIMIERUNG: Lade alle Kanten in einem Durchgang (falls möglich) res_extended = [] next_offset = None - max_iterations = 20 # Maximal 20 Iterationen (20 * 5000 = 100000 Kanten) + max_iterations = 50 # Maximal 50 Iterationen (50 * 5000 = 250000 Kanten) iteration = 0 while iteration < max_iterations: batch, next_offset = self.client.scroll( @@ -311,32 +312,35 @@ class GraphExplorerService: # ZUSÄTZLICH: Fuzzy-Matching für ähnliche Titel # PROBLEM: Wikilinks können andere Titel verwenden als der gespeicherte Note-Titel # Beispiel: Note-Titel = "Persönliches Leitbild (2025–2029)", aber Wikilink = "Mein Persönliches Leitbild 2025" - # Strategie: Normalisiere beide Titel und prüfe, ob sie ähnlich sind + # STRATEGIE: Da target_id immer "Titel#Abschnitt" ist, nehmen wir einfach den Teil vor dem # + # und normalisieren beide (Note-Titel und target_id-Basis) für Vergleich if not any(tgt_id == t or tgt_id.startswith(t + "#") for t in note_titles_to_search): - # Normalisiere target_id (entferne #Abschnitt) + # Extrahiere Basis-Titel aus target_id (Teil vor dem #) tgt_base = tgt_id.split("#")[0].strip() - # Normalisiere jeden Titel und prüfe auf Ähnlichkeit + # Normalisierungs-Funktion: Entferne Klammern, Jahreszahlen, Präfixe + def normalize_title(t): + if not t: + return "" + # Entferne Klammern und deren Inhalt (z.B. "(2025–2029)") + t = re.sub(r'\s*\([^)]*\)', '', t) + # Entferne Jahreszahlen (4-stellig, mit oder ohne Bindestrich/En-Dash) + # Beispiele: "2025", "2025–2029", "2025-2029" + t = re.sub(r'\s*\d{4}[\s–\-]*\d{0,4}', '', t) + # Entferne "Mein/Meine" Präfixe + t = re.sub(r'^(Mein|Meine)\s+', '', t, flags=re.IGNORECASE) + # Normalisiere Whitespace + t = re.sub(r'\s+', ' ', t).strip() + return t.lower() # Case-insensitive Vergleich + + # Normalisiere target_id-Basis + tgt_norm = normalize_title(tgt_base) + + # Prüfe gegen alle Note-Titel (inkl. Aliases) for title in note_titles_to_search: - # Normalisiere: Entferne Klammern, Jahreszahlen, Präfixe - def normalize_title(t): - if not t: - return "" - # Entferne Klammern und deren Inhalt (z.B. "(2025–2029)") - t = re.sub(r'\s*\([^)]*\)', '', t) - # Entferne Jahreszahlen (4-stellig, mit oder ohne Bindestrich/En-Dash) - # Beispiele: "2025", "2025–2029", "2025-2029" - t = re.sub(r'\s*\d{4}[\s–\-]*\d{0,4}', '', t) - # Entferne "Mein/Meine" Präfixe - t = re.sub(r'^(Mein|Meine)\s+', '', t, flags=re.IGNORECASE) - # Normalisiere Whitespace - t = re.sub(r'\s+', ' ', t).strip() - return t.lower() # Case-insensitive Vergleich - title_norm = normalize_title(title) - tgt_norm = normalize_title(tgt_base) - # Prüfe auf Ähnlichkeit: Entweder exakt gleich oder einer beginnt mit dem anderen + # Prüfe auf Ähnlichkeit: Exakt gleich oder einer beginnt mit dem anderen if title_norm and tgt_norm and len(title_norm) > 5: if (title_norm == tgt_norm or title_norm.startswith(tgt_norm) or @@ -344,7 +348,7 @@ class GraphExplorerService: results.append(edge) existing_edge_ids.add(edge.id) matched_count += 1 - break + break # Nur einmal hinzufügen return results