diff --git a/app/core/derive_edges.py b/app/core/derive_edges.py index 819dd8d..6a89950 100644 --- a/app/core/derive_edges.py +++ b/app/core/derive_edges.py @@ -5,12 +5,15 @@ Modul: app/core/derive_edges.py Zweck: - Bewahrt bestehende Edgelogik (belongs_to, prev/next, references, backlink) - Ergänzt typenbasierte Default-Kanten (edge_defaults aus config/types.yaml) -- Unterstützt "typed inline relations" ([[rel:KIND | Target]] / [[rel:KIND Target]] / rel: KIND [[Target]]) -- Unterstützt Obsidian-Callouts (> [!edge] KIND: [[Target]] [[Target2]] ...) - +- Unterstützt "typed inline relations": + * [[rel:KIND | Target]] + * [[rel:KIND Target]] + * rel: KIND [[Target]] +- Unterstützt Obsidian-Callouts: + * > [!edge] KIND: [[Target]] [[Target2]] ... Kompatibilität: - build_edges_for_note(...) Signatur unverändert -- rule_id Werte exakt wie zuvor erwartet (ohne Versionssuffix): +- rule_id Werte: * structure:belongs_to * structure:order * explicit:wikilink @@ -37,7 +40,7 @@ except Exception: # pragma: no cover def _get(d: dict, *keys, default=None): for k in keys: - if k in d and d[k] is not None: + if isinstance(d, dict) and k in d and d[k] is not None: return d[k] return default @@ -135,11 +138,11 @@ def _edge_defaults_for(note_type: Optional[str], reg: dict) -> List[str]: _WIKILINK_RE = re.compile(r"\[\[(?:[^\|\]]+\|)?([a-zA-Z0-9_\-#:. ]+)\]\]") # Getypte Inline-Relationen: -# [[rel:depends_on | Target]] -# [[rel:related_to Target]] +# [[rel:KIND | Target]] +# [[rel:KIND Target]] _REL_PIPE = re.compile(r"\[\[\s*rel:(?P[a-z_]+)\s*\|\s*(?P[^\]]+?)\s*\]\]", re.IGNORECASE) _REL_SPACE = re.compile(r"\[\[\s*rel:(?P[a-z_]+)\s+(?P[^\]]+?)\s*\]\]", re.IGNORECASE) -# rel: depends_on [[Target]] (reines Textmuster) +# rel: KIND [[Target]] (reines Textmuster) _REL_TEXT = re.compile(r"rel\s*:\s*(?P[a-z_]+)\s*\[\[\s*(?P[^\]]+?)\s*\]\]", re.IGNORECASE) def _extract_typed_relations(text: str) -> Tuple[List[Tuple[str,str]], str]: @@ -246,7 +249,7 @@ def build_edges_for_note( - belongs_to: für jeden Chunk (chunk -> note) - next / prev: zwischen aufeinanderfolgenden Chunks - references: pro Chunk aus window/text (via Wikilinks) - - typed inline relations: [[rel:KIND | Target]] oder [[rel:KIND Target]] oder rel: KIND [[Target]] + - typed inline relations: [[rel:KIND | Target]] / [[rel:KIND Target]] / rel: KIND [[Target]] - Obsidian Callouts: > [!edge] KIND: [[Target]] [[Target2]] - optional note-scope references/backlinks: dedupliziert über alle Chunk-Funde + note_level_references - typenbasierte Default-Kanten (edge_defaults) je gefundener Referenz @@ -284,14 +287,14 @@ def build_edges_for_note( "provenance": "rule", "rule_id": "structure:order", "confidence": 0.95, - }))) + })) edges.append(_edge("prev", "chunk", b_id, a_id, note_id, { "chunk_id": b_id, "edge_id": _mk_edge_id("prev", b_id, a_id, "chunk", "structure:order"), "provenance": "rule", "rule_id": "structure:order", "confidence": 0.95, - }))) + })) # 3) references + typed inline + callouts + defaults (chunk-scope) reg = _load_types_registry() @@ -366,7 +369,7 @@ def build_edges_for_note( "chunk_id": cid, "edge_id": _mk_edge_id(rel, cid, r, "chunk", f"edge_defaults:{note_type}:{rel}"), "provenance": "rule", - "rule_id": f"edge_defaults:{note_type}:{rel}"), + "rule_id": f"edge_defaults:{note_type}:{rel}", "confidence": 0.7, })) if rel in {"related_to", "similar_to"}: @@ -374,7 +377,7 @@ def build_edges_for_note( "chunk_id": cid, "edge_id": _mk_edge_id(rel, r, cid, "chunk", f"edge_defaults:{note_type}:{rel}"), "provenance": "rule", - "rule_id": f"edge_defaults:{note_type}:{rel}"), + "rule_id": f"edge_defaults:{note_type}:{rel}", "confidence": 0.7, }))