This commit is contained in:
parent
92bd3d9a47
commit
aa9d388337
|
|
@ -258,6 +258,24 @@ class GraphExplorerService:
|
||||||
# WICHTIG: Diese Suche ist nur für eingehende Kanten relevant
|
# WICHTIG: Diese Suche ist nur für eingehende Kanten relevant
|
||||||
# Für ausgehende Kanten werden alle über note_id gefunden, unabhängig vom target_id Format
|
# Für ausgehende Kanten werden alle über note_id gefunden, unabhängig vom target_id Format
|
||||||
if note_titles_to_search:
|
if note_titles_to_search:
|
||||||
|
# Normalisierungs-Funktion (außerhalb der Schleife für Performance)
|
||||||
|
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 alle Note-Titel VORHER (Performance-Optimierung)
|
||||||
|
note_titles_normalized = {title: normalize_title(title) for title in note_titles_to_search}
|
||||||
|
|
||||||
# Erweiterte Suche: Lade alle relevanten Kanten und filtere clientseitig
|
# Erweiterte Suche: Lade alle relevanten Kanten und filtere clientseitig
|
||||||
# Da target_id KEYWORD ist (nicht TEXT), können wir keine Präfix-Suche direkt machen
|
# Da target_id KEYWORD ist (nicht TEXT), können wir keine Präfix-Suche direkt machen
|
||||||
# STRATEGIE: Lade alle Kanten (mit Limit) und filtere clientseitig nach target_id.startswith(title + "#")
|
# STRATEGIE: Lade alle Kanten (mit Limit) und filtere clientseitig nach target_id.startswith(title + "#")
|
||||||
|
|
@ -271,7 +289,6 @@ class GraphExplorerService:
|
||||||
)
|
)
|
||||||
# WICHTIG: Wir müssen genug Kanten laden, um alle "Titel#Abschnitt" Varianten zu finden
|
# WICHTIG: Wir müssen genug Kanten laden, um alle "Titel#Abschnitt" Varianten zu finden
|
||||||
# Verwende paginierte Suche, um sicherzustellen, dass wir alle Kanten durchsuchen
|
# Verwende paginierte Suche, um sicherzustellen, dass wir alle Kanten durchsuchen
|
||||||
# OPTIMIERUNG: Lade alle Kanten in einem Durchgang (falls möglich)
|
|
||||||
res_extended = []
|
res_extended = []
|
||||||
next_offset = None
|
next_offset = None
|
||||||
max_iterations = 50 # Maximal 50 Iterationen (50 * 5000 = 250000 Kanten)
|
max_iterations = 50 # Maximal 50 Iterationen (50 * 5000 = 250000 Kanten)
|
||||||
|
|
@ -298,8 +315,8 @@ class GraphExplorerService:
|
||||||
if not tgt_id or edge.id in existing_edge_ids:
|
if not tgt_id or edge.id in existing_edge_ids:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# Prüfe, ob target_id mit einem unserer Titel beginnt
|
# Prüfe, ob target_id mit einem unserer Titel beginnt (exakte Matches)
|
||||||
# target_id kann sein: "Titel", "Titel#Abschnitt", "Titel#Abschnitt (Details)"
|
matched_exact = False
|
||||||
for title in note_titles_to_search:
|
for title in note_titles_to_search:
|
||||||
# Exakte Übereinstimmung ODER beginnt mit "Titel#"
|
# Exakte Übereinstimmung ODER beginnt mit "Titel#"
|
||||||
# WICHTIG: startswith findet alle Varianten wie "Titel#P3 – Disziplin"
|
# WICHTIG: startswith findet alle Varianten wie "Titel#P3 – Disziplin"
|
||||||
|
|
@ -307,39 +324,21 @@ class GraphExplorerService:
|
||||||
results.append(edge)
|
results.append(edge)
|
||||||
existing_edge_ids.add(edge.id)
|
existing_edge_ids.add(edge.id)
|
||||||
matched_count += 1
|
matched_count += 1
|
||||||
|
matched_exact = True
|
||||||
break # Nur einmal hinzufügen, auch wenn mehrere Titel passen
|
break # Nur einmal hinzufügen, auch wenn mehrere Titel passen
|
||||||
|
|
||||||
# ZUSÄTZLICH: Fuzzy-Matching für ähnliche Titel
|
# ZUSÄTZLICH: Fuzzy-Matching für ähnliche Titel (nur wenn kein exakter Match)
|
||||||
# PROBLEM: Wikilinks können andere Titel verwenden als der gespeicherte Note-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"
|
# Beispiel: Note-Titel = "Persönliches Leitbild (2025–2029)", aber Wikilink = "Mein Persönliches Leitbild 2025"
|
||||||
# STRATEGIE: Da target_id immer "Titel#Abschnitt" ist, nehmen wir einfach den Teil vor dem #
|
# 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
|
# 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):
|
if not matched_exact:
|
||||||
# Extrahiere Basis-Titel aus target_id (Teil vor dem #)
|
# Extrahiere Basis-Titel aus target_id (Teil vor dem #)
|
||||||
tgt_base = tgt_id.split("#")[0].strip()
|
tgt_base = tgt_id.split("#")[0].strip()
|
||||||
|
|
||||||
# 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)
|
tgt_norm = normalize_title(tgt_base)
|
||||||
|
|
||||||
# Prüfe gegen alle Note-Titel (inkl. Aliases)
|
# Prüfe gegen alle normalisierten Note-Titel (inkl. Aliases)
|
||||||
for title in note_titles_to_search:
|
for title, title_norm in note_titles_normalized.items():
|
||||||
title_norm = normalize_title(title)
|
|
||||||
|
|
||||||
# Prüfe auf Ähnlichkeit: 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 and tgt_norm and len(title_norm) > 5:
|
||||||
if (title_norm == tgt_norm or
|
if (title_norm == tgt_norm or
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user