Vertiefung

Graph-Implementierung

Adjazenzliste, BFS, 22 Relationstypen und der N-Hop-Traversal im Code.

01
Speicherformat

relations.json ist eine einfache Kanten-Liste. Kein Adjazenzlisten-Format auf Disk — die wird zur Laufzeit gebaut. 22 Typen mit automatischer Umkehrung in RELATION_TYPES-Dict.

# relations.json
{"edges": [
  {"from":"arch-001","to":"dec-001",
   "relation":"depends_on","note":"API braucht DB"}
]}

# RELATION_TYPES — mit Reverse
"depends_on": {"reverse": "required_by"}
"caused_by": {"reverse": "causes"}
"contradicts": {"reverse": "contradicts"} ← symmetrisch!
02
BFS-Pfadfindung

find_path() baut Adjazenzliste on-the-fly und traversiert in BEIDE Richtungen. Reverse-Kanten werden mit ~ markiert. Max 6 Hops. Standard-BFS mit visited-Set und deque.

# Adjazenzliste bauen — BEIDE Richtungen
for edge in edges:
  adj[from].append((to, rel))
  adj[to].append((from, f"~{rel}")) # reverse!

# BFS
queue = deque([(start, [start])])
while queue:
  current, path = queue.popleft()
  if current == target: return path
03
Kontext-Traversal

get_related_context() sammelt alle Nodes in N Hops Entfernung. Nutzt BFS mit Tiefenbegrenzung. Ergebnis sortiert nach Distanz — nahe Nodes zuerst.

# N-Hop Context
queue = deque([(node_id, 0)])
while queue:
  current, depth = queue.popleft()
  if depth > max_depth: continue
  result.append({id, title, type, distance: depth})
  # Alle Nachbarn in die Queue

Ergebnis: [{id:"arch-001", distance:1},
          {id:"cfg-001", distance:2}]