#!/usr/bin/env python3 # -*- coding: utf-8 -*- """ scripts/show_edges_for_note.py Zeigt Kanten einer Note (gefiltert nach kind/scope) in einer kompakten Form. Aufrufbeispiele: python3 -m scripts.show_edges_for_note --note-id 20251110-ollama-llm-9f0a12 --kinds references,next,prev --limit 10 python3 -m scripts.show_edges_for_note --title "Qdrant Vektordatenbank" --scope note """ from __future__ import annotations import argparse, json, os, sys from typing import Dict, Any, List, Tuple from qdrant_client.http import models as rest from app.core.qdrant import QdrantConfig, get_client def collections(prefix: str) -> Tuple[str, str, str]: return f"{prefix}_notes", f"{prefix}_chunks", f"{prefix}_edges" def find_note_by_title(client, prefix: str, title: str) -> str | None: notes_col, _, _ = collections(prefix) f = rest.Filter(must=[rest.FieldCondition(key="title", match=rest.MatchText(text=title))]) pts, _ = client.scroll(collection_name=notes_col, scroll_filter=f, with_payload=True, with_vectors=False, limit=1) if not pts: return None return pts[0].payload.get("note_id") def fetch_edges_for_note(client, prefix: str, note_id: str, kinds: List[str] | None, scope: str | None, limit: int) -> List[Dict[str, Any]]: _, _, edges_col = collections(prefix) must = [rest.FieldCondition(key="note_id", match=rest.MatchValue(value=note_id))] if scope: must.append(rest.FieldCondition(key="scope", match=rest.MatchValue(value=scope))) if kinds: must.append(rest.FieldCondition(key="kind", match=rest.MatchAny(any=kinds))) f = rest.Filter(must=must) pts, _ = client.scroll(collection_name=edges_col, scroll_filter=f, with_payload=True, with_vectors=False, limit=limit) return [p.payload for p in pts] def main(): ap = argparse.ArgumentParser() ap.add_argument("--note-id") ap.add_argument("--title") ap.add_argument("--kinds", help="CSV: references,next,prev,belongs_to,backlink") ap.add_argument("--scope", choices=["note","chunk"]) ap.add_argument("--limit", type=int, default=25) args = ap.parse_args() cfg = QdrantConfig.from_env() client = get_client(cfg) nid = args.note_id if not nid and args.title: nid = find_note_by_title(client, cfg.prefix, args.title) if not nid: print(json.dumps({"error": f"note with title '{args.title}' not found"})) sys.exit(2) if not nid: print(json.dumps({"error": "please provide --note-id or --title"})) sys.exit(2) kinds = None if args.kinds: kinds = [s.strip() for s in args.kinds.split(",") if s.strip()] edges = fetch_edges_for_note(client, cfg.prefix, nid, kinds, args.scope, args.limit) print(json.dumps({"note_id": nid, "count": len(edges), "edges": edges}, ensure_ascii=False, indent=2)) if __name__ == "__main__": main()