# Artifact Plan: Task 2 - Retrieval (Graph Explorer & Vector Fetcher)

## 1. Judul
Implementasi Modul Retrieval: Neo4j Graph Explorer & Supabase Vector Fetcher

## 2. Tanggal
Rabu, 6 Mei 2026

## 3. Deskripsi
Fase kedua berfokus pada pembangunan saluran komunikasi antara Chatbot dengan Knowledge Graph (Neo4j) dan Vector Database (Supabase). Modul ini bertanggung jawab untuk mengeksekusi Layer 1 (Spesifik) dan Layer 2 (Ekspansif) dari strategi pengambilan konteks, memastikan hanya data yang paling relevan yang ditarik untuk dianalisis oleh agen.

## 4. Metodologi
*   **Hash-Based Linking:** Neo4j hanya digunakan untuk mencari relasi struktural dan *reasoning edge*. *Output* utamanya adalah daftar `file_hash`.
*   **Batch Fetching:** Pengambilan *chunks* dari Supabase harus dilakukan secara *batch* (menggunakan filter `.in_`) untuk meminimalkan *network latency*.
*   **PageRank Filtering:** Ketika menarik artikel tetangga (Layer 2), urutkan berdasarkan properti `visual_pagerank_size` dari Neo4j agar artikel dengan bobot tinggi diprioritaskan.

## 5. Keputusan
*   `graph_retriever.py` akan menggunakan `neo4j` Python driver secara langsung (tanpa melalui `graph_service.py` milik API Next.js lama) agar performa maksimal dan mendukung asinkron.
*   `vector_retriever.py` akan menggunakan *client* `supabase-py` dan harus bisa me-*request* spesifik pilar (misal: "hanya ambil chunk 'Methodology'") jika diperlukan.

## 6. Alur Diagram
```mermaid
flowchart TD
    Input["Target Hash(es)"] --> Router{"Context Layer?"}
    
    Router -->|Layer 1| FetchVector["Fetch Chunks\nfrom Supabase"]
    
    Router -->|Layer 2| GraphQuery["Query Neo4j\nMATCH (n)-[r]->(m)"]
    GraphQuery --> Rank["Sort by PageRank\nTake Top 3"]
    Rank --> ExtractHashes["Extract Neighbor Hashes & Edge Reasoning"]
    ExtractHashes --> FetchVector
```

## 7. Struktur Folder (Tree)
```text
app/
└── services/
    └── chatbot/
        ├── graph_retriever.py
        └── vector_retriever.py
```

## 8. Asumsi
*   Node *Literature* di Neo4j memiliki properti `hash`.
*   Edge di Neo4j memiliki properti `reasoning`.
*   Tabel `document_chunks` di Supabase memiliki kolom `file_hash`.

## 9. Konsep Tabel Metriks
(Tidak ada metrik persisten baru di modul ini, namun modul ini wajib mencatat latensi eksekusi *query* via `logging` Python).

## 10. Konsep Logika Prompting
(Tidak berlaku untuk modul ini; ini adalah modul akses data murni).

## 11. Langkah Implementasi
1.  Di `graph_retriever.py`, buat fungsi asinkron `get_relevant_neighbors(target_hash, max_nodes=3)`.
2.  Di `vector_retriever.py`, buat fungsi `fetch_chunks_by_hashes(hash_list, filter_pillar=None)`.

## 12. Tabel Eksekusi Task

| Check | Fase | Task | Detail Task | Deskripsi | Acceptance Criteria |
| :---: | :---: | :--- | :--- | :--- | :--- |
| [ ] | 2A | **Retrieval** | Neo4j Query | Buat `get_relevant_neighbors`. | Mengembalikan *list* *dictionary* berisi `hash` tetangga dan `reasoning` dari *edge*. |
| [ ] | 2B | **Retrieval** | Supabase Batch Fetch | Buat `fetch_chunks_by_hashes`. | Berhasil mengambil *chunks* teks menggunakan filter `.in_("file_hash", [...])`. |
| [ ] | 2C | **Retrieval** | Integration Test | Unit Test lokal. | Pastikan `graph_retriever` bisa melempar `hash` ke `vector_retriever` tanpa *error*. |
