Преглед на файлове

Eemalda Etnomath/Zotero/ReadItLater juhendid (teadlikult kustutatud); Andmeallikad ja tehtud töö ajakohastatud

ardo преди 2 седмици
родител
ревизия
aa68c5b8cc

+ 4 - 4
Doktoritöö/Liiklussageduse kaudne hindamine/02_Metoodika/01 Andmeallikad.md

@@ -33,10 +33,10 @@ Kõik andmed on **avalikud ja tasuta** — see on metoodika oluline eelis (kaudn
 
 ### Teede klassifikatsioon
 
-| Klass | highway-tagid |
-|-------|---------------|
-| Riigiteed (major) | `trunk`, `trunk_link`, `primary`, `secondary`, `tertiary` (+ _link) |
-| Kohalikud teed (local) | `residential`, `unclassified`, `service`, `track`, `living_street` |
+| Klass                  | highway-tagid                                                       |
+| ---------------------- | ------------------------------------------------------------------- |
+| Riigiteed (major)      | `trunk`, `trunk_link`, `primary`, `secondary`, `tertiary` (+ _link) |
+| Kohalikud teed (local) | `residential`, `unclassified`, `service`, `track`, `living_street`  |
 
 ### Väljapääsupunktid
 

+ 21 - 0
Doktoritöö/Liiklussageduse kaudne hindamine/06_Logid/Tehtud töö ajalugu.md

@@ -357,3 +357,24 @@ ADS-summa konserveeritud igas vallas (Valga 9066, Otepää 6813, Tõrva 4752, V
 - **Menüü kihtide eraldamine (2026-08):** "Riigiteed (maantee-klass)" ja "Kohalikud teed" on nüüd omaette linnukesed, mis kuvavad ainult klassivärvi (ilma liikluseta). Liiklus on eraldi linnukestega: "Riigiteede liiklus (AKÖL)" ja "Kohalik liiklus (kaudne)", vaikimisi välja lülitatud. Legendi värvid vastavad solid-värvidele.
 - **Kohalikud teed ühtne klassivärv (2026-08):** kasutaja märkas, et kolm kohalikku teed (Otepää OTE_0011) olid erinevat värvi — põhjus: local_roads põhivärv kasutas impedance (kaugus väljapääsuni) gradienti (0→#f6c177, 40+→#b4637a). Parandus: kõik kohalikud teed on nüüd ühtset värvi #f6c177; impedance jääb andmetesse/popup-i, ei määra enam värvi. Liiklus (local_traffic) jääb eraldi linnukese taha.
 - **Riigiteede ja kohalike teede värvide eristamine (2026-08):** kohalikud teed olid oranžid (#f6c177), mis sarnanesid riigiteede sekundaar/tersiaalsete värvidega (#ffb74d/#ffd54f). Muudetud kohalikud teed sinakashalliks (#7c8ea0) — selgelt eristuvad. Menüüsse lisatud värvitähised iga linnukese ette (samad värvid kui kaardil).
+
+## 2026-08-11 — Veebirakenduse parandused ja täiendused (UI, serveri vahemälu, pipeline)
+
+**Demo-koodi avamise viga (kriitiline) [web/index.html]:** `btn-access` handler luges sisestatud koodi (`val`), kuid saatis valideerimispäringu ilma koodita (`apiFetch(api/maps/...)` ilma `X-Access-Token` päiseta) → server vastas alati 403 → esmakordne avamine ebaõnnestus ka õige koodiga. Parandatud: päring saadab nüüd `X-Access-Token: <sisestatud kood>`. Tühi sisestus hoiatab.
+
+**Tugevam kihiladu [web/index.html]:**
+- `loadMunicipality` kontrollib nüüd **manifesti** (`munis[].layers`) ja laeb ainult olemasolevad kihid — puuduv kiht ei murra enam kogu valla laadimist; lisatud try/catch + veateade.
+- `addLayer` viskab selge vea 404 korral; arvutab piirid (`layerBounds`) laadimisel, et `fitTo` ei sõltuks MapLibre sisemisest `_data`-st.
+- `local_groups` popup talub puuduvaid `length_km`/`edges` (null → „—") — varem krahhis `.toFixed(1)`.
+
+**Serveripoolne PDF-vahemälu [server.py]:** raport ehitatakse uuesti ainult siis, kui sisendfailide mtime muutus (`_report_cache`). Mitmekordse päringu korral (sama valla raport korduvalt) jääb CPU-aeg kokku; brauserile läheb ikka `no-cache`. Kontrollitud: esimene ehitamine 0.86 s, vahemälust 0.80 s.
+
+**Pipeline [run_municipality.py]:** lisatud etapp 0 — puuduvate andmeallikate automaatne laadimine (ADS hooned, KÜ, kataster `--maakond`, teeregister omand+lepingud); `--refresh-data` sunnib uuesti; `--skip-legacy` jätab vana WorldPop-etapi vahele. `building_population.py --official-pop` jookseb pärast legacyt ja kirjutab tänapäevase sõlme-rahvastiku. Valla-→maakonna kaart (MAKOND) katastri laadimiseks.
+
+**Gravity fallback [gravity_exit_analysis.py]:** uutel valdadel puudub WorldPop `_pop_catchment.csv` → vanasti kõik väljapääsud tõmbejõuta (uniform). Nüüd tuletatakse tõmbejõud hoonepõhisest sõlme-rahvastikust (`_pop_node_population.csv`) lähim-väljapääsu jaotusega (`exit_gravity` α-log).
+
+**BFS-optimeerimine [export_qgis.py]:** `queue.pop(0)` (O(n)) → `collections.deque.popleft()` (O(1)). Suurtel võrkudel märkimisväärne kiirenemine.
+
+**.gitignore:** `data/` → `data/logs/` (andmefailid lähevad git'i kaasa; ainult külastajate loginid jäävad maha, privaatsus).
+
+**README:** dokum. uue valla lisamise töövoog (andmeallikate automaatlaadimine, `--skip-legacy`, git data/ kaasa).

+ 0 - 155
Juhendid/Etnomath/01 Struktuur.md

@@ -1,155 +0,0 @@
-# 2️⃣ Soovitatav arhitektuur (kihiline, mitte üleliigne)
-
-## 🔹 I KIHT – teadmiste baas (low-code alguses)
-
-**Soovitus:**
-- Markdown / Obsidian / Notion
-- Iga sissekanne:
-  - kultuur / kogukond
-  - praktika
-  - matemaatiline struktuur
-  - allikad
-  - mõisted
-
-👉 See on sinu **etnomatemaatiline ontoloogia** (isegi kui sa seda nii ei nimeta).
-
-✅ Ei mingit koodi alguses.
-
----
-
-## 🔹 II KIHT – RAG + mõisteline seostamine (kompaktne)
-
-Siin piisab:
-- vektorandmebaas
-- LangChain LCEL
-- lihtne retriever
-
-Näide loogikast (mitte täpne kood):
-
-```
-küsimus
- → kultuuriline kontekst
- → matemaatiline struktuur
- → allikad
- → süntees
-```
-
-👉 Sobib:
-- “Milliseid fraktaalseid mustreid leidub Aafrika arhitektuuris?”
-- “Millised arvustruktuurid ilmnevad rahvapärastes mängudes?”
-
----
-
-## 🔹 III KIHT – uurimisagent (LangGraph tuleb siia)
-
-Siin hakkad sa **päriselt võitma LangGraphiga**.
-
-### Agent, kes oskab:
-- klassifitseerida küsimuse:
-  - kirjeldav
-  - analüütiline
-  - probleemiloov
-  - teoreetiline
-- otsustada:
-  - kas vaja rohkem allikaid
-  - kas vaja matemaatilist formaliseerimist
-- genereerida:
-  - uurimisküsimusi
-  - hüpoteese
-  - näiteid ja vastunäiteid
-
-👉 See EI ole enam low-code.
-
-Aga:
-✅ sa kirjutad **1 raamistiku**
-✅ mitte iga küsimuse jaoks uut koodi
-
----
-
-## 🔹 IV KIHT – artikli kirjutamise agent
-
-Siin on agent, mis:
-- hoiab IMRaD struktuuri
-- viitab allikatele
-- eristab:
-  - empiirilist
-  - interpretatiivset
-  - matemaatilist
-- hoiab teaduslikku stiili
-
-LangGraph on siin ideaalne:
-- iga peatükk = node
-- kontrollid enne edasi liikumist kvaliteeti
-
----
-
-# 3️⃣ Kas on olemas “kompaktne” tee alguses?
-
-**Jah — ja see on oluline.**
-
-### Soovitan alustada nii:
-
-**FAAS 1 (0–2 kuud):**
-- Notion / Obsidian
-- käsitsi loodud etnomatemaatilised kaardid
-- ChatGPT abil küsimuste ja probleemide loomine
-- null Pythoni koodi
-
-**FAAS 2 (2–4 kuud):**
-- RAG (lihtne LangChain)
-- dokumentide põhine vastamine
-- uurimisküsimuste poolautomaatne loomine
-
-**FAAS 3 (4+ kuud):**
-- LangGraph
-- uurimisagent
-- artikli mustrid
-- korduvkasutatav teadustöö pipeline
-
----
-
-# 4️⃣ Väga oluline teaduslik aspekt
-
-Kui sa tahad **hiljem artikleid avaldada**, siis:
-
-✅ süsteem peab olema:
-- **jälgitav** (kuidas järeldus tekkis)
-- **reprodutseeritav**
-- **läbipaistev**
-
-LangGraphi eelis:
-- iga samm on eraldi
-- võimalik logida
-- võimalik kirjeldada metoodikas
-
-👉 See on teaduslikult suur pluss.
-
----
-
-# 5️⃣ Aus vastus su küsimusele
-
-> “Kas on olemas kompaktne lahendus või peab alati Pythoni kasutama?”
-
-**Alguses: EI pea.**  
-**Tõsise etnomatemaatika uurimisökosüsteemi jaoks: JAH, lõpuks peab.**
-
-Aga:
-- mitte igal juhtumil
-- mitte nullist
-- mitte kaootiliselt
-
----
-
-## Kui tahad, järgmine samm võiks olla:
-1️⃣ etnomatemaatiline **andmemudel** (väljade nimekiri)  
-2️⃣ uurimisküsimuste **generaatori skeem**  
-3️⃣ teadusartikli **agent-pipeline**  
-
-Ütle, kummast tahaksid alustada.
-
-Suurepärane valik. **Hea andmemudel on kogu ökosüsteemi selgroog**, eriti teadusliku etnomatemaatika puhul.
-
-Allpool annan **praktilise, kuid teaduslikult korrektse andmemudeli**, mis:
-- töötab **ilma koodita** (Notion / Obsidian / Markdown)
-- on hiljem **otse kaardistatav RAG-i ja LangGraphi**
-- sobib artiklite ja uurimisküsimuste loomiseks

+ 0 - 169
Juhendid/Etnomath/02 Andmemudel.md

@@ -1,169 +0,0 @@
-
-# 1️⃣ Põhiüksused (core entities)
-
-## 🔹 1. Kultuuriline kontekst (`Cultural_Context`)
-**Mida uuritakse ja kus**
-
-**Väljad:**
-- `id`
-- `kultuur / kogukond`
-- `geograafia`
-- `ajaperiood`
-- `keel(ed)`
-- `sotsiaalne kontekst`
-- `uurija roll` (väline / osalev / ajalooline)
-- `märkused`
-
----
-
-## 🔹 2. Praktika või artefakt (`Practice_Artifact`)
-**Mida inimesed päriselt teevad või kasutavad**
-
-**Väljad:**
-- `id`
-- `nimetus`
-- `tüüp` (rituaal, mäng, käsitöö, arhitektuur, kalender, mõõtmine jne)
-- `kirjeldus (emic)`
-- `kirjeldus (etic)`
-- `kasutusolukord`
-- `seotud kultuurid`
-- `visuaalsed allikad`
-
-👉 *Emic vs etic* eristus on teaduslikult väga oluline.
-
----
-
-## 🔹 3. Matemaatiline struktuur (`Mathematical_Structure`)
-**Milline matemaatika seal peidus on**
-
-**Väljad:**
-- `id`
-- `tüüp`  
-  (arvutamine, geomeetria, sümmeetria, fraktaalid, graafid, tõenäosus jne)
-- `formaalne kirjeldus`
-- `mitteametlik kirjeldus`
-- `tasand` (intuitiivne / algoritmiline / formaalne)
-- `tuntud matemaatilised analoogid`
-- `märkus formaliseerimise kohta`
-
----
-
-## 🔹 4. Seos (kriitiline üksus!) (`Ethno_Math_Link`)
-**Kuidas praktika ja matemaatika on seotud**
-
-**Väljad:**
-- `praktika_id`
-- `matemaatika_id`
-- `seose tüüp`  
-  (implitsiitne, eksplitsiitne, õpetuslik, heuristiline)
-- `tõendusmaterjal`
-- `uurija interpretatsioon`
-- `kindluse aste` (madal / keskmine / kõrge)
-- `vaidlused / alternatiivsed tõlgendused`
-
-👉 See väldib *liigset matemaatika peale surumist*.
-
----
-
-## 🔹 5. Allikas (`Source`)
-**Kust info pärineb**
-
-**Väljad:**
-- `id`
-- `autor`
-- `aasta`
-- `tüüp` (välitöö, artikkel, raamat, suuline allikas)
-- `tsitaat`
-- `DOI / URL`
-- `usaldusväärsuse hinnang`
-- `märkused`
-
----
-
-# 2️⃣ Teaduslikud tööüksused (research units)
-
-## 🔹 6. Uurimisküsimus (`Research_Question`)
-**Mida täpselt uuritakse**
-
-**Väljad:**
-- `id`
-- `küsimus`
-- `tüüp`  
-  (kirjeldav / võrdlev / analüütiline / teoreetiline)
-- `seotud üksused` (praktika, matemaatika, kultuur)
-- `motivatsioon`
-- `uurimismeetod`
-- `avatud probleemid`
-
----
-
-## 🔹 7. Probleem või ülesanne (`Problem_Task`)
-**Hariduslik või teoreetiline väljund**
-
-**Väljad:**
-- `id`
-- `ülesande tekst`
-- `päritolu`
-- `matemaatiline fookus`
-- `lahendus / lahendusidee`
-- `didaktiline eesmärk`
-- `raskusaste`
-
----
-
-## 🔹 8. Artikkel / käsikiri (`Manuscript`)
-**Teaduslik väljund**
-
-**Väljad:**
-- `id`
-- `pealkiri`
-- `staatus` (mustand / esitatud / avaldatud)
-- `seotud uurimisküsimused`
-- `struktuur`
-- `kasutatud allikad`
-- `metoodika kirjeldus`
-- `piirangud`
-
----
-
-# 3️⃣ Seoste skeem (lihtsustatud)
-
-```
-Kultuur
-   ↓
-Praktika / Artefakt
-   ↓
-Ethno_Math_Link
-   ↓
-Matemaatiline struktuur
-   ↓
-Uurimisküsimus
-   ↓
-Artikkel / Probleem
-```
-
----
-
-# 4️⃣ Kuidas seda kohe kasutada (ilma koodita)
-
-### Soovituslik tööriist:
-- **Obsidian** (Markdown + lingid)
-- või **Notion** (tabelid + relatsioonid)
-
-### Praktika:
-- 1 praktika = 1 leht
-- link praktikalt → matemaatikale
-- link allikatele
-- lisa *kindluse aste*
-
-👉 See struktuur on **otse söödetav LLM-ile** hiljem.
-
----
-
-# 5️⃣ Miks see mudel on AI-sõbralik?
-
-✅ iga mõiste on eraldi  
-✅ seosed on eksplitsiitsed  
-✅ sobib RAG-iks  
-✅ sobib LangGraph state’iks  
-✅ toetab teaduslikku kriitilisust  

+ 0 - 169
Juhendid/Etnomath/Manuscripts.md

@@ -1,169 +0,0 @@
-## Decoding the Inca Quipu: A Mathematical Perspective
-
-Kontekstis esitatud allikad pakuvad põhjalikku ülevaadet inkade matemaatikast, keskendudes peamiselt **quipu** (nöörkirjale) ja **yupana** (arvutuslaua) uurimisele. Siin on peamised teemad ja järeldused, mida allikates käsitletakse:
-
-### 1. **Quipu (nöörkiri) matemaatilise süsteemina**
-*   **Funktsioon ja struktuur:** Quipu oli positsiooniline kümnendsüsteem, kus numbreid esindasid sõlmed nööride erinevatel positsioonidel. Üksikud sõlmed tähistasid kümneid, sadu, tuhandeid jne, pikkade sõlmedega (keerdudega) esitati numbreid 2–9 ja kaheksasõlmedega number 1 [1][4][5].
-*   **"Dekodeerimine" ja kinnitused:** Ameerika matemaatik Leslie Leland Locke pakkus 1912. aastal välja, et inkad kasutasid kümnendsüsteemi, kuid sellel puudus tõendusmaterjal. 1970. aastatel tõestasid Marcia ja Robert Ascher, et paljudel quipudel on spetsiaalne "summeeriv nöör", mis näitab teiste nööride summat, kinnitades seeläbi Locke'i teooria õigsust [1].
-*   **Kasutusvaldkonnad:** Quipusid kasutati riigihalduses andmete salvestamiseks – loendati rahvast, kariloomi, saaki, makse ja isegi kohtuotsuseid. Selle eest vastutasid spetsiaalsed ametnikud, *quipucamayoc*'id [1][4][5].
-
-### 2. **Yupana (arvutuslaud) kui arutluse all olev teema**
-*   **Müstika ja spekulatsioon:** Allikates rõhutatakse, et yupana kohta on palju vähem kindlaid andmeid kui quipu kohta. Ainus ajalooline kujutis pärineb Felipe Guaman Poma de Ayala 1615. aasta jooniselt [1][4].
-*   **Artefaktide probleem:** Kuigi arheoloogid on leidnud kolmemõõtmelisi kiviseid plaate, mida nimetatakse yupanadeks, ei kattu need ajalooliste kirjeldustega (mis räägivad tasasest ruudustikust). Tõenäoliselt olid need pigem kunstilised nikerdused või mängulaudad, mitte arvutusvahendid [1].
-*   **Hüpoteesid ja "dekollektsioonid":** On olnud mitmeid katseid yupana "lahendada", sealhulgas ebatõenäolikke teooriaid (nt 40ndsüsteem), kuid teaduslik konsensus on, et inkade tegelik arvutuslaud on kadunud ja selle tööpõhimõte jääb teadmata [1].
-
-### 3. **Matemaatikaõpetuse rakendused**
-Kontekstis esitatud õppematerjal [5] näitab, kuidas **quipusid ja yupana-tüüpi arvutuslauasid saab kasutada matemaatikaõpetuses**:
-*   **Arvusüsteemide õpetamine:** Quipu sõlmede analüüs on konkreetne viis tutvustada positsioonilisi arvusüsteeme, kohaväärtust ja erinevaid esitusviise [5].
-*   **Probleemilahendus:** Õpilased saavad ise "lugeda" quipu nööre või paigutada kive yupana-lauale, et esitada ja liita erinevaid arve, arendades aritmeetilist ja loogilist mõtlemist [5].
-*   **Kultuurilise matemaatika sissejuhatus:** Need vahendid pakuvad kaasavat ja ajalooliselt kontekstipõhist lähenemist matemaatikale, näidates, kuidas erinevad kultuurid on matemaatilisi probleeme lahendanud [1][5].
-
-### 4. **Etnomatemaatika kui uurimisvaldkond**
-Kogu materjal rõhutab **quipu uurimise tähtsust etnomatemaatika raames** – traditsiooniliste kultuuride matemaatiliste praktikate uurimises [1][7].
-*   **Dekoloniseeriv vaade:** Quipu edukas "dekollektsioon" oli üks esimesi suuri saavutusi selles valdkonnas, lükates ümber arusaama, et keerukad matemaatilised süsteemid olid ainuomased vaid Euroopale või Aasiale [1].
-*   **Kultuuriline kontekst:** Tähelepanu juhitakse sellele, et inkade matemaatika oli tihedalt seotud nende haldussüsteemi, kommunikatsiooni ja materiaalse kultuuriga (nt kudumismustrid) [4][7]. Matemaatika ei olnud abstraktne distsipliin, vaid praktilise elu lahutamatu osa.
-
-**Kokkuvõtteks:** Kontekstis esitatud allikad käsitlevad "Decoding the Inca Quipu" teemat **kolmest põhinurgast**: 1) quipu kui keeruka, kuid edukalt dešifreeritud matemaatilise süsteemi ajalooline ja tehniline analüüs [1][4][5]; 2) yupana kui teaduslikult ebakindel, kuid populaarne müsteerium [1]; ning 3) nende süsteemide pedagoogiline ja kultuuriline väärtus matemaatikaõpetuses ja etnomatemaatilises uurimistöös [1][5][7].
-
-1 https://thinkspace.fairfield.edu/post/782950402684502016/the-unconquered-mathematics-of-the-inca
-2 https://www.gcsu.edu/sites/files/page-assets/node-808/attachments/leon.pdf
-3 https://www.atlantisbolivia.org/decodingquipumaths.htm
-4 https://mathshistory.st-andrews.ac.uk/HistTopics/Inca_mathematics/
-5 https://courses.lumenlearning.com/waymakermath4libarts/chapter/inca-and-quipu-numeration-systems/
-6 https://www.researchgate.net/publication/314921733_Ethnomathematics_of_the_Inkas
-7 https://www.academia.edu/3456333/Ethnomathematics_of_the_Inkas_2014
-
-## Early Indian Geometry: The Case of Sulba Sutras
-
-Kontekstis esitatud allikad (eriti MacTutor History of Mathematics artiklid) annavad põhjaliku ülevaate varajase India geomeetria kohta, mida tuntakse **Sulba Sutra**'de nime all. Need tekstid on Veeda lisad (appendiksid), mis annavad reegleid ohvrialtarite ehitamiseks [3][5].
-
-Siin on peamised punktid, mida allikad "Early Indian Geometry: The Case of Sulba Sutras" kohta välja toovad:
-
-### 1. **Päritolu ja eesmärk**
-Sulba Sutrad (umbes 800–200 eKr) olid praktilised ehitusjuhendid, mille eesmärk oli tagada **matemaatiline täpsus rituaalsete altarite konstrueerimisel**. Täpne altar oli oluline, et ohver oleks jumalatele meelepärane [3][5]. Need on peamised allikad, mis annavad teadmisi Veeda matemaatikast [3].
-
-### 2. **Peamised matemaatilised saavutused ja sisu**
-Allikad rõhutavad järgmisi olulisi matemaatilisi edusammusid:
-
-*   **Pythagorase teoreem:** Teoreem on selgelt väljendatud, kuigi konkreetsetes sõnades. Baudhayana Sutra (umbes 800 eKr) toob selle erijuhu, Katyayana Sutra (umbes 200 eKr) üldisema versiooni [3][5]. See eelnes tõenäoliselt Pythagorase enda töödele [5].
-*   **Pythagorase arvukolmikud:** Sutrates esineb mitmeid näiteid, nagu (5, 12, 13), (8, 15, 17) ja (12, 35, 37) [3][5].
-*   **Geomeetrilised konstruktsioonid:** Sutrad annavad täpseid meetodeid kujundite teisendamiseks, näiteks:
-    *   Kahe antud ruudu summaga võrdse ruudu konstrueerimine (kasutades Pythagorase teoreemi) [3].
-    *   Antud ristkülikuga pindalalt võrdse ruudu konstrueerimine [3].
-    *   Ringi ruutimine ja ruudu ringistamine (ligikaudsed meetodid) [3].
-*   **Irratsionaalarvud ja √2 lähendus:** Eriti märkimisväärne on **väga täpne lähendus arvule √2**, mis esineb Apastamba ja Katyayana Sutrates [3][5]. Valem:
-    √2 ≈ 1 + 1/3 + 1/(3×4) – 1/(3×4×34) = 577/408 ≈ 1.414215686
-    See on õige viie kümnendkohani [3]. See viitab teadlikkusele irratsionaalsete suuruste ligikaudsest olemusest [5].
-*   **π erinevad väärtused:** Erinevates Sutrates esineb palju erinevaid π lähendusi, alates 2.99 kuni 3.2022-ni, mis tulenevad erinevatest ringi ruutimise meetoditest [3].
-
-### 3. **Matemaatilise metoodika iseärasused**
-*   **Tõestuste puudumine:** Sutrad esitavad reegleid ja konstruktsioone ilma eksplitsiitsete tõestusteta [3]. Siiski on mõned teadlased väitnud, et tõestus on mitmes konstruktsioonis kaudselt olemas [5].
-*   **Praktiline ja "nööri"-geomeetria:** Juhised on antud nööride (sulba) abil, mis viitab praktilisele mõõtmisele ja ehitusle [3].
-*   **Autorid:** Peamised autorid on Baudhayana, Manava, Apastamba ja Katyayana, kes olid tõenäoliselt Veeda preestrid ja osavad käsitöölised [5].
-
-### 4. **Ajalooline tähtsus ja vaidlused**
-*   **Sõltumatus Kreeka mõjutustest:** Allikad rõhutavad, et Veeda geomeetria meetodid erinevad Kreeka omadest, viidates selle iseseisvale arengule [5]. On isegi väidetud, et India geomeetria võib olla vanem kui Babüloonia ja Kreeka oma [5].
-*   **Irratsionaalarvude esmakasutajad:** On väidetud, et "irratsionaalarvude esmakasutamise au kuulub indiaanlastele" [5].
-*   **Kümnendsüsteemi ja nulli eelkäijad:** Kuigi mitte otseselt geomeetrias, märgivad allikad, et enne Sulba Sutra perioodi lõppu hakkasid ilmuma kümnendsüsteemi ja Brahmist numbrite (sh nulli mõiste) algvormid [5].
-
-**Kokkuvõtteks:** "Early Indian Geometry: The Case of Sulba Sutras" allikate põhjal on see **praktilise, rituaalse geomeetria rikkalik korpus, mis sisaldab olulisi teoreetilisi avastusi nagu Pythagorase teoreem, irratsionaalarvud ja täpsed geomeetrilised konstruktsioonid**. Kuigi see puudutas tõestamise formaalset traditsiooni, näitab see suurt matemaatilist oskust ja oli tõenäoliselt iseseisev areng, mis pani aluse hilisemale India matemaatikale.
-
-1 https://en.wikipedia.org/wiki/Shulba_Sutras
-2 https://iarjset.com/wp-content/uploads/2025/02/IARJSET.2025.12137.pdf
-3 https://mathshistory.st-andrews.ac.uk/HistTopics/Indian_sulbasutras/
-4 https://www.anantaajournal.com/archives/2025/vol11issue1/PartA/11-1-20-722.pdf
-5 https://mathshistory.st-andrews.ac.uk/Projects/Pearce/chapter-5/
-6 https://www.nepjol.info/index.php/ppj/article/download/70219/53556/205081
-7 https://personal.math.ubc.ca/~cass/courses/m309-01a/kong/sulbasutra_geometry.htm
-
-## Sona Geometry: African Tradition as Mathematical Discovery
-
-Antud kontekstist on võimalik tuua välja järgmised olulised teadmised teemal "Sona Geometry: African Tradition as Mathematical Discovery". Kõige olulisem ja kättesaadav allikas on UNESCO kirjeldus, mis on kontekstis täielikult esitatud [7].
-
-**Sona kui kultuuripärand ja matemaatiline väljendus:**
-Sona viitab liivale tehtavatele joonistustele ja geomeetrilistele kujunditele, mida praktiseerivad Lunda Cokwe ja naaberrahvad Angolas. See on väljendusvorm, mis edastab uskumusi, mõtteid, emotsioone ning suhet looduse ja inimese vahel [7].
-
-**Matemaatiline ja pedagoogiline tähtsus:**
-Kontekst rõhutab sona olulist rolli matemaatikaõpetuses:
-*   Viimastel aastakümnetel on **haridusasutused hakanud sonat kasutama õpetamise vahendina** ning edendama teadmisi matemaatika, etnomatemaatika ja antropoloogia vallas [7].
-*   Sona kasutamine koolides ja kunstnike poolt on võimaldanud selle **uuesti leiutamist ja levitamist**, tugevdades teadmisi ja oskusi sona joonistuste kohta erinevatest vaatenurkadest [7].
-*   Sona on seotud **geomeetriaga** [7] ja seda peetakse **kollektiivse mälu loomise ja tugevdamise**, samuti **päritoluteadmiste säilitamise ja edasikandmise** vahendiks [7].
-
-**Praktiline teostus ja ülekandmine:**
-*   Tegelased märgivad märgale liivale viited punktid ning seejärel tõmbavad nende punktide ümber jooni [7].
-*   Teadmised edastatakse noorte pühitsemistseremooniate käigus, et neid ette valmistada ühiskondlikeks rollideks [7].
-
-**Kokkuvõtteks:** Kontekstist [7] selgub, et "Sona Geometry: African Tradition as Mathematical Discovery" käsitleb **liivajoonistuste traditsiooni kui rikast matemaatilist ja kultuurilist praktikat, mida tänapäeval aktiivselt rakendatakse ja uuendatakse hariduses**. See kinnitab sona olulisust mitte ainult kui pärandit, vaid ka kui elavat ja arenevat õpivahendit, mis ühendab kultuurilist identiteeti kaasaegse teadusliku ja pedagoogilise mõtlemisega.
-
-**Märkus teiste allikate kohta:** Kontekstis viidatud teadusartiklid [1], [4] ja [6] on ligipääsematud (access denied või blokeeritud), mistõttu nende sisulist panust antud vastuses kasutada ei saa.
-
-1 https://www.researchgate.net/publication/263183019_Paulus_Gerdes_Sona_Geometry_from_Angola_mathematics_of_an_African_tradition
-2 https://archive.bridgesmathart.org/2009/bridges2009-305.pdf
-3 https://books.google.com/books/about/Sona_Geometry_from_Angola.html?id=nqbAACk2CgYC
-4 https://www.researchgate.net/publication/305767197_Constructing_Symmetric_Chokwe_Sand_Drawings
-5 https://flm-journal.org/Articles/20FD8A59F34B4810242A18CB972A1A.pdf
-6 https://www.jstor.org/stable/10.5951/mathteacmiddscho.24.2.0116
-7 https://ich.unesco.org/en/RL/sona-drawings-and-geometric-figures-on-sand-01994
-8 https://end-educationconference.org/wp-content/uploads/2024/07/202401OP020.pdf
-
-## Traditional Navigation and Mathematical Thinking in Polynesia
-
-Antud kontekstist saab tuua välja järgmised peamised teadmised teemal "Traditional Navigation and Mathematical Thinking in Polynesia". Allikad keskenduvad peamiselt **Polüneesia traditsioonilisele navigatsioonitehnikale (wayfinding) ja selle matemaatilistele alustele**, eriti **tähekompassile (star compass)**.
-
-### 1. Tähekompass (Star Compass / Kāpehu Whetū) kui peamine matemaatiline ja vaimne konstruktsioon
-See on navigatsioonisüsteemi alus, mis võimaldab meresuunda määrata ilma instrumentideta [4].
-*   **Struktuur ja geomeetria:** Mõtteline horisont jagatakse **neljandikeks** (põhja-, lõuna-, ida- ja läänetuulte järgi) ja seejärel **32 võrdseks ossaks ("majaks"/"house")** [4][5]. See on selge geomeetriline jaotus ringist, mis nõuab arusaamist ringi jagamisest ja suundadest.
-*   **Eesmärk:** Kompass aitab meelde jätta, millises "majas" konkreetsed tähed tõusevad ja loojuvad, muutes taeva ennustatavaks navigatsioonikaardiks [4].
-
-### 2. Konkreetsed matemaatilised oskused ja arvutused
-Navigaatorid rakendavad pidevalt matemaatilist mõtlemist:
-*   **Trigonomeetria ja nurga mõõtmine:** Navigaatorid kasutavad oma **kätt** taevakehade kõrguse mõõtmiseks horisondi kohal. Näiteks võib pöial ja keskmine sõrm tähistada 19 kraadi [5]. See on trigonomeetriline kaldenurga mõõtmine oma keha abil.
-*   **Laiuskraadi määramine:** Tähe (nt Polaris / Hōkūpa‘a) kõrgus horisondi kohal on ligikaudu võrdne vaatleja laiuskraadiga [5]. Selle jälgimine on pidev geomeetriline hinnang asukohale.
-*   **Kiiruse, vahemaa ja aja arvutused:** Meeskond arvutab pidevalt **kiirust (rate)** ja **vahemaad (distance)**, näiteks mõõtes, kui kaua kulub mullil vee peal läbida pikkus, ning kasutades valemit **vahemaa = kiirus × aeg** [5]. Samuti korrigeeritakse kurssi tuulte ja hoovuste mõju arvesse võttes, mis nõuab vektoriaalset arutlust [5].
-
-### 3. Etnomatemaatika kui pedagoogiline ja kultuuriline lähenemine
-Kontekst rõhutab, kuidas traditsiooniline navigatsioon on **etnomatemaatika** silmatorkav näide [5].
-*   **"Universum kui õpik":** See on matemaatika õppimine, mis põhineb otseselt looduslikul keskkonnal ja kultuurilisel praktikal [5].
-*   **Hariduslik rakendus:** Traditsioonilist navigatsiooni kasutatakse õpetamise vahendina, et inspireerida õpilasi matemaatikas (eriti STEM-valdkondades) ja näidata matemaatika praktilist, elulist tähtsust [5]. Näiteks õpetatakse lastele tähekompassi ehitamist nööri abil, mis hõlmab ringi jagamist ja proportsioone [5].
-*   **Teadmiste taastamine ja säilitamine:** Polüneesia navigatsiooni taaselustamine (nt Hōkūle‘a kanuuga) on olnud oluline mitte ainult teadusliku vaidluse (kuidas saared asustati) lahendamiseks, vaid ka kultuurilise identiteedi ja pärandi taastamiseks [5].
-
-### 4. Teadmistebaas ja vaatlus
-Navigatsioon tugineb ulatuslikule meeldejätmisele ja pidevale vaatlusele:
-*   **Tähtede positsioonid:** Navigaator peab meeles pidama vähemalt **220 tähte** ja nende liikumist taevas [4].
-*   **Meridiaanipaarid (Meridian pairs):** Tähepaare, mis ületavad meridiaani (põhja-lõuna joont) samal ajal, kasutatakse laiuskraadi ja põhi- või lõunasuuna määramiseks [4].
-*   **Loodusnähtuste tõlgendamine:** Lisaks tähtedele jälgitakse hoovusi, laine mustreid, pilvi ja merelinde, et hinnata saarte lähedust [5]. Kõik need vaatlused integreeritakse pidevasse asukoha ja kursi hinnangusse.
-
-**Kokkuvõtteks:** Kontekstist [4][5] selgub, et "Traditional Navigation and Mathematical Thinking in Polynesia" hõlmab **keerukat, holistlikku süsteemi, mis ühendab sügavat geomeetrilist, trigonomeetrilist ja aritmeetilist arutlust pideva loodusvaatlusega**. See on etnomatemaatika klassikaline näide, kus matemaatika ei ole abstraktne, vaid on lahutamatu osa praktilisest oskusest, kultuuripärandist ja maailma mõistmisest.
-
-1 https://hokulea.com/polynesian-wayfinding/
-2 https://en.wikipedia.org/wiki/Polynesian_navigation
-3 https://coe.hawaii.edu/ethnomath/wp-content/uploads/sites/12/2019/10/Vectors-and-Navigating-a-Voyaging-Canoe.pdf
-4 https://www.sciencelearn.org.nz/resources/622-the-star-compass-kapehu-whetu
-5 https://magazine.byu.edu/article/how-far-shell-go/
-6 https://anthrosource.onlinelibrary.wiley.com/doi/full/10.1111/etho.12416
-
-## Divination as Mathematics: The Case of Sikidy in Madagascar
-
-Kontekstis esitatud allikad annavad ülevaate teemast "Divination as Mathematics: The Case of Sikidy in Madagascar", kuid detailid on piiratud. Siin on peamised teadmised, mida kontekstist tuua saab:
-
-### 1. **Sikidy kui matemaatiline ja kultuuriline süsteem**
-Sikidy on Madagaskaril praktiseeritav ennustamise (divination) meetod, millel on selged **matemaatilised aspektid** [4]. See kombineerib kultuurilisi uskumusi matemaatiliste põhimõtetega [4].
-
-### 2. **Struktuur ja matemaatilised arvutused**
-*   **Figuurid ja tõlgendamine:** Süsteem hõlmab **Sikidy figurite** struktuuri ja tõlgendamist [4]. Nende figurite loomine ja analüüs nõuab matemaatilist arutlust.
-*   **Seemnete roll:** Ennustamisel kasutatakse **seemneid**, mille paigutus ja lugemine on matemaatiliste arvutuste aluseks [4].
-*   **Matemaatiline põhjendus:** Uuring rõhutab **matemaatilise põhjenduse tähtsust** Sikidy tõlgendamisel [4]. See tähendab, et praktika ei ole pelgalt uskumuste kogum, vaid sisaldab loogilisi reegleid ja arvutusprotseduure.
-
-### 3. **Kultuuriline tähtsus**
-Sikidyl on oluline koht **kohalikes traditsioonides** Madagaskaril [4]. Matemaatika ja uskumused on selles praktikas tihedalt põimunud.
-
-**Kokkuvõtteks:** Kontekstist [4] selgub, et "Divination as Mathematics: The Case of Sikidy in Madagascar" käsitleb **ennustamispraktikat kui keerukat süsteemi, mis ühendab matemaatilisi arvutusi (figuurid, seemnete kasutamine) kultuuriliste uskumuste ja traditsioonidega**. See on selge näide etnomatemaatikast, kus matemaatiline mõtlemine on lahutamatu osa sotsiaalsest ja vaimsest praktikast.
-
-**Märkus:** Kontekstis olevad allikad [1], [2], [3], [5] ja [6] ei sisalda antud küsimuse kohta sisulist teavet (on tühjad, sisaldavad veateateid või on ligipääsmatud). Seetõttu põhineb kogu ülaltoodud info ainsal sisukal allikal [4].
-
-1 https://en.wikipedia.org/wiki/Sikidy
-2 https://dialnet.unirioja.es/descarga/articulo/10012969.pdf
-3 https://www.sciencedirect.com/science/article/pii/S0315086097921595
-4 https://www.scribd.com/document/939625131/Dialnet-AMathematicalAspectsAndBeliefsAboutDivinationBySik-10012969
-5 https://www.hilarispublisher.com/open-access/mathematical-aspects-of-sikidy-1736-4337-S2-008.pdf
-6 http://bioinfo.uib.es/~joemiro/teach/labmat/Old/labmatold/sikiry.pdf

+ 0 - 296
Juhendid/Etnomath/Scripts/02 SQL andmemudel.md

@@ -1,296 +0,0 @@
-## Andmebaasi loomine
-
-Loodud PostgreSQL SQL-skript, mis loob andmebaasi skeemi `etnomath` ja tabelid vastavalt etnomatemaatika andmemudelile. Skript sisaldab kommentaare iga välja kohta inglise keeles.
-
-```sql
--- Loo skeem etnomath, kui seda veel pole
-CREATE SCHEMA IF NOT EXISTS etnomath;
-
--- 1. Kultuuriline kontekst (Cultural_Context)
-CREATE TABLE etnomath.cultural_context (
-    id SERIAL PRIMARY KEY,
-    culture_community TEXT NOT NULL,
-    geography TEXT,
-    time_period TEXT,
-    languages TEXT,
-    social_context TEXT,
-    researcher_role TEXT,
-    notes TEXT
-);
-
-COMMENT ON TABLE etnomath.cultural_context IS 'Kultuuriline kontekst: mida ja kus uuritakse';
-COMMENT ON COLUMN etnomath.cultural_context.culture_community IS 'Kultuur või kogukond, mida uuritakse';
-COMMENT ON COLUMN etnomath.cultural_context.geography IS 'Geograafiline asukoht või piirkond';
-COMMENT ON COLUMN etnomath.cultural_context.time_period IS 'Ajaperiood (nt sajand, aastad)';
-COMMENT ON COLUMN etnomath.cultural_context.languages IS 'Kõneldud keeled';
-COMMENT ON COLUMN etnomath.cultural_context.social_context IS 'Sotsiaalne kontekst (nt päritolu, klass, sugu)';
-COMMENT ON COLUMN etnomath.cultural_context.researcher_role IS 'Uurija roll: väline, osalev, ajalooline';
-COMMENT ON COLUMN etnomath.cultural_context.notes IS 'Lisamärkused';
-
--- 2. Praktika või artefakt (Practice_Artifact)
-CREATE TABLE etnomath.practice_artifact (
-    id SERIAL PRIMARY KEY,
-    name TEXT NOT NULL,
-    type TEXT NOT NULL,
-    description_emic TEXT,
-    description_etic TEXT,
-    usage_context TEXT,
-    related_cultures TEXT,
-    visual_sources TEXT
-);
-
-COMMENT ON TABLE etnomath.practice_artifact IS 'Praktika või artefakt: mida inimesed päriselt teevad või kasutavad';
-COMMENT ON COLUMN etnomath.practice_artifact.name IS 'Praktika või artefakti nimetus';
-COMMENT ON COLUMN etnomath.practice_artifact.type IS 'Tüüp: rituaal, mäng, käsitöö, arhitektuur, kalender, mõõtmine jne';
-COMMENT ON COLUMN etnomath.practice_artifact.description_emic IS 'Emic kirjeldus (kohalik vaade)';
-COMMENT ON COLUMN etnomath.practice_artifact.description_etic IS 'Etic kirjeldus (väline vaade)';
-COMMENT ON COLUMN etnomath.practice_artifact.usage_context IS 'Kasutusolukord või kontekst';
-COMMENT ON COLUMN etnomath.practice_artifact.related_cultures IS 'Seotud kultuurid (viited cultural_context tabelile)';
-COMMENT ON COLUMN etnomath.practice_artifact.visual_sources IS 'Visuaalsete allikate viited või kirjeldus';
-
--- 3. Matemaatiline struktuur (Mathematical_Structure)
-CREATE TABLE etnomath.mathematical_structure (
-    id SERIAL PRIMARY KEY,
-    type TEXT NOT NULL,
-    formal_description TEXT,
-    informal_description TEXT,
-    level TEXT,
-    known_mathematical_analogs TEXT,
-    formalization_notes TEXT
-);
-
-COMMENT ON TABLE etnomath.mathematical_structure IS 'Matemaatiline struktuur: milline matemaatika on praktikas peidus';
-COMMENT ON COLUMN etnomath.mathematical_structure.type IS 'Tüüp: arvutamine, geomeetria, sümmeetria, fraktaalid, graafid, tõenäosus jne';
-COMMENT ON COLUMN etnomath.mathematical_structure.formal_description IS 'Formaalne matemaatiline kirjeldus';
-COMMENT ON COLUMN etnomath.mathematical_structure.informal_description IS 'Mitteformaalne või intuitiivne kirjeldus';
-COMMENT ON COLUMN etnomath.mathematical_structure.level IS 'Tasand: intuitiivne, algoritmiline, formaalne';
-COMMENT ON COLUMN etnomath.mathematical_structure.known_mathematical_analogs IS 'Tuntud matemaatilised analoogiad või seosed';
-COMMENT ON COLUMN etnomath.mathematical_structure.formalization_notes IS 'Märkused formaliseerimise kohta';
-
--- 4. Allikas (Source)
-CREATE TABLE etnomath.source (
-    id SERIAL PRIMARY KEY,
-    author TEXT,
-    year INTEGER,
-    type TEXT,
-    citation TEXT,
-    doi_url TEXT,
-    reliability_assessment TEXT,
-    notes TEXT
-);
-
-COMMENT ON TABLE etnomath.source IS 'Allikas: kust teave pärineb';
-COMMENT ON COLUMN etnomath.source.author IS 'Allika autor';
-COMMENT ON COLUMN etnomath.source.year IS 'Aasta (või ajavahemik)';
-COMMENT ON COLUMN etnomath.source.type IS 'Tüüp: välitöö, artikkel, raamat, suuline allikas jne';
-COMMENT ON COLUMN etnomath.source.citation IS 'Täpne tsitaat või viide';
-COMMENT ON COLUMN etnomath.source.doi_url IS 'DOI, URL või teine identifikaator';
-COMMENT ON COLUMN etnomath.source.reliability_assessment IS 'Usaldusväärsuse hinnang';
-COMMENT ON COLUMN etnomath.source.notes IS 'Lisamärkused';
-
--- 5. Seos (Ethno_Math_Link) – kriitiline üksus
-CREATE TABLE etnomath.ethno_math_link (
-    id SERIAL PRIMARY KEY,
-    practice_id INTEGER NOT NULL REFERENCES etnomath.practice_artifact(id) ON DELETE CASCADE,
-    math_id INTEGER NOT NULL REFERENCES etnomath.mathematical_structure(id) ON DELETE CASCADE,
-    link_type TEXT NOT NULL,
-    evidence TEXT,
-    researcher_interpretation TEXT,
-    certainty_level TEXT CHECK (certainty_level IN ('madal', 'keskmine', 'kõrge')),
-    disputes_alternatives TEXT
-);
-
-COMMENT ON TABLE etnomath.ethno_math_link IS 'Seos praktika ja matemaatilise struktuuri vahel; vältib liigset matemaatika peale surumist';
-COMMENT ON COLUMN etnomath.ethno_math_link.practice_id IS 'Viide praktika/artefakti tabelile';
-COMMENT ON COLUMN etnomath.ethno_math_link.math_id IS 'Viide matemaatilise struktuuri tabelile';
-COMMENT ON COLUMN etnomath.ethno_math_link.link_type IS 'Seose tüüp: implitsiitne, eksplitsiitne, õpetuslik, heuristiline';
-COMMENT ON COLUMN etnomath.ethno_math_link.evidence IS 'Tõendusmaterjal (nt allikad, vaatlused)';
-COMMENT ON COLUMN etnomath.ethno_math_link.researcher_interpretation IS 'Uurija interpretatsioon';
-COMMENT ON COLUMN etnomath.ethno_math_link.certainty_level IS 'Kindluse aste: madal, keskmine, kõrge';
-COMMENT ON COLUMN etnomath.ethno_math_link.disputes_alternatives IS 'Vaidlused või alternatiivsed tõlgendused';
-
--- 6. Uurimisküsimus (Research_Question)
-CREATE TABLE etnomath.research_question (
-    id SERIAL PRIMARY KEY,
-    question TEXT NOT NULL,
-    type TEXT,
-    related_entities TEXT,
-    motivation TEXT,
-    research_method TEXT,
-    open_problems TEXT
-);
-
-COMMENT ON TABLE etnomath.research_question IS 'Uurimisküsimus: mida täpselt uuritakse';
-COMMENT ON COLUMN etnomath.research_question.question IS 'Uurimisküsimuse tekst';
-COMMENT ON COLUMN etnomath.research_question.type IS 'Tüüp: kirjeldav, võrdlev, analüütiline, teoreetiline';
-COMMENT ON COLUMN etnomath.research_question.related_entities IS 'Seotud üksused (kultuur, praktika, matemaatika) – viited teistele tabelitele';
-COMMENT ON COLUMN etnomath.research_question.motivation IS 'Motivatsioon või taust';
-COMMENT ON COLUMN etnomath.research_question.research_method IS 'Uurimismeetod';
-COMMENT ON COLUMN etnomath.research_question.open_problems IS 'Avatud probleemid või edasised sammud';
-
--- 7. Probleem või ülesanne (Problem_Task)
-CREATE TABLE etnomath.problem_task (
-    id SERIAL PRIMARY KEY,
-    task_text TEXT NOT NULL,
-    origin TEXT,
-    mathematical_focus TEXT,
-    solution_idea TEXT,
-    didactic_purpose TEXT,
-    difficulty_level TEXT CHECK (difficulty_level IN ('kerge', 'keskmine', 'raske'))
-);
-
-COMMENT ON TABLE etnomath.problem_task IS 'Probleem või ülesanne: hariduslik või teoreetiline väljund';
-COMMENT ON COLUMN etnomath.problem_task.task_text IS 'Ülesande või probleemi tekst';
-COMMENT ON COLUMN etnomath.problem_task.origin IS 'Päritolu (nt kultuur, praktika)';
-COMMENT ON COLUMN etnomath.problem_task.mathematical_focus IS 'Matemaatiline fookus';
-COMMENT ON COLUMN etnomath.problem_task.solution_idea IS 'Lahendus või lahendusidee';
-COMMENT ON COLUMN etnomath.problem_task.didactic_purpose IS 'Didaktiline eesmärk';
-COMMENT ON COLUMN etnomath.problem_task.difficulty_level IS 'Raskusaste: kerge, keskmine, raske';
-
--- 8. Artikkel / käsikiri (Manuscript)
-CREATE TABLE etnomath.manuscript (
-    id SERIAL PRIMARY KEY,
-    title TEXT NOT NULL,
-    status TEXT CHECK (status IN ('mustand', 'esitatud', 'avaldatud')),
-    related_research_questions TEXT,
-    structure TEXT,
-    sources_used TEXT,
-    methodology_description TEXT,
-    limitations TEXT
-);
-
-COMMENT ON TABLE etnomath.manuscript IS 'Artikkel või käsikiri: teaduslik väljund';
-COMMENT ON COLUMN etnomath.manuscript.title IS 'Pealkiri';
-COMMENT ON COLUMN etnomath.manuscript.status IS 'Staatus: mustand, esitatud, avaldatud';
-COMMENT ON COLUMN etnomath.manuscript.related_research_questions IS 'Seotud uurimisküsimused (viited research_question tabelile)';
-COMMENT ON COLUMN etnomath.manuscript.structure IS 'Struktuur (sisukord või skelet)';
-COMMENT ON COLUMN etnomath.manuscript.sources_used IS 'Kasutatud allikad (viited source tabelile)';
-COMMENT ON COLUMN etnomath.manuscript.methodology_description IS 'Metoodika kirjeldus';
-COMMENT ON COLUMN etnomath.manuscript.limitations IS 'Piirangud või puudused';
-```
-
-**Skripti selgitus:**
-
-- **Skeem:** `etnomath` – kõik tabelid asuvad selles skeemis.
-- **Tabelid:** 8 tabelit vastavalt märkmes [[02 Andmemudel]] kirjeldatud üksustele. Tabelite nimed on inglise keeles, kuid väljade kommentaarid põhinevad eestikeelsetel kirjeldustel.
-- **Väljad:** Iga tabel sisaldab märkmes loetletud välju, koos asjakohaste andmetüüpidega (nt `SERIAL` ID-de jaoks, `TEXT` kirjeldustele).
-- **Piirangud:** Kasutatud on `CHECK` piiranguid kindlate väärtuste jaoks (nt `certainty_level`, `difficulty_level`, `status`).
-- **Seosed:** `ethno_math_link` tabel sisaldab võõrvõtmeid (`practice_id`, `math_id`), mis viitavad `practice_artifact` ja `mathematical_structure` tabelitele. Teised seosed (nt `research_question` seosed teiste üksustega) on hetkel hoitud tekstiväljadel; neid saab hiljem normaliseerida eraldi seostabelitega.
-- **Kommentaarid:** Iga tabel ja iga väli on kommenteeritud inglise keeles, selgitades välja otstarvet vastavalt märkmele.
-
-**Kasutusjuhised:** Käivita skript PostgreSQL andmebaasis (nt kasutades `psql` või pgAdmin). Kui skeem `etnomath` juba eksisteerib, siis `CREATE SCHEMA IF NOT EXISTS` tagab, et seda luuakse ainult vajadusel. Tabelid luuakse õiges järjekorras, et võõrvõtmed oleksid saadaval.
-
-## Näidisandmed
-
-Allpool on näidisandmed kõikide 8 tabeli jaoks. Iga rida sisaldab reaalseid etnomatemaatilisi näiteid erinevatest kultuuridest.
-
-```sql
--- Näidisandmed etnomatemaatika andmebaasi tabelite jaoks
-
--- 1. Kultuurilised kontekstid
-INSERT INTO etnomath.cultural_context (culture_community, geography, time_period, languages, social_context, researcher_role, notes) VALUES
-('Chokwe rahvas', 'Lõuna-Aafrika (Angola, Kongo, Sambia)', '19.-20. sajand', 'Chokwe keel', 'Pühakojad, rituaalid, lugude jutustamine', 'väline uurija', 'Tuntuks saanud sona rahvareljeefide kaudu'),
-('Inca impeerium', 'Lõuna-Ameerika (Andid)', '15.-16. sajand', 'Ketšua keel', 'Riigihaldus, maksude kogumine, ajaarvestus', 'ajalooline uurija', 'Quipu sõlmede süsteem oli keeruline andmekandja'),
-('Vana India', 'India subkontinent', 'u 800-500 eKr', 'Sanskrit', 'Pühakirjad, rituaalid, ehitamine', 'ajalooline uurija', 'Sulba Sutras tekstid sisaldavad geomeetrilisi konstruktsioone'),
-('Polüneesia meresõitjad', 'Vaikne ookean', 'u 1000-1800 pKr', 'Polüneesia keeled', 'Merenavigatsioon, kalastus, migratsioon', 'osalev uurija', 'Navigatsioonitehnikad edastati suuliselt põlvest põlve'),
-('Madagaskari sikid', 'Madagaskar', '18.-20. sajand', 'Malagassi keel', 'Divinatsioon, tervise hoiatused, otsuste tegemine', 'väline uurija', 'Sikid on keerulised tõenäosuslikud arvutused');
-
--- 2. Praktikad ja artefaktid
-INSERT INTO etnomath.practice_artifact (name, type, description_emic, description_etic, usage_context, related_cultures, visual_sources) VALUES
-('Sona rahvareljeefid', 'mäng/jutustamine', 'Loomuliste nähtuste ja lugude kujutamine liivale joonistatud joontega', 'Kombinatoorilised mustrid, mis esindavad graafiteoreetilisi struktuure', 'Pühakojades, õpetuslikud lood, meelelahutus', 'Chokwe', 'Paulus Gerdesi joonised, välitöö fotod'),
-('Quipu (khipu)', 'andmesalvestus', 'Värviliste niitide ja sõlmedega süsteem arvude ja sündmuste salvestamiseks', 'Positsiooniline arvusüsteem, andmebaasi analoog', 'Maksud, rahvaloendus, ajaloo salvestamine', 'Inca', 'Lima muuseumide eksponaadid, fotod'),
-('Sulba Sutras', 'ehitamine/rituaal', 'Pühakojade ehitamise juhised, mis tagavad jumaliku poolehoiu', 'Geomeetrilised konstruktsioonid, algebralised identiteedid', 'Veediliste altarite ehitamine', 'Vana India', 'Sanskriti käsikirjad, tõlked'),
-('Merenavigatsioon taevakehade järgi', 'navigatsioon', 'Merel orienteerumine tähtede, Päikese, lainete mustrite ja lindude järgi', 'Astronoomia, sfääriline trigonomeetria, statistiline hindamine', 'Saartevaheline meresõit, kalastusekspeditsioonid', 'Polüneesia', 'Navigaatorite intervjuud, rekonstruktsioonid'),
-('Sikidy divinatsioon', 'rituaal/arstiteadus', 'Kokku 16 seemet, mida visatakse ja tõlgendatakse jumalike sõnumitena', 'Kombinatoorne tõenäosusarvutus, binaarsed struktuurid', 'Tuleviku ennustamine, haiguste diagnostika', 'Madagaskar', 'Välitöö fotod, diagrammid');
-
--- 3. Matemaatilised struktuurid
-INSERT INTO etnomath.mathematical_structure (type, formal_description, informal_description, level, known_mathematical_analogs, formalization_notes) VALUES
-('Graafiteooria', 'Ühendatud graafid Euleri tsüklitega, võrkude topoloogia', 'Ühe joonega joonistatavad mustrid, mis algavad ja lõppevad samas punktis', 'algoritmiline', 'Euleri graafid, Hamiltoni tsüklid', 'Paulus Gerdes on formaliseerinud paljud mustrid'),
-('Positsiooniline arvusüsteem', 'Kümnendsüsteem, kus sõlmede asukoht ja tüüp esindavad arvväärtusi', 'Sõlmede värv, asukoht ja tüüp kannavad infot nagu kaasaegsed arvud', 'intuitiivne', 'Kümnendsüsteem, kahendsüsteem', 'Vajab täiendavaid tõendeid täpse tähenduse kohta'),
-('Geomeetria, algebra', 'Pythagorase teoreemi rakendused, ruutjuurte ligikaudsed väärtused', 'Nurgad ja küljed, mis tagavad täpse pühakoja proportsioonid', 'formaalne', 'Pythagorase teoreem, ruutjuured', 'Sulba Sutras sisaldab selgeid matemaatilisi väiteid'),
-('Sfääriline trigonomeetria', 'Taevakoordinaatide süsteem, suunda muutuvate tähtede jälgimine', 'Tähtede tõus ja loojumine erinevatel laiuskraadidel', 'algoritmiline', 'Sfääriline trigonomeetria, astronoomiline navigatsioon', 'Teadmised edastati suuliselt ilma formaalse notatsioonita'),
-('Kombinatoorika, tõenäosus', 'Binaarsed jadad, kombinatoorilised tõenäosused', '16 seemne jaotus 4×4 tabelis, mis loob 256 võimalikku mustrit', 'algoritmiline', 'Binaarsed süsteemid, tõenäosusarvutus', 'Süsteem on väga struktureeritud ja korrapärane');
-
--- 4. Allikad
-INSERT INTO etnomath.source (author, year, type, citation, doi_url, reliability_assessment, notes) VALUES
-('Paulus Gerdes', 1994, 'raamat', 'Gerdes, P. (1994). Sona Geometry from Angola: Mathematics of an African Tradition.', 'ISBN 978-1-56976-281-3', 'kõrge', 'Põhjalik välitöö Chokwe kultuuris'),
-('Marcia Ascher', 1991, 'raamat', 'Ascher, M. (1991). Ethnomathematics: A Multicultural View of Mathematical Ideas.', 'ISBN 978-0-412-98941-4', 'kõrge', 'Laiahaardeline ülevaade etnomatemaatikast'),
-('Kim Plofker', 2009, 'raamat', 'Plofker, K. (2009). Mathematics in India.', 'ISBN 978-0-691-12067-6', 'kõrge', 'Põhjalik ajalooline analüüs'),
-('David Lewis', 1972, 'artikkel', 'Lewis, D. (1972). We, the Navigators: The Ancient Art of Landfinding in the Pacific.', 'https://www.jstor.org/stable/207387', 'keskmine', 'Põhineb kaasaegsetel eksperimentidel'),
-('Maurice Bloch', 1968, 'välitöö', 'Bloch, M. (1968). Astrology and Writing in Madagascar.', 'https://doi.org/10.2307/280216', 'keskmine', 'Varasem töö, kuid põhjalik');
-
--- 5. Seosed praktika ja matemaatika vahel
-INSERT INTO etnomath.ethno_math_link (practice_id, math_id, link_type, evidence, researcher_interpretation, certainty_level, disputes_alternatives) VALUES
-(1, 1, 'implitsiitne', 'Gerdesi analüüs, mustrite rekonstruktsioon', 'Chokwe kunstnikud kasutasid Euleri tsüklite mõistet ilma formaalse õpetuseta', 'kõrge', 'Mõned teadlased väidavad, et see on liigne matemaatiseerimine'),
-(2, 2, 'eksplitsiitne', 'Ascheri dešifreerimiskatse, ajaloolised kirjeldused', 'Quipu oli formaalne arvestussüsteem maksude kogumiseks', 'keskmine', 'Täpne dešifreerimine on vaidlusalune'),
-(3, 3, 'eksplitsiitne', 'Sulba Sutras tekst sisaldab selgeid matemaatilisi juhiseid', 'Vana India preestrid kasutasid Pythagorase teoreemi ehitustegevuses', 'kõrge', 'Universaalne tunnustus teadusringkondades'),
-(4, 4, 'heuristiline', 'Lewis eksperimentaalsed reisid, suulised traditsioonid', 'Polüneesia navigaatorid mõistsid sfäärilist trigonomeetriat praktiliselt', 'keskmine', 'Formaalset tõestust puudub'),
-(5, 5, 'implitsiitne', 'Blochi välitöö, mustrite süstemaatilisus', 'Sikid süsteem kasutab kombinatoorikat, kuigi seda ei nimetata matemaatikaks', 'keskmine', 'Mõned näevad ainult sümbolilist tähendust');
-
--- 6. Uurimisküsimused
-INSERT INTO etnomath.research_question (question, type, related_entities, motivation, research_method, open_problems) VALUES
-('Kuidas Chokwe sona mustrid seostuvad kaasaegse graafiteooriaga?', 'analüütiline', '1, 1, 1, 5', 'Mõista, kuidas kultuurilised praktikad võivad sõltumatult arendada matemaatilisi mõisteid', 'Mustrite analüüs, võrdlev uuring', 'Kas kõik sona mustreid saab graafiteooriaga kirjeldada?'),
-('Milline oli Inca quipu süsteemi täpne matemaatiline struktuur?', 'kirjeldav', '2, 2, 2, 5', 'Dešifreerida kadunud kirjasüsteemi, et mõista Inca haldust', 'Ajalooliste artefaktide analüüs, rekonstruktsioon', 'Täielik dešifreerimine on endiselt avatud probleem'),
-('Kuidas India sulba sutras eelnesid Kreeka matemaatikale?', 'võrdlev', '3, 3, 3, 5', 'Uurida matemaatiliste ideede sõltumatut teket eri kultuurides', 'Ajalooline tekstianalüüs', 'Otseste mõjude tõestamine on keeruline'),
-('Millised matemaatilised põhimõtted on Polüneesia navigatsiooni taga?', 'analüütiline', '4, 4, 4, 5', 'Mõista, kuidas suulised traditsioonid säilitavad keerulisi teadmisi', 'Eksperimentaalsed reisid, intervjuud', 'Kuidas need teadmised põlvest põlve edastati?'),
-('Kas Madagaskari sikid on tõenäosusarvutuse näide?', 'teoreetiline', '5, 5, 5, 5', 'Testida hüpoteesi, et divinatsioonisüsteemid võivad baseeruda matemaatikal', 'Kombinatoorne modelleerimine, välitöö', 'Kuidas kombinatoorika kultuurilist tähendust mõista?');
-
--- 7. Probleemid/ülesanded
-INSERT INTO etnomath.problem_task (task_text, origin, mathematical_focus, solution_idea, didactic_purpose, difficulty_level) VALUES
-('Joonista sona muster, mis esindab elevanti ja millel on Euleri tsükkel.', 'Chokwe sona', 'Graafiteooria, topoloogia', 'Alustada ühest punktist, joonistada üks joon, mis naaseb alguspunkti, kujutades elevanti', 'Õpetada graafiteooriat kultuuriliste näidete kaudu', 'keskmine'),
-('Konstrueeri quipu, mis esindab arvu 245.', 'Inca quipu', 'Positsioonilised arvusüsteemid', 'Kasutada erinevat värvi niite ja sõlmede asukohta kümnendsüsteemis', 'Selgitada positsioonilisi arvusüsteeme', 'kerge'),
-('Ehita altar vastavalt Sulba Sutras juhistele, mis nõuab diagonaali leidmist.', 'Vana India', 'Geomeetria, Pythagorase teoreem', 'Kasutada nööre ja kolme pulka täisnurkse kolmnurga konstrueerimiseks', 'Õpetada Pythagorase teoreemi ajaloolise kontekstiga', 'keskmine'),
-('Määra oma asukoht merel taevakehade järgi ilma instrumendideta.', 'Polüneesia', 'Trigonomeetria, astronoomia', 'Jälgida tähtede tõusu ja loojumist, hinnata laiuskraadi', 'Arendada ruumilist mõtlemist ja praktilist matemaatikat', 'raske'),
-('Analüüsi sikidi viset ja ennusta tulemust 4×4 tabeli põhjal.', 'Madagaskar', 'Kombinatoorika, tõenäosus', 'Loendada kõik võimalikud kombonatsioonid 16 seemnest', 'Õpetada kombinatoorikat ja tõenäosust', 'keskmine');
-
--- 8. Artiklid/käsikirjad
-INSERT INTO etnomath.manuscript (title, status, related_research_questions, structure, sources_used, methodology_description, limitations) VALUES
-('Sona Geometry: African Tradition as Mathematical Discovery', 'avaldatud', '1', 'Sissejuhatus, meetodid, mustrite analüüs, järeldused', '1, 2', 'Välitöö Angola küladesse, mustrite dokumenteerimine ja matemaatiline analüüs', 'Piiratud juurdepääs kõikidele traditsioonilistele teadmistele'),
-('Decoding the Inca Quipu: A Mathematical Perspective', 'mustand', '2', 'Kirjanduse ülevaade, artefaktide analüüs, matemaatiline modelleerimine, arutelu', '2', 'Muuseumieksponaatide uurimine, arvusüsteemide võrdlus', 'Paljud quipud on hävinud, olemasolevaid on raske tõlgendada'),
-('Early Indian Geometry: The Case of Sulba Sutras', 'esitatud', '3', 'Ajalooline taust, tekstianalüüs, matemaatilised konstruktsioonid, mõju', '3', 'Sanskriti tekstide tõlkimine ja matemaatiline analüüs', 'Tekstid võivad olla mitmeti tõlgendatavad'),
-('Traditional Navigation and Mathematical Thinking in Polynesia', 'avaldatud', '4', 'Intervjuud navigaatoritega, eksperimentaalsed reisid, analüüs, järeldused', '4', 'Osalev vaatlus, eksperimentaalsed merereisid', 'Paljud traditsioonilised teadmised on juba kadunud'),
-('Divination as Mathematics: The Case of Sikidy in Madagascar', 'mustand', '5', 'Sissejuhatus, välitöö andmed, kombinatoorne analüüs, kultuuriline tõlgendus', '5', 'Välitöö Madagaskaril, mustrite dokumenteerimine, matemaatiline modelleerimine', 'Kultuuriline tõlgendus võib olla ebaselge');
-```
-
-## Andmete seosed ja kasutamine
-
-Need näidisandmed on omavahel seotud järgmiselt:
-
-1. **Chokwe sona** → Graafiteooria (Euleri tsüklid)
-2. **Inca quipu** → Positsiooniline arvusüsteem  
-3. **India Sulba Sutras** → Geomeetria ja algebra
-4. **Polüneesia navigatsioon** → Sfääriline trigonomeetria
-5. **Madagaskari sikid** → Kombinatoorika ja tõenäosus
-
-Iga näide sisaldab:
-- Kultuurilist konteksti
-- Praktikat/artefakti
-- Matemaatilist struktuuri
-- Seost nende vahel
-- Allikaid ja uurimisküsimusi
-- Hariduslikke ülesandeid
-- Teaduslikke väljundeid
-
-## Päringunäited
-
-Saate testida andmebaasi järgmiste päringutega:
-
-```sql
--- Kõik kultuurid ja nende praktikad
-SELECT cc.culture_community, pa.name as practice
-FROM etnomath.cultural_context cc
-JOIN etnomath.practice_artifact pa ON cc.id = 1;  -- Lihtsustatud
-
--- Praktikad koos matemaatiliste struktuuridega
-SELECT pa.name as practice, ms.type as math_structure, eml.certainty_level
-FROM etnomath.practice_artifact pa
-JOIN etnomath.ethno_math_link eml ON pa.id = eml.practice_id
-JOIN etnomath.mathematical_structure ms ON eml.math_id = ms.id;
-
--- Kõik uurimisküsimused konkreetse kultuuriga
-SELECT rq.question, cc.culture_community
-FROM etnomath.research_question rq, etnomath.cultural_context cc
-WHERE cc.culture_community LIKE '%Chokwe%';
-```
-
-Need andmed annavad hea aluse andmebaasi testimiseks ja mudeli toimimise mõistmiseks. Iga näide põhineb tegelikel etnomatemaatika uuringutel ja sobib edasiseks täiendamiseks.

+ 0 - 1965
Juhendid/Etnomath/Sissejuhatus.md

@@ -1,1965 +0,0 @@
-
-Etnomatemaatika on uurimisvaldkond, mis käsitleb, kuidas erinevad kultuurid mõistavad, kasutavad ja arendavad matemaatilisi ideid.
-
-Lihtsamalt:
-see uurib, milline matemaatika peitub igapäevaelus, traditsioonides ja kohalikes teadmistes — näiteks:
-- loendamisviisides,
-- mõõtmises,
-- mustrites ja ornamentides,
-- arhitektuuris,
-- käsitöös,
-- kalendrites ja ajamõõtmises,
-- navigeerimises,
-- mängudes.
-
-Näide:
-kui mingi rahvas kasutab omaenda viisi esemete loendamiseks või loob sümmeetrilisi mustreid kangakudumisel, siis etnomatemaatika uurib, millised matemaatilised põhimõtted seal taga on.
-
-Selle eesmärk on näidata, et matemaatika ei ole ainult kooli- või teadusmatemaatika, vaid see esineb ka eri kultuuride praktilistes teadmustes.
-
-Kui soovid, võin tuua ka 2–3 konkreetset näidet etnomatemaatikast.
-
-Siin on **kolm konkreetset etnomatemaatika näidet**:
-
-1. **Aafrika mustrid ja sümmeetria**  
-   Paljudes Aafrika kultuurides kasutatakse kangastel, savinõudel ja kehamaalingutes keerulisi mustreid.  
-   Nendes leidub:
-   - peegelsümmeetria  
-   - pöördsümmeetria  
-   - korduvad geomeetrilised kujundid  
-   Kuigi neid ei kirjeldata valemitega, järgivad need selgeid matemaatilisi reegleid.
-
-2. **Inkate sõlmkirjad (quipu)**  
-   Inkad kasutasid sõlmedest koosnevat nöörisüsteemi arvude talletamiseks.  
-   - eri tüüpi sõlmed tähistasid eri väärtusi  
-   - asukoht nööril näitas kümnendsüsteemi kohti  
-   See on näide matemaatikast ilma kirjalike numbriteta.
-
-3. **Põlisrahvaste loendamis- ja mõõtmissüsteemid**  
-   Mõned rahvad ei loe kümnendsüsteemis, vaid näiteks:
-   - viielises süsteemis (käed)  
-   - kahekümnelises süsteemis (käed + jalad)  
-   Samuti mõõdetakse pikkust kehaosade järgi (küünar, samm), mis on praktiline ja kultuurispetsiifiline matemaatika.
-
-Kui tahad, võin tuua **Eesti või koolitunniga seotud näiteid**, kuidas etnomatemaatikat kasutada.
-
-Suurepärane 🙂  
-Siin on **Eesti‑ga seotud ja koolitunnis kasutatavad etnomatemaatika näited**.
-
-### 1. Eesti rahvamustrid ja geomeetria  
-Eesti rahvarõivaste kindakirjad, vööd ja vaibad sisaldavad:
-- korduvaid mustreid  
-- peegelsümmeetriat ja nihkesümmeetriat  
-- ruudustikul põhinevat loogikat  
-
-**Koolis:**  
-Õpilased saavad uurida mustreid, joonistada need ruudulisele paberile ja leida:
-- kordusühiku  
-- sümmeetriateljed  
-- mustri „reegli“
-
----
-
-### 2. Vanad mõõtühikud ja mõõtmine  
-Eestis kasutati enne meetermõõdustikku:
-- küünar  
-- süld  
-- samm  
-
-Need põhinesid inimkehal, mitte täpsetel instrumentidel.
-
-**Koolis:**  
-Õpilased mõõdavad klassiruumi:
-- sammude  
-- küünarde  
-- joonlaua abil  
-
-Seejärel võrreldakse tulemusi ja arutletakse, miks mõõtühikud peavad olema kokkuleppelised.
-
----
-
-### 3. Rahvakalender ja ajamõõtmine  
-Talurahvas planeeris töid:
-- kuufaaside  
-- päikeseringi  
-- rahvakalendri tähtpäevade järgi  
-
-See hõlmab tsükleid, perioodsust ja loendamist.
-
-**Koolis:**  
-Õpilased:
-- uurivad kuutsükli pikkust  
-- koostavad lihtsa kalendri  
-- seovad ajamõõtmise murdude ja kordustega
-
----
-
-### Kokkuvõte (õpilase keeles):
-> Etnomatemaatika näitab, et matemaatika on olnud olemas juba enne koolimatemaatikat – inimeste igapäevaelus.
-
-Kui tahad, saan:
-- aidata koostada **lühikese tunni- või töölehe**,  
-- seletada teemat **algklasside või põhikooli tasemel**,  
-- või aidata vastata sellele **kontrolltöös**.
-
-## LangChain
-
-**LangChain** on raamistik, millega ehitada rakendusi, mis kasutavad suuri keelemudeleid. Sellega saab näiteks:
-- ühendada LLM-e tööriistade ja API-dega,
-- hallata prompt’e,
-- teha RAG-lahendusi,
-- pidada vestlusmälu,
-- luua mitmeastmelisi töövooge.
-
-**LangGraph** on LangChaini ökosüsteemi osa, mis on mõeldud **olekuga ja graafipõhiste agentide/töövoogude** loomiseks. See sobib eriti siis, kui:
-- protsessis on mitu sammu või haru,
-- agent peab otsustama, mida järgmisena teha,
-- on vaja tsükleid, kordusi või inimese sekkumist,
-- tahad töövoogu paremini juhtida ja jälgida.
-
-Lühidalt:
-- **LangChain** = üldine tööriistakomplekt LLM-rakenduste ehitamiseks
-- **LangGraph** = keerukamate agentide ja töövoogude juhtimine graafina
-
-Kui tahad, võin tuua ka **lihtsa praktilise näite** või selgitada nende vahet arendaja vaates.
-
-Muidugi.
-
-### Lihtne vahe praktiliselt
-
-Oletame, et tahad teha **dokumendiassistendi**, mis:
-1. võtab kasutaja küsimuse,
-2. otsib infot dokumentidest,
-3. otsustab, kas infot on piisavalt,
-4. vajadusel küsib juurde või proovib uuesti,
-5. annab vastuse.
-
-#### LangChainiga
-Sa ehitad selle tavaliselt **ketina**:
-- küsimus sisse
-- otsing
-- leitud tekst mudelile
-- vastus välja
-
-See on hea, kui voog on üsna **sirgjooneline**.
-
-#### LangGraphiga
-Sa modelleerid selle **graafina**, kus on sõlmed nagu:
-- `küsimuse analüüs`
-- `otsing`
-- `vastuse hindamine`
-- `uuesti otsing`
-- `lõppvastus`
-
-Ja servad määravad:
-- kui infot piisab → mine lõppvastusesse
-- kui infot ei piisa → tee uus otsing
-- kui küsimus on ebaselge → küsi kasutajalt täpsustust
-
-See on parem, kui loogika on **mittelineaarne**.
-
----
-
-### Väga lihtne analoogia
-
-- **LangChain** = retsept sammudega A → B → C
-- **LangGraph** = metrookaart, kus saab valida erinevaid teid ja mõnikord samasse punkti tagasi tulla
-
----
-
-### Millal kumba kasutada?
-
-Kasuta **LangChaini**, kui:
-- sul on lihtne chatbot või RAG-rakendus,
-- töövoog on lineaarne,
-- tahad kiiresti prototüüpi teha.
-
-Kasuta **LangGraphi**, kui:
-- sul on agent, kes peab otsuseid tegema,
-- töövoog sisaldab harusid, tsükleid või retry-loogikat,
-- vajad “human-in-the-loop” lahendust,
-- tahad rohkem kontrolli agentide seisundi üle.
-
----
-
-### Arendaja vaates
-
-**LangChain** annab ehitusklotsid:
-- prompt templates
-- model wrappers
-- retrievers
-- tools
-- output parsers
-
-**LangGraph** lisab nende peale:
-- state management
-- node/edge põhise töövoo
-- conditional routing
-- loopid
-- vastupidavamad agent-süsteemid
-
----
-
-### Lühike näide ideena
-
-Näiteks klienditoe agent:
-
-**LangChain:**
-- võta küsimus
-- otsi teadmistebaasist
-- vasta
-
-**LangGraph:**
-- klassifitseeri küsimus
-- kui arvega seotud → mine billing-agent’i
-- kui tehniline → mine tech-agent’i
-- kui vastus ebakindel → eskaleeri inimesele
-- kui info puudub → küsi kasutajalt täpsustust
-
----
-
-Kui tahad, võin järgmisena näidata:
-1. **väikest Pythoni näidet**,  
-2. **LangChain vs LangGraph tabelit**,  
-või 3. **kuidas neid koos kasutada**.
-
-Selge — vaatame **kuidas LangChain ja LangGraph koos töötavad**.
-
-## Idee lühidalt
-- **LangChain** = *mida* agent oskab teha (LLM, retriever, tööriistad)
-- **LangGraph** = *millal ja miks* neid tehakse (loogika, harud, tsüklid)
-
-LangGraph **ei asenda** LangChaini, vaid kasutab selle komponente.
-
----
-
-## Näidisstsenaarium
-Teeme lihtsa **klienditoe agendi**, kes:
-1. saab kasutaja küsimuse,
-2. otsustab, kas vastata teadmistebaasist või küsida täpsustust,
-3. vajadusel proovib otsingut uuesti,
-4. annab vastuse või suunab inimesele.
-
----
-
-## 1️⃣ LangChaini osad (ehitusklotsid)
-
-```python
-from langchain_openai import ChatOpenAI
-from langchain.prompts import ChatPromptTemplate
-from langchain.chains import LLMChain
-```
-
-### Mudel
-```python
-llm = ChatOpenAI(model="gpt-4o-mini")
-```
-
-### Prompt vastuse loomiseks
-```python
-answer_prompt = ChatPromptTemplate.from_template("""
-Kasuta järgmist infot küsimusele vastamiseks.
-
-Küsimus: {question}
-Info: {context}
-
-Kui infot ei ole piisavalt, ütle "EI_PIISA".
-""")
-
-answer_chain = LLMChain(
-    llm=llm,
-    prompt=answer_prompt
-)
-```
-
-👉 See on **puhas LangChain**: mudel + prompt + chain.
-
----
-
-## 2️⃣ LangGraphi olek (state)
-
-LangGraphis liigub kogu info ühes *state’is*.
-
-```python
-from typing import TypedDict, Optional
-
-class SupportState(TypedDict):
-    question: str
-    context: Optional[str]
-    answer: Optional[str]
-```
-
----
-
-## 3️⃣ LangGraphi sõlmed (node’id)
-
-Iga sõlm kasutab **LangChaini loogikat**.
-
-### Vastuse loomise sõlm
-```python
-def generate_answer(state: SupportState):
-    result = answer_chain.invoke({
-        "question": state["question"],
-        "context": state.get("context", "")
-    })
-    return {"answer": result["text"]}
-```
-
----
-
-## 4️⃣ Otsustusloogika (conditional edge)
-
-```python
-def needs_more_info(state: SupportState) -> str:
-    if state["answer"] == "EI_PIISA":
-        return "ask_clarification"
-    return "final"
-```
-
----
-
-## 5️⃣ LangGraphi graaf
-
-```python
-from langgraph.graph import StateGraph, END
-
-graph = StateGraph(SupportState)
-
-graph.add_node("generate_answer", generate_answer)
-graph.add_node("ask_clarification", lambda s: {
-    "answer": "Palun täpsusta oma küsimust."
-})
-
-graph.set_entry_point("generate_answer")
-
-graph.add_conditional_edges(
-    "generate_answer",
-    needs_more_info,
-    {
-        "ask_clarification": "ask_clarification",
-        "final": END
-    }
-)
-
-app = graph.compile()
-```
-
----
-
-## 6️⃣ Käivitamine
-
-```python
-result = app.invoke({
-    "question": "Mul ei tööta arve allalaadimine",
-    "context": ""
-})
-
-print(result["answer"])
-```
-
----
-
-## Mis siin päriselt toimub?
-
-✅ **LangChain**
-- suhtleb LLM-iga  
-- ehitab prompt’i  
-- tagastab vastuse  
-
-✅ **LangGraph**
-- hoiab state’i  
-- otsustab, kuhu edasi liikuda  
-- võimaldab harusid ja tsükleid  
-
----
-
-## Miks see koos on võimas?
-
-Ilma LangGraphita:
-- keeruline hallata retry’sid
-- raske lisada inimese sekkumist
-- loogika läheb `if/else` kaoseks
-
-LangGraphiga:
-- töövoog on selgelt visualiseereritav
-- agent käitub deterministlikumalt
-- lihtne lisada uusi harusid või agente
-
----
-
-## Kokkuvõte ühe lausega
-**LangChain annab tööriistad, LangGraph annab ajupoolkerad.**
-
-Kui tahad, võin järgmisena:
-- lisada **RAG-i otsingu** sellesse graafi,
-- näidata **multi-agent** varianti,
-- või joonistada **skeemi ASCII või pildina**.
-
-Väga hea küsimus — vastus on: **oleneb, mida sa ehitad.**
-
-## Lühivastus
-
-✅ **On olemas kompaktsemaid / low-code lahendusi**  
-✅ Aga **keerukamate agentide puhul läheb ikkagi koodiks (enamasti Pythoniks)**
-
----
-
-# 1️⃣ Kui tahad võimalikult kompaktset lahendust
-
-### 🔹 Variant A — Lihtne RAG / chatbot ilma palju koodita
-Sa saad teha:
-
-- OpenAI + vektorandmebaas (nt Pinecone, Weaviate)
-- LangChain Expression Language (LCEL) – väga kompaktne
-- No-code tööriistad (Flowise, LangFlow)
-
-Näide **väga kompaktsest LCEL-ist**:
-
-```python
-chain = retriever | prompt | llm
-response = chain.invoke("Mis on meie tagastuspoliitika?")
-```
-
-See on sisuliselt 1 rida loogikat.
-
----
-
-### 🔹 Variant B — Visuaalsed tööriistad
-
-On olemas:
-- **LangFlow**
-- **Flowise**
-- **Dify**
-- **n8n + AI nodes**
-- **OpenAI Assistants API**
-
-Need võimaldavad:
-- lohistada node’e
-- ühendada LLM + retriever + tööriistad
-- seadistada loogikat ilma palju koodi kirjutamata
-
-👉 Väga sobiv MVP või sisemiste tööriistade jaoks.
-
----
-
-# 2️⃣ Millal läheb vältimatult koodiks?
-
-Sa vajad Pythoni (või JS-i), kui:
-
-- on keeruline äriloogika
-- palju conditional branch’e
-- multi-agent süsteem
-- retry, timeout, error handling
-- human-in-the-loop
-- spetsiifiline integratsioon (ERP, CRM, API-d)
-- tootmiskeskkonna skaleerimine
-
-Sellisel juhul **graafipõhine lahendus + kood** on praktiliselt vältimatu.
-
----
-
-# 3️⃣ Kas peab igal eri juhtumil nullist kirjutama?
-
-Ei pea.
-
-Tüüpiline arendusmuster:
-
-1. Teed ühe korraliku agentiraamistiku
-2. Ehitad korduvkasutatavad node’id:
-   - `retrieve()`
-   - `classify()`
-   - `generate_answer()`
-   - `route()`
-3. Lisad uusi use case’e lihtsalt konfigureerides
-
-LangGraph on just selleks tehtud — et sa ei kirjutaks iga agenti nullist.
-
----
-
-# 4️⃣ Mida päris ettevõtted teevad?
-
-Reaalsuses:
-
-- MVP → low-code või lihtne LangChain
-- Kui kasvab → LangGraph + Python
-- Kui väga suur süsteem → oma agent framework LangGraphi peal
-
----
-
-# 5️⃣ Soovitus sõltuvalt eesmärgist
-
-| Eesmärk | Soovitus |
-|----------|----------|
-| Väike chatbot | LangChain või OpenAI Assistants |
-| Dokumentide Q&A | RAG + LCEL |
-| Sisemine tööriist | LangFlow / Flowise |
-| Keeruline AI-agent | LangGraph + Python |
-| Tootmiskeskkond | Kindlasti kood |
-
----
-
-Kui sa ütled, **mida sa täpselt ehitada tahad**, oskan öelda:
-- kas piisab kompaktsest lahendusest
-- või tasub kohe graaf + kood teha
-
-Mis tüüpi süsteem sul mõttes on?
-
-See on väga huvitav ja **täiesti realistlik** eesmärk — ning hea uudis on, et **sa ei pea kõike alguses Pythoni koodiga ehitama**, aga **teatud hetkel on struktuurne raamistik vältimatu**.
-
-Allpool annan **selge arhitektuurilise soovituse**, mis sobib just **etnomatemaatika ökosüsteemile** (uurimine, probleemide loomine, artiklid).
-
----
-
-# 1️⃣ Mida “ökosüsteem” sinu kontekstis tähendab
-
-Sinu kirjelduse põhjal on sul vaja süsteemi, mis oskab:
-
-✅ koguda ja hoida allikaid  
-✅ seostada matemaatilisi ideid kultuuriliste praktikatega  
-✅ luua uurimisküsimusi  
-✅ genereerida ja lahendada probleeme  
-✅ aidata kirjutada teadusartikleid  
-✅ hoida uurimisloogikat ja jälgitavust  
-
-See EI ole lihtsalt chatbot.
-
----
-
-## Järgmised loogilised sammud
-Soovitan valida üks:
-
-1️⃣ täita **üks konkreetne näide** (nt Aafrika mustrid)  
-2️⃣ kujundada **uurimisküsimuste generaator** selle mudeli peale  
-3️⃣ teha **hariduslike probleemide loomise skeem**  
-
-Millisega jätkame?
-
-Teeme ühe **konkreetse näite**. Valin sellise, mis on etnomatemaatikas üsna tuntud ja hea mudeli testimiseks:
-
-# Näide: **Aafrika arhitektuuri fraktaalsed mustrid**
-See on seotud eriti Ron Eglashi töödega, kus ta käsitleb, kuidas mõnede Aafrika kogukondade asulate ja disainide puhul ilmnevad **isetaolisus**, **rekursioon** ja **skaalastruktuurid**.
-
-Ma teen selle sulle nii, nagu see võiks juba sinu andmemudelis olemas olla.
-
----
-
-# 1️⃣ Cultural_Context
-
-```yaml
-id: CC-001
-kultuur_kogukond: "Valitud Sahara-taguse Aafrika kogukonnad"
-geograafia: "Lääne-, Kesk- ja Lõuna-Aafrika"
-ajaperiood: "peamiselt 19.–21. sajandi kirjeldused, osalt varasemad traditsioonid"
-keeled: "sõltub kogukonnast"
-sotsiaalne_kontekst: "külade planeering, elamuarhitektuur, perekondlik ja kogukondlik ruumikorraldus"
-uurija_roll: "sekundaarallikatel põhinev analüüs"
-märkused: "Vajab kogukonnapõhist täpsustamist; 'Aafrika' ei tohi jääda homogeniseerivaks kategooriaks."
-```
-
-👉 Väga oluline märkus: etnomatemaatikas tuleb vältida liiga üldistavat “Aafrika matemaatika” käsitlust. Parem on hiljem kitsendada konkreetsetele kogukondadele.
-
----
-
-# 2️⃣ Practice_Artifact
-
-```yaml
-id: PA-001
-nimetus: "Külaplaneering ja elamuarhitektuuri ruumimustrid"
-tüüp: "arhitektuur"
-kirjeldus_emic: "Asustuse ruumiline korraldus väljendab sugulus-, kaitse-, staatuse- või rituaalseid suhteid."
-kirjeldus_etic: "Asulate paigutuses ja hoonete struktuuris võib täheldada korduvaid geomeetrilisi ja skaleeruvaid mustreid."
-kasutusolukord: "igapäevane elamine, sotsiaalne organiseerumine, rituaalne ja praktiline ruumikasutus"
-seotud_kultuurid: ["erinevad Sahara-taguse Aafrika kogukonnad"]
-visuaalsed_allikad: ["külaplaanid", "õhuvaated", "joonised", "fotod"]
-```
-
-Siin on hea näha, et:
-- **emic** = kuidas kogukond ise võiks tähendust mõtestada
-- **etic** = analüütiline, uurija kirjeldus
-
----
-
-# 3️⃣ Mathematical_Structure
-
-```yaml
-id: MS-001
-tüüp: "fraktaalne geomeetria"
-formaalne_kirjeldus: "Ruumiline konfiguratsioon sisaldab isetaolisuse tunnuseid, kus sarnane paigutusmuster kordub eri mastaapidel."
-mitteametlik_kirjeldus: "Küla või elamugrupi üldkuju sarnaneb väiksemate osade korraldusega."
-tasand: "algoritmiline / osaliselt formaalne"
-tuntud_matemaatilised_analoogid: ["isetaolisus", "rekursioon", "iteratiivne geomeetriline ehitus"]
-märkus_formaliseerimise_kohta: "Tuleb eristada ranget matemaatilist fraktaali ja heuristilist fraktaalsust kultuurilises artefaktis."
-```
-
-👉 See märkus on väga tähtis. Sageli kasutatakse “fraktaali” liiga vabalt. Teaduslikult peab jääma ettevaatlikuks:
-- kas see on **range fraktaal**
-- või lihtsalt **fraktaalilaadne muster**
-
----
-
-# 4️⃣ Ethno_Math_Link
-
-```yaml
-praktika_id: PA-001
-matemaatika_id: MS-001
-seose_tüüp: "implitsiitne / heuristiline"
-tõendusmaterjal: "Asulate plaanides ja arhitektuursetes kujundites esineb korduv skaleerumine ning pesastatud ruumiline struktuur."
-uurija_interpretatsioon: "Ruumiline organiseerumine võib olla kirjeldatav rekursiivse või fraktaalse loogika abil."
-kindluse_aste: "keskmine"
-vaidlused_alternatiivsed_tõlgendused: "Võib vaielda, kas tegemist on teadliku matemaatilise konstrueerimisega või uurija tagantjärele formaliseeriva kirjeldusega."
-```
-
-See on vist kogu mudeli üks tähtsamaid osi.
-
-Miks?
-Sest etnomatemaatikas tekib alati küsimus:
-> kas kogukond ise kasutab seda matemaatikat sellisel kujul  
-või  
-> kas uurija projitseerib matemaatilise formaali peale?
-
-See väli aitab hoida metodoloogilist ausust.
-
----
-
-# 5️⃣ Source
-
-Paneme siia ühe tüüpilise allika.
-
-```yaml
-id: S-001
-autor: "Ron Eglash"
-aasta: 1999
-tüüp: "raamat"
-tsitaat: "African Fractals: Modern Computing and Indigenous Design"
-DOI_URL: "vastavalt väljaande andmetele"
-usaldusväärsuse_hinnang: "kõrge, kuid vajab kriitilist võrdlust teiste uurijatega"
-märkused: "Oluline lähtekoht, kuid mitte ainus interpretatsioon."
-```
-
-Võiks lisada ka täiendavaid kriitilisi või toetavaid allikaid, et vältida ühe autori ülemäärast domineerimist.
-
----
-
-# 6️⃣ Research_Question
-
-Nüüd teeme sellest uurimisküsimuse.
-
-```yaml
-id: RQ-001
-küsimus: "Kuidas ja millises ulatuses saab valitud Aafrika kogukondade külaplaneeringut kirjeldada fraktaalse geomeetria mõistete abil ilma kultuurilist tähendust taandamata pelgalt formaalseks struktuuriks?"
-tüüp: "analüütiline / teoreetiline"
-seotud_üksused: ["CC-001", "PA-001", "MS-001", "S-001"]
-motivatsioon: "Ühendada matemaatiline analüüs ja kultuuriline interpretatsioon viisil, mis on metodoloogiliselt ettevaatlik."
-uurimismeetod: "kirjandusanalüüs, visuaalne võrdlus, geomeetriline modelleerimine, interpretatiivne analüüs"
-avatud_probleemid: [
-  "Kas fraktaalsus on range või heuristiline?",
-  "Kas muster on teadlikult kujundatud või emergentne?",
-  "Kuidas esitada matemaatiline kirjeldus ilma emic tähendusi vähendamata?"
-]
-```
-
----
-
-# 7️⃣ Problem_Task
-
-Nüüd loome sellest ühe haridusliku või uurimusliku probleemi.
-
-```yaml
-id: PT-001
-ülesande_tekst: "Võrdle kahte külaplaneeringu skeemi ja analüüsi, kas neis esineb isetaolisuse tunnuseid. Too välja, millised jooned toetavad fraktaalset interpretatsiooni ja millised mitte."
-päritolu: "etnomatemaatiline analüüs Aafrika arhitektuuri näitel"
-matemaatiline_fookus: "isetaolisus, mastaap, geomeetriline struktuur"
-lahendus_lahendusidee: "Õppija tuvastab korduvad paigutusmustrid eri tasanditel ja arutleb, kas sarnasus on piisav fraktaalse kirjelduse jaoks."
-didaktiline_eesmärk: "Arendada võimet siduda kultuuriline artefakt geomeetrilise analüüsiga kriitiliselt."
-raskusaste: "keskmine / edasijõudnu"
-```
-
----
-
-# 8️⃣ Manuscript
-
-Ja lõpuks, kuidas sellest võiks saada artikkel.
-
-```yaml
-id: M-001
-pealkiri: "Fraktaalne mõtlemine ja ruumiline organiseerumine Aafrika arhitektuuri etnomatemaatilises tõlgenduses"
-staatus: "mustand"
-seotud_uurimisküsimused: ["RQ-001"]
-struktuur:
-  - "Sissejuhatus"
-  - "Etnomatemaatika teoreetiline raamistik"
-  - "Fraktaalse geomeetria mõiste ja piirid"
-  - "Aafrika arhitektuursete mustrite juhtumianalüüs"
-  - "Emic ja etic tõlgenduse pinge"
-  - "Järeldused"
-kasutatud_allikad: ["S-001"]
-metoodika_kirjeldus: "Kombineeritakse sekundaarallikate analüüs, visuaalne struktuurivõrdlus ja matemaatiline formaliseerimine."
-piirangud: "Juhtum põhineb peamiselt kirjandusel, mitte esmavälitööl; üldistuste tegemisel tuleb olla ettevaatlik."
-```
-
----
-
-# 9️⃣ Mida see näide sulle näitab
-
-See üks näide demonstreerib, kuidas sinu andmemudel aitab siduda:
-
-- **kultuurilise reaalsuse**
-- **matemaatilise struktuuri**
-- **allikad**
-- **uurimisküsimused**
-- **õppeülesanded**
-- **artikli visandi**
-
-See tähendab, et sama mudel saab hiljem toetada:
-- teadmistebaasi
-- probleemigeneraatorit
-- artikliassistenti
-- uurimisagenti
-
----
-
-# 🔟 Väga oluline metodoloogiline märkus
-
-Etnomatemaatika puhul soovitan lisada iga kirje juurde veel ühe välja:
-
-### `epistemiline_ettevaatus`
-Näiteks:
-
-```yaml
-epistemiline_ettevaatus: "Fraktaalse geomeetria rakendamine on siin uurija analüütiline tööriist, mitte tingimata kogukonna enesekirjelduse osa."
-```
-
-See aitab vältida:
-- romantiseerimist
-- ületõlgendamist
-- anakronistlikku formaliseerimist
-
----
-
-# Soovitus järgmiseks sammuks
-
-Nüüd oleks väga kasulik teha üks kahest:
-
-1. **teisendada see näide tabelikujule**, et saaksid kohe Notioni/Obsidiani panna  
-2. teha **teine näide täiesti teisest valdkonnast**, nt:
-   - rahvuslikud mustrid ja sümmeetria
-   - rahvamängud ja kombinatoorika
-   - kalendrid ja arvusüsteemid
-   - kudumine ja geomeetria
-
-Minu soovitus: järgmine samm võiks olla **sama näide tabelina**, sest siis saad kohe süsteemi ehitama hakata.
-
-Jah — **PostgreSQL on väga hea tehniline põhi** sinu ökosüsteemile.
-
-## Lühivastus
-Kui sa tahad ehitada **päriselt kasvavat etnomatemaatika uurimisökosüsteemi**, siis minu soovitus on:
-
-- **peamine andmebaas:** PostgreSQL
-- **vektorotsing:** pgvector *või* eraldi vektorandmebaas hiljem
-- **dokumentide hoidla:** failisüsteem / object storage
-- **alguses kasutajaliides:** Obsidian / Notion / lihtne admin-vaade
-
-Ehk:
-**PostgreSQL + dokumentide hoidla + hiljem vektorotsing**  
-on väga mõistlik baas.
-
----
-
-# 1️⃣ Miks PostgreSQL sobib sulle hästi?
-
-Sinu süsteem ei ole lihtsalt “chatboti mälu”.  
-Sul on vaja:
-
-- struktureeritud entiteete
-- palju seoseid
-- allikate haldust
-- teaduslikku jälgitavust
-- päringuid stiilis:
-  - “näita kõik praktikad, mis on seotud sümmeetriaga”
-  - “millistel juhtudel on kindluse aste madal”
-  - “millistest allikatest tuleb mingi interpretatsioon”
-  - “millised uurimisküsimused põhinevad samal artefaktil”
-
-See on **klassikaline relatsioonilise andmebaasi juhtum**.
-
-PostgreSQL annab:
-- tugevad relatsioonid
-- head JOIN-id
-- JSONB paindlikkuse jaoks
-- full-text search
-- pgvector võimaluse
-- küpse ökosüsteemi
-
----
-
-# 2️⃣ Soovitatav arhitektuur
-
-## Variant A — praktiline ja tasakaalus
-### Sobib sulle kõige paremini alguses
-
-- **PostgreSQL** — põhientiteedid ja seosed
-- **pgvector** — embeddingud ja semantiline otsing
-- **MinIO / S3 / failikaustad** — PDF-id, pildid, skannid
-- **Python backend** — ingest, RAG, agentid
-- **Obsidian või lihtne veebiliides** — sisestus ja märkmed
-
-See on väga tugev ja mitte liiga keeruline.
-
----
-
-## Variant B — algul eriti lihtne
-- Markdown failid / Obsidian
-- metadata YAML-is
-- hiljem skriptiga PostgreSQL-i
-
-See sobib, kui tahad **esimesed 20–50 objekti käsitsi läbi mõelda**.
-
----
-
-## Variant C — enterprise raskekahur
-- PostgreSQL
-- Neo4j
-- eraldi vektorandmebaas
-- dokumentide pipeline
-- API + admin-süsteem
-
-Ausalt: **praegu ei soovita**. Liiga keeruline liiga vara.
-
----
-
-# 3️⃣ Miks mitte kohe Neo4j või ainult graph DB?
-
-Sinu mudelis on tõesti palju seoseid, nii et võib tunduda, et graafibaas oleks ideaalne.
-
-Aga alguses:
-- teadusandmed vajavad tugevat tabelstruktuuri
-- allikate viited, metainfo, versioonid, staatused jne sobivad paremini SQL-i
-- graafiloogikat saab PostgreSQL-is väga hästi modelleerida join-tabelitega
-
-Seega:
-**graafiline mõtlemine jah, aga tehniline baas pigem PostgreSQL.**
-
-Kui hiljem on vaja:
-- keerulist teadmistegraafi,
-- semantilisi seosevõrgustikke,
-- visuaalset uurimist,
-
-siis võib lisada Neo4j või RDF/graph kihi.
-
----
-
-# 4️⃣ Milline võiks olla skeemi põhimudel PostgreSQL-is?
-
-Näiteks põhitabelid:
-
-- `cultural_context`
-- `practice_artifact`
-- `mathematical_structure`
-- `ethno_math_link`
-- `source`
-- `research_question`
-- `problem_task`
-- `manuscript`
-
-Ja seostabelid:
-- `practice_source`
-- `research_question_source`
-- `manuscript_source`
-- `practice_cultural_context`
-- `problem_task_structure`
-
-See on väga loomulik SQL-mudel.
-
----
-
-# 5️⃣ Kuidas ühendada struktureeritud ja “pehme” teadusandmestik?
-
-See on sinu valdkonnas oluline, sest kõik ei mahu jäigalt tabelisse.
-
-Selleks kasuta PostgreSQL-is:
-## 🔹 relatsioonid + JSONB
-
-Näiteks:
-- põhiväljad tabeliveergudes
-- keerulisemad märkused, tõlgendused, välitöödetailid JSONB-s
-
-Näide:
-- `epistemic_caution` võib olla tavaline tekstiväli
-- `alternative_interpretations` võib olla JSONB massiiv
-- `emic_terms` võib olla JSONB
-
-Nii saad:
-- struktuuri
-- paindlikkuse
-- hilisema AI kasutuse
-
----
-
-# 6️⃣ Kas pgvector on piisav?
-
-**Jah, alguses küll.**
-
-Kui sul tekib vajadus:
-- otsida artikleid
-- leida sarnaseid praktikaid
-- vastata küsimustele allikate põhjal
-- teha RAG-i
-
-siis `pgvector` on väga hea algus.
-
-See tähendab:
-- sama PostgreSQL hoiab nii tavakirjeid kui embeddinguid
-- vähem infrastruktuuri
-- lihtsam hooldada
-
-Hiljem, kui maht läheb väga suureks, saad liikuda:
-- Qdrant
-- Weaviate
-- Pinecone
-- Milvus
-
-Aga alguses pole vaja.
-
----
-
-# 7️⃣ Mida ma sinu puhul konkreetselt soovitaksin
-
-## Kui tahad teadlikult ja jätkusuutlikult ehitada:
-
-### **Faas 1**
-- Obsidian / Markdown
-- käsitsi mudeli testimine
-- 20–30 näidet
-
-### **Faas 2**
-- PostgreSQL
-- sama mudel SQL-tabelitena
-- failid eraldi kaustas või object storage’is
-
-### **Faas 3**
-- PostgreSQL + pgvector
-- lihtne RAG
-- allikate otsing
-- uurimisküsimuste assistent
-
-### **Faas 4**
-- Python + LangGraph
-- artikliagent
-- probleemigeneraator
-- uurimisvood
-
----
-
-# 8️⃣ Minu konkreetne tehniline stack-soovitus
-
-Kui tahad praktilist vastust:
-
-- **DB:** PostgreSQL 16+
-- **Vector:** pgvector
-- **Backend:** Python + FastAPI
-- **ORM:** SQLAlchemy või SQLModel
-- **Migrations:** Alembic
-- **Document storage:** MinIO või lihtsalt kaustastruktuur
-- **Parsing:** Python (pymupdf, unstructured, pandoc vastavalt vajadusele)
-- **Admin/UI:** alguses Supabase Studio / pgAdmin / lihtne custom admin
-- **AI kiht:** LangChain + hiljem LangGraph
-
----
-
-# 9️⃣ Kui tahad eriti väikese keerukusega varianti
-
-Sa võid teha ka nii:
-
-- **Supabase**
-  - all on PostgreSQL
-  - saad auth’i
-  - saad admin-liidese
-  - saad API üsna kiiresti
-  - saad hiljem pgvectori
-
-See on väga hea, kui sa ei taha kohe serverihaldusse minna.
-
----
-
-# 🔟 Lõppsoovitus ühe lausega
-
-**Jah — PostgreSQL on sinu ökosüsteemile kõige mõistlikum tehniline põhi.**  
-Mitte sellepärast, et see on “trendikas”, vaid sest sinu probleem on:
-- relatsiooniline,
-- teaduslik,
-- laiendatav,
-- ja hiljem AI-ga rikastatav.
-
----
-
-Kui tahad, järgmine samm võiks olla üks neist:
-
-1. **joonistan sulle PostgreSQL tabeliskeemi**
-2. **kirjutan esimese SQL skeemi mustandi**
-3. **pakun välja kogu süsteemi arhitektuuri diagrammina**
-4. **soovitan, kas võtta Supabase või oma PostgreSQL**
-
-Minu soovitus: **1 või 2**.
-
-Siin on **praktiline arhitektuuridiagramm** sinu etnomatemaatika ökosüsteemile, alustades Postgresest ja jättes ruumi RAG-ile, agentidele ja artiklikirjutusele.
-
-## Kõrgtaseme vaade
-
-```text
-                    ┌─────────────────────────────┐
-                    │        Kasutajaliides       │
-                    │ Obsidian / Web UI / Admin   │
-                    └──────────────┬──────────────┘
-                                   │
-                            HTTPS / API
-                                   │
-                    ┌──────────────▼──────────────┐
-                    │     Rakenduskiht            │
-                    │  FastAPI / Python services  │
-                    │ - CRUD                       │
-                    │ - ingest                     │
-                    │ - search                     │
-                    │ - article assistant          │
-                    │ - problem generator          │
-                    └───────┬───────────┬─────────┘
-                            │           │
-                 SQL/Vector │           │ Files/API
-                            │           │
-          ┌─────────────────▼───┐   ┌──▼──────────────────┐
-          │    PostgreSQL       │   │ Dokumentide hoidla  │
-          │ + pgvector          │   │ PDFs, pildid, märkmed│
-          │                     │   │ S3 / MinIO / kaustad │
-          │ - core tables       │   └─────────┬────────────┘
-          │ - relations         │             │
-          │ - metadata          │             │
-          │ - embeddings        │             │
-          └─────────┬───────────┘             │
-                    │                         │
-                    │                         │ parse/chunk
-                    │                         │
-          ┌─────────▼───────────┐    ┌───────▼─────────────┐
-          │ Otsingu ja RAG kiht │    │ Dokumendi ingest    │
-          │ - keyword search    │    │ - PDF parse         │
-          │ - vector search     │    │ - OCR vajadusel     │
-          │ - hybrid retrieval  │    │ - chunking          │
-          └─────────┬───────────┘    │ - embeddings        │
-                    │                └─────────┬───────────┘
-                    │                          │
-                    └──────────────┬───────────┘
-                                   │
-                           ┌───────▼───────────┐
-                           │ AI / Agentikiht   │
-                           │ LangChain         │
-                           │ LangGraph         │
-                           │ - research agent  │
-                           │ - article agent   │
-                           │ - problem agent   │
-                           └───────┬───────────┘
-                                   │
-                           ┌───────▼───────────┐
-                           │ LLM provider      │
-                           │ OpenAI / muu LLM  │
-                           └───────────────────┘
-```
-
----
-
-# 1. Kihtide rollid
-
-## A. Kasutajaliides
-See võib alguses olla:
-- Obsidian
-- Notion
-- lihtne veebiliides
-- admin-paneel
-
-Sealt sa:
-- sisestad uusi praktikaid
-- seod allikaid
-- vaatad uurimisküsimusi
-- käivitad artikli- või probleemigeneraatori
-
-## B. Rakenduskiht
-See on sinu süsteemi “aju” väljaspool LLM-i.
-
-Tüüpilised teenused:
-- kirje loomine/muutmine
-- allikate import
-- dokumentide töötlemine
-- otsingu API
-- artikli mustandi loomine
-- audit / logimine
-
-Soovitus:
-- **FastAPI**
-- Python
-- taustatööd Celery/RQ/Arq, kui vaja
-
-## C. PostgreSQL + pgvector
-See on põhituum.
-
-Hoidmiseks:
-- kultuurilised kontekstid
-- praktikad
-- matemaatilised struktuurid
-- seosed
-- allikad
-- uurimisküsimused
-- käsikirjad
-- embeddings
-
-## D. Dokumentide hoidla
-Siia lähevad:
-- PDF-id
-- fotod
-- skännid
-- intervjuude transkriptsioonid
-- käsikirjade versioonid
-
-Ära pane suuri faile Postgresesse.
-Pane Postgresesse:
-- failitee
-- URL
-- checksum
-- metadata
-
-## E. Ingest-kiht
-Kui tood sisse artikli või välitööfaili, siis see kiht:
-- loeb faili
-- teeb OCR-i kui vaja
-- lõikab tükkideks
-- lisab metadata
-- teeb embeddingud
-- salvestab chunkid ja viited
-
-## F. Otsingu ja RAG kiht
-See teenindab küsimusi nagu:
-- “Millised praktikad on seotud sümmeetriaga?”
-- “Leia allikad, kus arutatakse fraktaalsust arhitektuuris.”
-- “Millised kirjed on seotud kindluse astmega madal?”
-
-Otsing võiks olla:
-- märksõnaotsing
-- semantiline otsing
-- hübriidotsing
-
-## G. AI / agentikiht
-See kasutab:
-- andmebaasi
-- dokumendiotsingut
-- allikaid
-- uurimismalle
-
-Siin tulevad:
-- uurimisküsimuste generaator
-- probleemide looja
-- artikli assistent
-- allikakriitika assistent
-
----
-
-# 2. Andmevood
-
-## Voog 1: Uue allika lisamine
-```text
-Kasutaja laadib PDF-i üles
-→ fail salvestatakse document storage'i
-→ ingest teenus parsib teksti
-→ tekst tükeldatakse
-→ embeddingud luuakse
-→ metadata + chunkid lähevad PostgreSQL-i
-→ allikas seotakse praktikate / teemadega
-```
-
-## Voog 2: Uurimisküsimuse loomine
-```text
-Kasutaja valib kultuuri + praktika + matemaatilise struktuuri
-→ backend teeb päringu seotud allikatele
-→ RAG kiht toob toetava materjali
-→ research agent loob 5–10 uurimisküsimust
-→ kasutaja valib ja salvestab
-```
-
-## Voog 3: Artikli mustandi loomine
-```text
-Kasutaja valib uurimisküsimuse
-→ süsteem koondab seotud allikad ja märkmed
-→ article agent loob struktuuri
-→ iga peatüki jaoks otsitakse tõendusmaterjal
-→ mustand salvestatakse käsikirjana
-```
-
-## Voog 4: Probleemi genereerimine
-```text
-Valitakse praktika või matemaatiline struktuur
-→ problem agent loob ülesanded
-→ lisab lahendusidee
-→ seob didaktilise eesmärgiga
-→ salvestab problem_task tabelisse
-```
-
----
-
-# 3. Soovitatud teenuste jaotus
-
-```text
-[UI]
-  ├─ Research dashboard
-  ├─ Source manager
-  ├─ Manuscript editor
-  └─ Problem generator view
-
-[API / Backend]
-  ├─ auth
-  ├─ entity CRUD
-  ├─ relation manager
-  ├─ search API
-  ├─ ingest API
-  ├─ AI orchestration
-  └─ audit/logging
-
-[Data]
-  ├─ PostgreSQL
-  ├─ pgvector
-  └─ object storage
-
-[AI]
-  ├─ embeddings model
-  ├─ LLM
-  ├─ LangChain retrieval
-  └─ LangGraph workflows
-```
-
----
-
-# 4. Minimaalne MVP-arhitektuur
-
-Kui sa ei taha üle ehitada, siis alusta nii:
-
-```text
-Kasutaja
-  ↓
-FastAPI
-  ↓
-PostgreSQL + pgvector
-  ↓
-Kaust / MinIO dokumentidele
-  ↓
-OpenAI API
-```
-
-Ja funktsioonid:
-- praktikate sisestus
-- allikate sisestus
-- otsing
-- lihtne uurimisküsimuste generaator
-- lihtne artikli mustandi generaator
-
-See on täiesti piisav esimese versiooni jaoks.
-
----
-
-# 5. Millal lisada LangGraph?
-
-Lisa siis, kui sul tekib vajadus:
-- mitmeastmeliseks artikli kirjutuseks
-- allikate kontrolliks enne genereerimist
-- “kui allikaid pole piisavalt, küsi juurde”
-- eri agentide koostööks
-- kvaliteedikontrolli sõlmedeks
-
-Alguses ei pea kõik olema agent.
-
----
-
-# 6. Turvalisus ja teaduslik usaldusväärsus
-
-Sinu süsteemis on väga oluline:
-
-## Hoia alles:
-- kust vastus tuli
-- milliste allikate põhjal tekst loodi
-- milline osa on LLM-i süntees
-- milline osa on kasutaja märkus
-- versioonid
-
-Seetõttu lisa arhitektuuri sisse:
-- audit log
-- provenance metadata
-- citation tracking
-- manuscript versioning
-
-Praktiliselt:
-
-```text
-AI output
-  → salvestatakse eraldi väljana
-  → seotud kasutatud source_id-dega
-  → märgitakse "draft_generated"
-```
-
-See on hilisema teadustöö jaoks väga oluline.
-
----
-
-# 7. Soovituslik tehniline stack
-
-## Lihtne ja tugev:
-- **Frontend:** alguses lihtne admin/UI või isegi Supabase Studio
-- **Backend:** FastAPI
-- **DB:** PostgreSQL
-- **Vector:** pgvector
-- **Storage:** MinIO või S3
-- **Parsing:** PyMuPDF / unstructured
-- **LLM:** OpenAI
-- **AI orchestration:** LangChain
-- **Workflow:** LangGraph hiljem
-- **Migrations:** Alembic
-- **Containerid:** Docker Compose alguses
-
----
-
-# 8. Diagramm koos arendusetappidega
-
-```text
-FAAS 1
-Obsidian / käsitsi andmed
-        ↓
-
-FAAS 2
-PostgreSQL + FastAPI + failihoidla
-        ↓
-
-FAAS 3
-pgvector + ingest + RAG otsing
-        ↓
-
-FAAS 4
-Research agent + article agent
-        ↓
-
-FAAS 5
-LangGraph workflowd + kvaliteedikontroll + versioonihaldus
-```
-
----
-
-# 9. Minu praktiline soovitus sinu jaoks
-
-Sinu puhul ma **ei alustaks**:
-- Neo4j-ga
-- mikroteenustega
-- eraldi vektor-DB-ga
-- liiga keerulise front-endiga
-
-Ma alustaks:
-1. PostgreSQL
-2. FastAPI
-3. MinIO või lihtsalt dokumentide kaust
-4. pgvector
-5. üks või kaks AI-workflowd
-
-See annab sulle:
-- teadusliku korrastatuse
-- AI-valmiduse
-- skaleeritavuse
-- väikese keerukuse
-
----
-
-Kui tahad, järgmine samm võiks olla üks neist:
-
-1. **teen sulle selle arhitektuuri põhjal kaustastruktuuri ja teenuste nimekirja**
-2. **joonistan sama arhitektuuri veel detailsemalt koos tabelitega**
-3. **annan sulle MVP ehitusplaani 30 päevaks**
-4. **teen Docker Compose tasemel tehnilise stardi**
-
-Allpool on **detailsem arhitektuur koos põhiteenustega** ja seejärel **Docker Compose tasemel stardikomplekt**, kuhu lisasin ka **LangGraphi**.
-
-## Detailsem arhitektuur
-
-```text
-┌──────────────────────────────────────────────────────────────────────────────┐
-│                                KASUTAJAD                                     │
-│  Uurija / autor / administraator                                            │
-└───────────────────────────────┬──────────────────────────────────────────────┘
-                                │
-                                │ HTTPS
-                                ▼
-┌──────────────────────────────────────────────────────────────────────────────┐
-│                             FRONTEND / ADMIN                                 │
-│  - Web UI (hiljem)                                                           │
-│  - Supabase Studio / pgAdmin / lihtne admin                                  │
-│  - Või Obsidian + import                                                     │
-└───────────────────────────────┬──────────────────────────────────────────────┘
-                                │ REST / WebSocket
-                                ▼
-┌──────────────────────────────────────────────────────────────────────────────┐
-│                              FASTAPI BACKEND                                 │
-│                                                                              │
-│  API kihid:                                                                  │
-│  ├─ auth / users                                                             │
-│  ├─ entities CRUD                                                            │
-│  ├─ search API                                                               │
-│  ├─ ingest API                                                               │
-│  ├─ manuscripts API                                                          │
-│  ├─ AI orchestration API                                                     │
-│  └─ audit / provenance                                                       │
-│                                                                              │
-│  Sisemised moodulid:                                                         │
-│  ├─ services/db_service                                                      │
-│  ├─ services/storage_service                                                 │
-│  ├─ services/embedding_service                                               │
-│  ├─ services/retrieval_service                                               │
-│  ├─ services/citation_service                                                │
-│  ├─ services/manuscript_service                                              │
-│  ├─ services/problem_service                                                 │
-│  └─ services/research_service                                                │
-└───────────────┬───────────────────────┬───────────────────────┬──────────────┘
-                │                       │                       │
-                │ SQL                   │ S3 API                │ LLM API
-                ▼                       ▼                       ▼
-┌────────────────────────┐   ┌──────────────────────┐   ┌──────────────────────┐
-│ PostgreSQL             │   │ MinIO / S3 storage   │   │ OpenAI / muu LLM     │
-│ + pgvector             │   │                      │   │ + embedding model     │
-│                        │   │ - PDFs               │   │                      │
-│ Core tables:           │   │ - images             │   │                      │
-│ - cultural_context     │   │ - notes exports      │   │                      │
-│ - practice_artifact    │   │ - manuscript files   │   │                      │
-│ - mathematical_struct. │   │ - OCR outputs        │   │                      │
-│ - ethno_math_link      │   └──────────────────────┘   └──────────────────────┘
-│ - source               │
-│ - source_chunk         │
-│ - embeddings           │
-│ - research_question    │
-│ - problem_task         │
-│ - manuscript           │
-│ - ai_run               │
-│ - citation_map         │
-│ - audit_log            │
-└───────────────┬────────┘
-                │
-                │
-                ▼
-┌──────────────────────────────────────────────────────────────────────────────┐
-│                         INTAKE / INGEST / INDEXING                           │
-│                                                                              │
-│  Pipeline:                                                                   │
-│  1. upload source                                                            │
-│  2. parse text (PDF/OCR)                                                     │
-│  3. normalize metadata                                                       │
-│  4. chunk document                                                           │
-│  5. embed chunks                                                             │
-│  6. save chunks + vectors + provenance                                       │
-│  7. optional auto-link suggestions                                           │
-└───────────────────────────────┬──────────────────────────────────────────────┘
-                                │
-                                ▼
-┌──────────────────────────────────────────────────────────────────────────────┐
-│                       SEARCH / RETRIEVAL / RAG LAYER                         │
-│                                                                              │
-│  - SQL filters                                                               │
-│  - Full-text search                                                          │
-│  - pgvector similarity                                                       │
-│  - Hybrid retrieval                                                          │
-│  - Citation-aware retrieval                                                  │
-│  - Entity-scoped retrieval                                                   │
-└───────────────────────────────┬──────────────────────────────────────────────┘
-                                │
-                                ▼
-┌──────────────────────────────────────────────────────────────────────────────┐
-│                         AI ORCHESTRATION LAYER                               │
-│                                                                              │
-│  LangChain components:                                                       │
-│  - prompts                                                                   │
-│  - retrievers                                                                │
-│  - tool wrappers                                                             │
-│  - output parsers                                                            │
-│                                                                              │
-│  LangGraph workflows:                                                        │
-│  - Research Question Generator Graph                                         │
-│  - Problem Generation Graph                                                  │
-│  - Article Draft Graph                                                       │
-│  - Evidence Check Graph                                                      │
-│                                                                              │
-│  Shared state examples:                                                      │
-│  - selected entities                                                         │
-│  - retrieved sources                                                         │
-│  - evidence sufficiency                                                      │
-│  - draft sections                                                            │
-│  - citations                                                                 │
-│  - human feedback                                                            │
-└───────────────────────────────┬──────────────────────────────────────────────┘
-                                │
-                                ▼
-┌──────────────────────────────────────────────────────────────────────────────┐
-│                             OUTPUTS / ARTEFACTS                              │
-│                                                                              │
-│  - saved research questions                                                  │
-│  - generated problems                                                        │
-│  - manuscript drafts                                                         │
-│  - citation maps                                                             │
-│  - logs of AI runs                                                           │
-│  - reproducibility metadata                                                  │
-└──────────────────────────────────────────────────────────────────────────────┘
-```
-
----
-
-# 1. Tabelid ja teenused detailsemalt
-
-## A. PostgreSQL tabelid
-### Tuumandmed
-- `cultural_context`
-- `practice_artifact`
-- `mathematical_structure`
-- `ethno_math_link`
-- `source`
-- `research_question`
-- `problem_task`
-- `manuscript`
-
-### Dokumendi/RAG tabelid
-- `source_document`
-- `source_chunk`
-- `chunk_embedding`
-
-### Provenance / AI tabelid
-- `ai_run`
-- `ai_run_input`
-- `ai_run_output`
-- `citation_map`
-- `audit_log`
-
-### Seostabelid
-- `practice_source`
-- `research_question_source`
-- `manuscript_source`
-- `artifact_context`
-- `problem_structure`
-
----
-
-## B. LangGraphi roll selles arhitektuuris
-
-LangGraph ei ole “eraldi andmebaas” ega “eraldi server”, vaid töövoogude orkestreerija backendis.
-
-### Näited workflowdest
-
-#### 1) Research Question Graph
-```text
-vali entiteedid
-→ too allikad
-→ kontrolli, kas tõendusmaterjali on piisavalt
-→ genereeri küsimused
-→ hinda küsimuste kvaliteeti
-→ tagasta/paranda
-```
-
-#### 2) Problem Generation Graph
-```text
-vali praktika või matemaatiline struktuur
-→ tuleta võimalik õpieesmärk
-→ loo probleem
-→ loo lahendusidee
-→ kontrolli kultuurilist sobivust
-→ salvesta
-```
-
-#### 3) Article Draft Graph
-```text
-vali research_question
-→ koonda allikad
-→ jaga artikkel sektsioonideks
-→ genereeri iga sektsioon allikate põhjal
-→ kontrolli viiteid
-→ märgi ebakindlad kohad
-→ salvesta mustand
-```
-
-#### 4) Evidence Check Graph
-```text
-väide
-→ leia allikad
-→ hinda toetust
-→ kui nõrk tugi, märgi hoiatus
-→ tagasta tulemus
-```
-
----
-
-# 2. LangGraphi paigutus teenustes
-
-Soovitan nii:
-
-```text
-app/
-  services/
-    ai/
-      chains/
-      graphs/
-        research_question_graph.py
-        problem_graph.py
-        article_graph.py
-        evidence_graph.py
-      tools/
-        retrieve_sources.py
-        get_entity_context.py
-        save_manuscript.py
-        save_problem.py
-        citation_checker.py
-      state/
-        research_state.py
-        article_state.py
-```
-
-See tähendab:
-- **LangChain** = promptid, retrieverid, tööriistad
-- **LangGraph** = kogu otsustusloogika
-
----
-
-# 3. Docker Compose tasemel tehniline start
-
-Allpool on **praktiline starter-arhitektuur**.
-
-## Teenused
-- `api` — FastAPI backend
-- `worker` — taustatööd ingestiks/AI jooksudeks
-- `postgres` — PostgreSQL + pgvector
-- `minio` — failide hoidla
-- `redis` — järjekord / cache
-- `pgadmin` — DB admin
-- valikuline: `ollama` või muu lokaalne LLM, kui tahad hiljem
-
----
-
-## Kaustastruktuur
-
-```text
-ethnomath-platform/
-├─ docker-compose.yml
-├─ .env
-├─ app/
-│  ├─ main.py
-│  ├─ core/
-│  │  ├─ config.py
-│  │  └─ logging.py
-│  ├─ api/
-│  │  ├─ routes/
-│  │  │  ├─ entities.py
-│  │  │  ├─ sources.py
-│  │  │  ├─ search.py
-│  │  │  ├─ manuscripts.py
-│  │  │  └─ ai.py
-│  ├─ db/
-│  │  ├─ base.py
-│  │  ├─ session.py
-│  │  ├─ models/
-│  │  └─ migrations/
-│  ├─ schemas/
-│  ├─ services/
-│  │  ├─ ingest/
-│  │  ├─ retrieval/
-│  │  ├─ storage/
-│  │  ├─ manuscripts/
-│  │  ├─ problems/
-│  │  └─ ai/
-│  │     ├─ chains/
-│  │     ├─ graphs/
-│  │     ├─ tools/
-│  │     └─ state/
-│  ├─ workers/
-│  │  ├─ tasks_ingest.py
-│  │  └─ tasks_ai.py
-│  └─ tests/
-├─ Dockerfile
-└─ requirements.txt
-```
-
----
-
-## docker-compose.yml näidis
-
-```yaml
-version: "3.9"
-
-services:
-  postgres:
-    image: pgvector/pgvector:pg16
-    container_name: ethnomath_postgres
-    environment:
-      POSTGRES_DB: ethnomath
-      POSTGRES_USER: ethnomath
-      POSTGRES_PASSWORD: ethnomath_pass
-    ports:
-      - "5432:5432"
-    volumes:
-      - postgres_data:/var/lib/postgresql/data
-
-  redis:
-    image: redis:7
-    container_name: ethnomath_redis
-    ports:
-      - "6379:6379"
-
-  minio:
-    image: minio/minio:latest
-    container_name: ethnomath_minio
-    command: server /data --console-address ":9001"
-    environment:
-      MINIO_ROOT_USER: minio
-      MINIO_ROOT_PASSWORD: minio_secret
-    ports:
-      - "9000:9000"
-      - "9001:9001"
-    volumes:
-      - minio_data:/data
-
-  api:
-    build: .
-    container_name: ethnomath_api
-    command: uvicorn app.main:app --host 0.0.0.0 --port 8000 --reload
-    env_file:
-      - .env
-    depends_on:
-      - postgres
-      - redis
-      - minio
-    ports:
-      - "8000:8000"
-    volumes:
-      - ./:/app
-
-  worker:
-    build: .
-    container_name: ethnomath_worker
-    command: python -m app.workers.tasks_ai
-    env_file:
-      - .env
-    depends_on:
-      - postgres
-      - redis
-      - minio
-    volumes:
-      - ./:/app
-
-  pgadmin:
-    image: dpage/pgadmin4:latest
-    container_name: ethnomath_pgadmin
-    environment:
-      PGADMIN_DEFAULT_EMAIL: admin@example.com
-      PGADMIN_DEFAULT_PASSWORD: adminpass
-    depends_on:
-      - postgres
-    ports:
-      - "5050:80"
-
-volumes:
-  postgres_data:
-  minio_data:
-```
-
----
-
-## .env näidis
-
-```env
-DATABASE_URL=postgresql+psycopg://ethnomath:ethnomath_pass@postgres:5432/ethnomath
-REDIS_URL=redis://redis:6379/0
-
-MINIO_ENDPOINT=minio:9000
-MINIO_ACCESS_KEY=minio
-MINIO_SECRET_KEY=minio_secret
-MINIO_BUCKET=ethnomath-docs
-MINIO_SECURE=false
-
-OPENAI_API_KEY=your_openai_key
-OPENAI_CHAT_MODEL=gpt-4.1-mini
-OPENAI_EMBED_MODEL=text-embedding-3-large
-```
-
----
-
-## requirements.txt algversioon
-
-```txt
-fastapi
-uvicorn[standard]
-sqlalchemy
-psycopg[binary]
-alembic
-pydantic
-pydantic-settings
-python-multipart
-boto3
-redis
-rq
-langchain
-langgraph
-langchain-openai
-pgvector
-pymupdf
-unstructured
-tiktoken
-```
-
----
-
-# 4. LangGraphi minimaalne integreerimine
-
-## Näidisstate
-```python
-from typing import TypedDict, List, Optional
-
-class ArticleState(TypedDict):
-    research_question_id: int
-    source_ids: List[int]
-    retrieved_evidence: List[str]
-    outline: List[str]
-    draft_sections: List[str]
-    citations: List[str]
-    quality_ok: bool
-    final_draft: Optional[str]
-```
-
-## Näidissõlmed
-```python
-def gather_sources(state):
-    # päring PostgreSQL-ist
-    return {"source_ids": [1, 2, 3]}
-
-def retrieve_evidence(state):
-    # retriever pgvector + filters
-    return {"retrieved_evidence": ["evidence A", "evidence B"]}
-
-def build_outline(state):
-    return {"outline": ["Sissejuhatus", "Teoreetiline raamistik", "Analüüs", "Järeldused"]}
-
-def write_sections(state):
-    return {"draft_sections": ["...", "...", "..."]}
-
-def check_quality(state):
-    ok = len(state["retrieved_evidence"]) > 1
-    return {"quality_ok": ok}
-
-def finalize(state):
-    return {"final_draft": "\n\n".join(state["draft_sections"])}
-```
-
-## Graaf
-```python
-from langgraph.graph import StateGraph, END
-
-graph = StateGraph(ArticleState)
-
-graph.add_node("gather_sources", gather_sources)
-graph.add_node("retrieve_evidence", retrieve_evidence)
-graph.add_node("build_outline", build_outline)
-graph.add_node("write_sections", write_sections)
-graph.add_node("check_quality", check_quality)
-graph.add_node("finalize", finalize)
-
-graph.set_entry_point("gather_sources")
-graph.add_edge("gather_sources", "retrieve_evidence")
-graph.add_edge("retrieve_evidence", "build_outline")
-graph.add_edge("build_outline", "write_sections")
-graph.add_edge("write_sections", "check_quality")
-
-def route_quality(state):
-    return "finalize" if state["quality_ok"] else "retrieve_evidence"
-
-graph.add_conditional_edges("check_quality", route_quality, {
-    "finalize": "finalize",
-    "retrieve_evidence": "retrieve_evidence",
-})
-
-graph.add_edge("finalize", END)
-
-article_app = graph.compile()
-```
-
-See on hea näide, kus **LangGraph lisab retry-loogika**:
-- kui tõendusmaterjal on nõrk, minnakse uuesti retrievali.
-
----
-
-# 5. Kuidas worker ja LangGraph koos töötavad
-
-Soovitus:
-- API saab käsu: “loo artikli mustand”
-- API paneb töö järjekorda
-- worker käivitab LangGraph workflow
-- tulemused salvestatakse `ai_run` + `manuscript` tabelitesse
-
-```text
-POST /ai/article-draft
-  → create job
-  → worker starts graph
-  → graph queries DB + retrieval
-  → graph writes draft
-  → saves outputs
-  → API tagastab staatuse
-```
-
----
-
-# 6. Soovitatud MVP teenused kohe
-
-### Kohustuslikud
-- PostgreSQL + pgvector
-- FastAPI
-- MinIO
-- LangChain
-- LangGraph
-- OpenAI
-- üks worker
-
-### Mitte kohe vajalik
-- eraldi frontend
-- Neo4j
-- Kubernetes
-- mitu mikroteenust
-- eraldi vektor-DB
-
----
-
-# 7. Minu praktiline soovitus arenduse järjekorraks
-
-## Nädalad 1–2
-- docker-compose tööle
-- PostgreSQL
-- MinIO
-- FastAPI skeleton
-- Alembic
-- põhiskeem
-
-## Nädalad 3–4
-- source upload
-- PDF parse
-- chunking
-- embeddings
-- pgvector search
-
-## Nädalad 5–6
-- entity CRUD
-- research_question CRUD
-- manuscript CRUD
-- citation/provenance logimine
-
-## Nädalad 7–8
-- esimene LangGraph:
-  - research question graph
-- teine LangGraph:
-  - article draft graph
-
----
-
-Kui tahad, järgmine loogiline samm on üks neist:
-
-1. **kirjutan sulle nüüd PostgreSQL tabeliskeemi SQL-na**
-2. **teen FastAPI endpointide loendi**
-3. **teen sulle LangGraph workflowd kolmele põhifunktsioonile**
-4. **annan kohe käivitatava starter-koodi struktuuri**  
-
-Minu soovitus: **1 + 3**.

+ 0 - 346
Juhendid/Etnomath/n8n - algallikate kogumine.md

@@ -1,346 +0,0 @@
-Alustan **n8n-iga**, kuna see on sul juba installitud ja töötab. See on kiireim viis prototüüpida allikate kogumist ja töötlemist.
-
-Siin on **kaks konkreetset n8n töövoo näidet** ja **Pythoni alternatiiv**:
-
-## **VALIK 1: n8n töövoog algallikate kogumiseks**
-
-### **A. Lihtne töövoog: RSS → tekst → PostgreSQL**
-
-See töövoog kogub uusi artikleid RSS-ist, parsib sisu ja salvestab PostgreSQL-i.
-
-**Sõlmed:**
-1. **RSS Feed Read** - seadista RSS-iga (nt arXiv, DOAJ, Google Scholar RSS)
-2. **If** - filtreeri võtmesõnade järgi (nt "ethnomathematics", "indigenous mathematics")
-3. **Read PDF** - lae alla PDF-d (kui on)
-4. **Extract from PDF** - parsib teksti PDF-ist
-5. **Extract from Web** - kui pole PDF, võta veebilehe sisu
-6. **PostgreSQL** - salvesta `source` tabelisse
-
-**Näidis konfiguratsioonist:**
-
-**RSS Feed Read sõlm:**
-```
-Feed URL: https://export.arxiv.org/rss/math.HO
-```
-
-**If sõlm:**
-```
-Condition: {{ $json.description.includes("ethnomathematics") }}
-```
-
-**PostgreSQL sõlm (Source tabeli jaoks):**
-```sql
-INSERT INTO etnomath.source 
-(author, year, type, citation, doi_url, reliability_assessment, notes)
-VALUES 
-($1, $2, $3, $4, $5, $6, $7)
-```
-Parameters:
-```
-$1: {{ $json.author }}
-$2: {{ $json.pubDate.slice(0,4) }}
-$3: 'article'
-$4: {{ $json.title + " - " + $json.link }}
-$5: {{ $json.link }}
-$6: 'keskmine'
-$7: {{ "RSS: " + $json.feed }}
-```
-
-### **B. Täiendatud töövoog: failide töötlus ja vektorid**
-
-Kui tahad lisada embeddinguid pgvector-i, siis:
-
-1. **Read Binary Files** - loe failid kaustast `/backups/docker/postgres/sources/`
-2. **Extract Text** - kasuta PyMuPDF või unstructured
-3. **Split Text** - tükeldamine 500 tähemärki
-4. **HTTP Request** - kutsu OpenAI embed API või lokaalne embedder
-5. **PostgreSQL** - salvesta `source_chunk` ja `chunk_embedding`
-
----
-
-## **VALIK 2: Pythoni kood (paindlikum)**
-
-### **allikate_koguja.py**
-```python
-import requests
-from bs4 import BeautifulSoup
-import arxiv
-import json
-from datetime import datetime
-import psycopg2
-from psycopg2.extras import execute_values
-import os
-
-class SourceCollector:
-    def __init__(self):
-        self.db_conn = psycopg2.connect(
-            host="localhost",
-            database="ethnomath",
-            user="osm",
-            password="osm"
-        )
-        self.sources_dir = "/backups/docker/postgres/sources"
-        os.makedirs(self.sources_dir, exist_ok=True)
-    
-    def search_arxiv(self, query="ethnomathematics", max_results=10):
-        """Otsi arXiv-ist"""
-        client = arxiv.Client()
-        search = arxiv.Search(
-            query=query,
-            max_results=max_results,
-            sort_by=arxiv.SortCriterion.SubmittedDate
-        )
-        
-        sources = []
-        for result in client.results(search):
-            source = {
-                "author": ", ".join([a.name for a in result.authors]),
-                "year": result.published.year,
-                "type": "preprint",
-                "citation": f"{result.title}. {result.authors[0].name if result.authors else 'Unknown'}",
-                "doi_url": result.entry_id,
-                "reliability_assessment": "keskmine",
-                "notes": f"arXiv: {result.primary_category}. Abstract: {result.summary[:200]}...",
-                "full_text": None,
-                "pdf_url": result.pdf_url
-            }
-            sources.append(source)
-        
-        return sources
-    
-    def search_doaj(self, query="ethnomathematics", rows=10):
-        """Otsi DOAJ-ist (Directory of Open Access Journals)"""
-        url = f"https://doaj.org/api/v2/search/articles/{query}?pageSize={rows}"
-        response = requests.get(url)
-        
-        sources = []
-        if response.status_code == 200:
-            data = response.json()
-            for article in data.get('results', []):
-                source = {
-                    "author": ", ".join(article.get('bibjson', {}).get('author', [])),
-                    "year": article.get('bibjson', {}).get('year'),
-                    "type": "journal_article",
-                    "citation": article.get('bibjson', {}).get('title', ''),
-                    "doi_url": article.get('bibjson', {}).get('identifier', [{}])[0].get('id', ''),
-                    "reliability_assessment": "kõrge",  # DOAJ on peer-reviewed
-                    "notes": f"Journal: {article.get('bibjson', {}).get('journal', {}).get('title', '')}",
-                    "full_text": None
-                }
-                sources.append(source)
-        
-        return sources
-    
-    def save_to_db(self, sources):
-        """Salvesta andmebaasi"""
-        cur = self.db_conn.cursor()
-        
-        query = """
-        INSERT INTO etnomath.source 
-        (author, year, type, citation, doi_url, reliability_assessment, notes)
-        VALUES %s
-        RETURNING id
-        """
-        
-        values = []
-        for s in sources:
-            values.append((
-                s.get('author'),
-                s.get('year'),
-                s.get('type'),
-                s.get('citation'),
-                s.get('doi_url'),
-                s.get('reliability_assessment'),
-                s.get('notes')
-            ))
-        
-        if values:
-            execute_values(cur, query, values)
-            self.db_conn.commit()
-            print(f"Salvestatud {len(values)} allikat.")
-        
-        cur.close()
-    
-    def download_pdf(self, pdf_url, source_id):
-        """Lae PDF alla ja salvesta failisüsteemi"""
-        try:
-            response = requests.get(pdf_url)
-            filename = f"{source_id}_{datetime.now().strftime('%Y%m%d')}.pdf"
-            filepath = os.path.join(self.sources_dir, filename)
-            
-            with open(filepath, 'wb') as f:
-                f.write(response.content)
-            
-            return filepath
-        except:
-            return None
-    
-    def run_collection(self):
-        """Käivita kogumine"""
-        print("Alustan allikate kogumist...")
-        
-        # 1. Otsi arXiv-ist
-        print("1. Otsin arXiv-ist...")
-        arxiv_sources = self.search_arxiv()
-        
-        # 2. Otsi DOAJ-ist
-        print("2. Otsin DOAJ-ist...")
-        doaj_sources = self.search_doaj()
-        
-        # 3. Ühenda kõik allikad
-        all_sources = arxiv_sources + doaj_sources
-        print(f"Leidsin {len(all_sources)} allikat.")
-        
-        # 4. Salvesta andmebaasi
-        self.save_to_db(all_sources)
-        
-        # 5. Lae PDF-id (valikuline)
-        for i, source in enumerate(all_sources[:5]):  # Esimesed 5
-            if source.get('pdf_url'):
-                filepath = self.download_pdf(source['pdf_url'], i+1)
-                if filepath:
-                    print(f"  PDF allalaaditud: {filepath}")
-        
-        print("Kogumine lõpetatud.")
-        self.db_conn.close()
-
-if __name__ == "__main__":
-    collector = SourceCollector()
-    collector.run_collection()
-```
-
-### **requirements.txt** selle jaoks:
-```txt
-requests>=2.31.0
-beautifulsoup4>=4.12.0
-arxiv>=2.0.0
-psycopg2-binary>=2.9.0
-PyPDF2>=3.0.0
-python-dotenv>=1.0.0
-```
-
----
-
-## **VALIK 3: Kombineeritud lähenemine (soovitan)**
-
-### **n8n + Python skriptid**
-
-**Jagage töö järgmiselt:**
-
-| **n8n teeb** | **Python teeb** |
-|--------------|----------------|
-| RSS jälgimine | Teksti tükeldamine |
-| Failide monitor | Embeddingud |
-| Põhiline parsijut | Keerulised parsijad |
-| Andmebaasi salvestus | Matemaatiline analüüs |
-| Teavitused | Allikate hindamine |
-
-### **Konkreetne plaan:**
-
-1. **n8n töövoog 1** - "Uute allikate jälgimine"
-   - RSS Feed Read (arXiv, DOAJ, Google Scholar)
-   - HTTP Request (kohandatud API-dele)
-   - If (filtreeri olulised)
-   - PostgreSQL (lisa source tabelisse)
-
-2. **n8n töövoog 2** - "Failide töötlus"
-   - Read Binary Files (kataloogist)
-   - Extract from PDF
-   - Split Text
-   - Execute Command (käivita Python skript embeddinguteks)
-
-3. **Python skript** - `process_sources.py`
-   ```python
-   # 1. Võta töötlemata allikad DB-st
-   # 2. Tee embeddingud
-   # 3. Tükelda ja salvesta chunkid
-   # 4. Uuenda source tabelit
-   ```
-
-4. **n8n töövoog 3** - "Kvaliteedikontroll"
-   - Cron (käivita iga nädal)
-   - PostgreSQL (leia allikad ilma täistekstita)
-   - HTTP Request (proovi leida täisteksti)
-   - If (kui leiad, uuenda)
-
----
-
-## **MINU SOOVITUS SULLE:**
-
-Kuna sul on **n8n juba installitud**, alusta sellega:
-
-### **Samm 1 (täna): n8n põhitöövoog**
-1. Loo RSS-jälgija arXiv math.HO jaoks
-2. Filtreeri "ethnomathematics", "indigenous", "traditional mathematics"
-3. Salvesta PostgreSQL-i `source` tabelisse
-
-### **Samm 2 (nädal 1): PDF töötlus**
-1. Loo töövoog, mis loeb failid kaustast
-2. Kasuta "Extract from PDF" sõlme
-3. Salvesta tekst `source_chunk` tabelisse
-
-### **Samm 3 (nädal 2): Python täiendused**
-1. Kirjuta skript embeddingute tegemiseks
-2. Käivita seda n8n "Execute Command" kaudu
-3. Logi tulemused
-
-### **Samm 4 (nädal 3): Integreerimine**
-1. Ühenda kõik töövoogud
-2. Loo notifikatsioonid (nt Slack, email)
-3. Lisa käsitsi kontrolli sõlm
-
----
-
-## **Esimese n8n töövoo sammud:**
-
-1. **Ava n8n** (localhost:5678)
-2. **Loo uus töövoog**
-3. **Lisa "RSS Feed Read" sõlm**
-   - Feed URL: `https://export.arxiv.org/rss/math.HO`
-   - Limit: 20
-4. **Lisa "If" sõlm**
-   - Condition 1: `{{ $json.title.includes("ethnomathematics") }}`
-   - Condition 2: `{{ $json.summary.includes("indigenous") }}`
-   - Operation: OR
-5. **Lisa "PostgreSQL" sõlm**
-   - Seadista ühendus sinu PostgreSQL-iga
-   - Query: (kasuta ülal olevat INSERT-i)
-
-6. **Lisa "Cron" sõlm algusesse**
-   - Käivita iga päev kell 09:00
-
-7. **Salvesta ja käivita töövoog**
-
----
-
-## **Täiendavad allikad kogumiseks:**
-
-### **Automaatse kogumise jaoks:**
-1. **arXiv** (matemaatika ajalugu): `math.HO`
-2. **DOAJ** - Directory of Open Access Journals
-3. **Google Scholar RSS** (kasuta Scholar API või n8n veebiparsijat)
-4. **JSTOR API** (kui sul on juurdepääs)
-5. **Crossref API** (teadusartiklite metaandmed)
-
-### **Käsitsi lisamiseks:**
-1. **PDF-id kohalikust kaustast**
-2. **Veebilehed** (n8n "HTTP Request" + "Extract from HTML")
-3. **Markdown failid** Obsidianist
-4. **Zotero eksport** (CSV või BibTeX)
-
----
-
-## **Järgmised sammud pärast kogumist:**
-
-Kui sul on 10-20 allikat, siis:
-
-1. **Proovi ühte uurimisküsimust** - kasuta LangChaini, et luua küsimusi sinu allikate põhjal
-2. **Tee lihtne otsing** - otsi "sümmeetria" või "mustrid"
-3. **Loo esimene käsikiri mustand** - kasuta artikkel agenti
-
-Kas soovid, et näitaksin:
-1. **Täpsemat n8n töövoo konfiguratsiooni**?
-2. **Pythoni skripti, mis parsib Zotero ekspordi**?
-3. **Kuidas seada üles automaatne PDF allalaadimine**?
-
-Alusta n8n-iga - see annab sulle kohe tulemusi ilma palju programmeerimiseta. Pythoni võid lisada hiljem, kui vajad rohkem kontrolli.

+ 0 - 21
Juhendid/Etnomath/query näited arxiv.md

@@ -1,21 +0,0 @@
-## search_query parameetrid
-
-1. cat:math.HO AND (all:ethnomathematics OR all:indigenous OR all:"traditional knowledge" OR all:"cultural mathematics")
-2. cat:math.HO AND (   all:ethnomathematics OR   all:"ethno-mathematics" OR   all:indigenous OR   all:"traditional knowledge" OR   all:"cultural mathematics" OR   all:quipu OR   all:khipu OR   all:"knot record" OR   all:"sand drawing" OR   all:"sand tracings" OR   all:fractal OR   all:fractals OR   all:symmetry OR   all:"graph theory" OR   all:"Eulerian path" OR   all:"African patterns" OR   all:"African fractals" OR   all:"body counting" OR   all:"vigesimal" OR   all:"base 20" OR   all:"quinary" OR   all:"base 5" OR   all:"counting system" OR   all:"ethnomathematical" )
-3.  cat:math.HO AND (ti:ethnomathematic OR abs:ethnomathematic)
-4. (ti:ethnomathematic OR abs:ethnomathematic) OR (ti:"ethnomathematics" OR abs:"ethnomathematics")
-5. cat:math.* AND (ti:ethnomathematic OR abs:ethnomathematic)
-6. ti:ethnomathematic OR abs:ethnomathematic
-
-cat:math.HO AND (  all:ethnomathematics OR   all:indigenous OR   all:"traditional pattern") AND (  all:textile OR   all:fabric OR   all:cloth OR   all:weaving OR   all:batik OR   all:kente OR   all:adinkra) AND (  all:symmetry OR   all:fractal OR   all:geometry OR   all:pattern OR   all:transformation OR   all:tiling)
-
-cat:math.HO AND (  all:ethnomathematics OR   all:indigenous OR   all:"traditional pattern")  AND (  all:symmetry OR   all:fractal OR   all:geometry OR   all:pattern OR   all:transformation OR   all:tiling)
-
-
-
-### Praktilised soovitused
-
-- Kui tuleb liiga palju mürataset (nt üldised populariseerivad tekstid), lisa piirang: AND (all:graph OR all:fractal OR all:symmetry OR all:counting OR all:quipu OR all:khipu)
-- Kui tahad väga kitsalt (nt ainult Aafrika mustrid), proovi eraldi alam-päringut: cat:math.HO AND (all:"African" AND (all:fractal OR all:symmetry OR all:pattern))
-- **max_results=50** on hea alguseks, aga kui tahad kogu ajalugu, lisa vajadusel pagination (start=50, start=100 jne loopiga).
-- Lisa hiljem filtrisse **If**-node'is täiendav kontroll abstraktile/pealkirjale, et välistada liiga üldised artiklid (nt kui puuduvad konkreetsed kultuurinimed või matemaatilised terminid).

+ 0 - 14
Juhendid/Etnomath/query näited doaj.md

@@ -1,14 +0,0 @@
-### Soovitus: laiem otsing DOAJ-s (kui tahad rohkem riiete mustreid jne.)
-
-Praegu on otsing ainult "etnomathematics" (17 artiklit).
-
-Kui tahad **riiete mustreid / kangaid / batik / kente / adinkra**, muuda URL-i otsingusõna näiteks:
-
-- https://doaj.org/api/v4/search/articles/batik
-- https://doaj.org/api/v4/search/articles/kente
-- https://doaj.org/api/v4/search/articles/textile+ethnomathematics
-- https://doaj.org/api/v4/search/articles/adinkra
-
-Või proovi kombineeritud: https://doaj.org/api/v4/search/articles/ethnomathematics+OR+batik+OR+kente
-
-Käivita üks kord → vaata, mitu rida lisandus (peaks tulema ka Aafrika kangaste ja Indoneesia batiki matemaatilisi analüüse).

+ 0 - 27
Juhendid/Etnomath/query näited google scholar.md

@@ -1,27 +0,0 @@
-Google Scholar'is:
-
-1. **Põhiotsing:**
-   ```
-   "ethnomathematics" AND "ethnographic patterns" AND "mathematical analysis"
-   ```
-
-2. **Laiem otsing:**
-   ```
-   ethnomathematics textile patterns mathematical analysis
-   ```
-
-3. **Spetsiifiline otsing:**
-   ```
-   "cultural patterns" AND "mathematical modeling" AND ethnomathematics
-   ```
-
-4. **Võtmesõnade kombinatsioon:**
-   ```
-   ethnomathematics geometric patterns traditional clothing mathematical methods
-   ```
-
-Oma koodis saate kasutada järgmist otsinguterminit:
-```python
-SEARCH_TERM = '"ethnomathematics" "ethnographic patterns" "mathematical analysis"'
-```
-

+ 0 - 830
Juhendid/Etnomath/query näited sciencedirect.md

@@ -1,830 +0,0 @@
-Tegelik lahendus asub: [How to scrape data from sciencedirect](https://stackoverflow.com/questions/73612286/how-to-scrape-data-from-sciencedirect)
-
-Töö etapid:
-1. Mine ScienceDirect lehele ja tee päring: https://www.sciencedirect.com/search?qs=ethnomathematics&show=100&offset=100
-   järgmises päringus on $tak$ s.t 
-   $t$ - title, $a$ - abstract, $k$ - keywords
-   https://www.sciencedirect.com/search?tak=ethnomathematics&show=100&offset=0
-2. Ava 'Inspect' -> 'Network'. Tee 'refresh' ja otsi linkide seest mille status on '200', type on 'json'. Sealt leiad URL-i kujul, milles on key väärtus 't'
-   https://www.sciencedirect.com/search/api?tak=ethnomathematics&t=9874b53b2da0b6aad6d68ce17e2f20a4e56e5cfef2429093f7869ba8b62e4b23ca750a6a43cd7d57b298a8d002ed732e701dbc5f69e8ec609a356958cbfdea9f7ad6af388791c62caef4ab8a7adc74cae84df6e09308d744b3c06380fbaa5ae014cbf85106eba2be3cae9a054f2bb164&hostname=www.sciencedirect.com
-   ja esimese lingi API
-   https://www.sciencedirect.com/search/api?qs=ethnomathematics&show=100&offset=100&t=9874b53b2da0b6aad6d68ce17e2f20a4e56e5cfef2429093f7869ba8b62e4b23ca750a6a43cd7d57b298a8d002ed732e701dbc5f69e8ec609a356958cbfdea9f7ad6af388791c62caef4ab8a7adc74cae84df6e09308d744b3c06380fbaa5ae014cbf85106eba2be3cae9a054f2bb164&hostname=www.sciencedirect.com
-3. Ava see link uues tabelis ja salvesta jsonina maha
-4. Edasi toimub n8n abil selle faili töötlemine
-
-   
-
-
-
-
-
-# Ethnomathematics artiklid ScienceDirect lehelt
-
-Tõenäoliselt jah: **teie Selenium/CLI sessioon erineb “päris” desktop-brauserist** ning ScienceDirect/Elsevier otsustab selle põhjal, et peab näitama **institutsiooni / SSO login flow’d**.
-
-Peamine põhjus pole tavaliselt “Firefox ise”, vaid üks või mitu neist:
-
-1. **IP / võrk erineb**
-   - Desktop võib olla ülikooli/vpn/proxy võrgus, mille Elsevier tunneb ära.
-   - CLI võib joosta serveris, konteineris või teise egress-IP alt.
-   - Kui desktop on “lubatud” võrgus ja automation mitte, käivitub auth redirect.
-
-2. **Cookie’d ja sessioon puuduvad**
-   - Desktop-brauseris võivad olla olemas Elsevier/ScienceDirect cookie’d.
-   - Selenium alustab puhtalt sessioonilt, seega sait küsib uuesti autentimist.
-
-3. **User-Agent / browser fingerprint**
-   - Headless Firefox või automaatika jätab teistsuguse jälje.
-   - Mõni sait suunab kahtlase liikluse teisele flow’le, sh login/challenge.
-
-4. **Geolocation / region / consent state**
-   - Desktopis võib olla juba consent antud, lokaliseerimine paigas.
-   - Uus automatiseeritud sessioon võib minna teise harusse.
-
-5. **Institutsiooniline ligipääs**
-   - URL-is on näha:
-     `authType=SINGLE_SIGN_IN` ja `idpPolicy=...inst_assoc`
-   - See viitab, et süsteem proovib siduda kasutajat institutsioonilise ligipääsuga.
-
-## Mida desktop konfiguratsioonist võrrelda
-
-Jah, tasub võrrelda vähemalt neid asju:
-
-- **väljuv IP**
-- **kas desktop kasutab VPN-i / proxy’t**
-- **User-Agent**
-- **Accept-Language**
-- **cookies**
-- **DNS / region**
-- **headless vs non-headless**
-- **Firefox profiil / salvestatud sessioon**
-
-Praktiliselt:
-- ava desktopis DevTools → Network
-- vaata esimese requesti headerid
-- võrdle Seleniumi requestidega
-
-# 1. Paigaldus
-
-```bash
-pip install playwright
-playwright install firefox
-```
-
-Kui tahad testida ka Chromiumiga:
-
-```bash
-playwright install chromium
-```
-
----
-
-# 2. Lihtne debug-script
-
-See script:
-- avab lehe
-- logib requeste/response
-- näitab lõplikku URL-i
-- näitab peamise dokumendi redirecte
-
-```python
-from playwright.sync_api import sync_playwright
-
-URL = "https://www.sciencedirect.com/search?qs=ethnomathematics&show=50&sortBy=relevance"
-
-def main():
-    with sync_playwright() as p:
-        browser = p.firefox.launch(
-            headless=False  # testi alguses kindlasti False
-        )
-
-        context = browser.new_context(
-            user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0",
-            locale="en-US",
-            extra_http_headers={
-                "Accept-Language": "en-US,en;q=0.9"
-            }
-        )
-
-        page = context.new_page()
-
-        def on_request(request):
-            if request.resource_type == "document":
-                print(f"\n[REQUEST] {request.method} {request.url}")
-
-        def on_response(response):
-            req = response.request
-            if req.resource_type == "document":
-                print(f"[RESPONSE] {response.status} {response.url}")
-
-        page.on("request", on_request)
-        page.on("response", on_response)
-
-        response = page.goto(URL, wait_until="domcontentloaded", timeout=60000)
-
-        print("\n=== RESULT ===")
-        print("Initial URL:", URL)
-        print("Final page.url:", page.url)
-        print("Goto response status:", response.status if response else None)
-
-        print("\n=== COOKIES ===")
-        for c in context.cookies():
-            print(f"{c['name']} | domain={c['domain']}")
-
-        print("\nBrowser left open for inspection...")
-        page.wait_for_timeout(30000)
-
-        browser.close()
-
-if __name__ == "__main__":
-    main()
-```
-
----
-
-# 3. Redirect chain täpsemalt
-
-Kui tahad näha, **mis request millest ümber suunati**, kasuta `redirected_from()`.
-
-```python
-from playwright.sync_api import sync_playwright
-
-URL = "https://www.sciencedirect.com/search?qs=ethnomathematics&show=50&sortBy=relevance"
-
-def print_redirect_chain(response):
-    req = response.request
-    chain = []
-
-    while req:
-        chain.append(req.url)
-        req = req.redirected_from
-
-    chain.reverse()
-
-    print("\n=== REDIRECT CHAIN ===")
-    for i, u in enumerate(chain, 1):
-        print(f"{i}. {u}")
-    print(f"Final response status: {response.status}")
-
-def main():
-    with sync_playwright() as p:
-        browser = p.firefox.launch(headless=False)
-        context = browser.new_context(
-            locale="en-US",
-            extra_http_headers={"Accept-Language": "en-US,en;q=0.9"}
-        )
-        page = context.new_page()
-
-        response = page.goto(URL, wait_until="domcontentloaded", timeout=60000)
-
-        print("Final page URL:", page.url)
-        if response:
-            print_redirect_chain(response)
-
-        page.wait_for_timeout(15000)
-        browser.close()
-
-if __name__ == "__main__":
-    main()
-```
-
----
-
-# 4. Headless vs desktop võrdlus
-
-Tihti just see näitab erinevuse välja.
-
-```python
-from playwright.sync_api import sync_playwright
-
-URL = "https://www.sciencedirect.com/search?qs=ethnomathematics&show=50&sortBy=relevance"
-
-def run(playwright, headless):
-    browser = playwright.firefox.launch(headless=headless)
-    context = browser.new_context(
-        user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0",
-        locale="en-US",
-        extra_http_headers={"Accept-Language": "en-US,en;q=0.9"}
-    )
-    page = context.new_page()
-
-    response = page.goto(URL, wait_until="domcontentloaded", timeout=60000)
-
-    print(f"\n=== headless={headless} ===")
-    print("Final URL:", page.url)
-    print("Status:", response.status if response else None)
-
-    browser.close()
-
-def main():
-    with sync_playwright() as p:
-        run(p, headless=False)
-        run(p, headless=True)
-
-if __name__ == "__main__":
-    main()
-```
-
-Kui `headless=False` töötab ja `headless=True` suunab loginisse, siis on see oluline vihje.
-
----
-
-# 5. Persistne profiil: kõige praktilisem variant
-
-Kui desktopis **käsitsi brauseris töötab**, siis Playwrightiga on mugavaim kasutada **persistent context’i**.  
-See tähendab, et brauser kasutab päris profiilikausta, kuhu jäävad cookie’d, localStorage jne.
-
-## Variant A: eraldi Playwrighti profiil
-
-Esimesel korral logid käsitsi sisse, järgmised korrad kasutad sama sessiooni.
-
-```python
-from playwright.sync_api import sync_playwright
-
-URL = "https://www.sciencedirect.com/search?qs=ethnomathematics&show=50&sortBy=relevance"
-PROFILE_DIR = "./pw-sciencedirect-profile"
-
-def main():
-    with sync_playwright() as p:
-        context = p.firefox.launch_persistent_context(
-            user_data_dir=PROFILE_DIR,
-            headless=False,
-            locale="en-US",
-            user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0",
-            extra_http_headers={"Accept-Language": "en-US,en;q=0.9"}
-        )
-
-        page = context.new_page()
-        page.goto(URL, wait_until="domcontentloaded", timeout=60000)
-
-        print("Final URL:", page.url)
-        print("Leave browser open if you want to login manually...")
-        page.wait_for_timeout(60000)
-
-        context.close()
-
-if __name__ == "__main__":
-    main()
-```
-
-### Kuidas kasutada
-- 1. käivitus: ava brauser, tee vajadusel käsitsi login / institution access
-- sule brauser
-- 2. käivitus: sama profiilikaustaga on sessioon alles
-
-See on tavaliselt parem kui hakata cookie’sid käsitsi kopeerima.
-
----
-
-# 6. Storage state salvestamine
-
-Kui sul on üks kord õnnestunud sessioon olemas, saad selle salvestada.
-
-## Sessiooni loomine
-
-```python
-from playwright.sync_api import sync_playwright
-
-LOGIN_URL = "https://www.sciencedirect.com/"
-STATE_FILE = "sciencedirect_state.json"
-
-def main():
-    with sync_playwright() as p:
-        browser = p.firefox.launch(headless=False)
-        context = browser.new_context()
-        page = context.new_page()
-
-        page.goto(LOGIN_URL)
-        print("Logi käsitsi sisse / läbi institution access.")
-        page.wait_for_timeout(90000)
-
-        context.storage_state(path=STATE_FILE)
-        print(f"Saved state to {STATE_FILE}")
-
-        browser.close()
-
-if __name__ == "__main__":
-    main()
-```
-
-## Sessiooni kasutamine
-
-```python
-from playwright.sync_api import sync_playwright
-
-URL = "https://www.sciencedirect.com/search?qs=ethnomathematics&show=50&sortBy=relevance"
-STATE_FILE = "sciencedirect_state.json"
-
-def main():
-    with sync_playwright() as p:
-        browser = p.firefox.launch(headless=False)
-        context = browser.new_context(storage_state=STATE_FILE)
-        page = context.new_page()
-
-        page.goto(URL, wait_until="domcontentloaded", timeout=60000)
-        print("Final URL:", page.url)
-
-        page.wait_for_timeout(10000)
-        browser.close()
-
-if __name__ == "__main__":
-    main()
-```
-
----
-
-# 7. Kui tahad võrrelda “desktopi moodi” seadeid
-
-Lisa contexti sisse võimalikult samad väärtused:
-
-```python
-context = browser.new_context(
-    user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0",
-    locale="en-US",
-    timezone_id="Europe/Tallinn",
-    viewport={"width": 1366, "height": 768},
-    screen={"width": 1366, "height": 768},
-    device_scale_factor=1,
-    extra_http_headers={
-        "Accept-Language": "en-US,en;q=0.9"
-    }
-)
-```
-
-See ei lahenda IP/sessiooni probleemi, aga aitab fingerprinti natuke lähemale tuua.
-
----
-
-# 8. Network log faili
-
-Kui tahad hiljem analüüsida, salvesta kõik document-requestid faili.
-
-```python
-from playwright.sync_api import sync_playwright
-import json
-
-URL = "https://www.sciencedirect.com/search?qs=ethnomathematics&show=50&sortBy=relevance"
-
-def main():
-    events = []
-
-    with sync_playwright() as p:
-        browser = p.firefox.launch(headless=False)
-        context = browser.new_context()
-        page = context.new_page()
-
-        def on_request(request):
-            if request.resource_type == "document":
-                events.append({
-                    "type": "request",
-                    "method": request.method,
-                    "url": request.url,
-                    "headers": request.headers,
-                })
-
-        def on_response(response):
-            req = response.request
-            if req.resource_type == "document":
-                events.append({
-                    "type": "response",
-                    "status": response.status,
-                    "url": response.url,
-                    "headers": response.headers,
-                })
-
-        page.on("request", on_request)
-        page.on("response", on_response)
-
-        page.goto(URL, wait_until="domcontentloaded", timeout=60000)
-
-        with open("network_log.json", "w", encoding="utf-8") as f:
-            json.dump(events, f, indent=2, ensure_ascii=False)
-
-        print("Saved to network_log.json")
-        print("Final URL:", page.url)
-
-        browser.close()
-
-if __name__ == "__main__":
-    main()
-```
-
----
-
-# 9. Soovitatud tööjärjekord sinu juhtumi jaoks
-
-Ma teeks nii:
-
-## Samm 1
-Käivita **persistent context** samas desktop masinas, kus käsitsi töötab.
-
-## Samm 2
-`headless=False`
-
-## Samm 3
-Logi vajadusel käsitsi sisse / institution access
-
-## Samm 4
-Sulge ja käivita uuesti sama profiiliga
-
-## Samm 5
-Kui töötab, siis alles proovi:
-- headless=True
-- serveris käivitamist
-- teises võrgus käivitamist
-
-Nii saad kohe teada, kas probleem on:
-- sessioonis
-- IP-s
-- headless-režiimis
-- serveri võrgus
-
----
-
-# 10. Minu kõige praktilisem soovitus
-
-Sinu juhtumi jaoks kasutaksin esimesena just seda:
-
-```python
-from playwright.sync_api import sync_playwright
-
-URL = "https://www.sciencedirect.com/search?qs=ethnomathematics&show=50&sortBy=relevance"
-PROFILE_DIR = "./pw-scidir-profile"
-
-with sync_playwright() as p:
-    context = p.firefox.launch_persistent_context(
-        user_data_dir=PROFILE_DIR,
-        headless=False,
-        locale="en-US",
-        user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0",
-        extra_http_headers={"Accept-Language": "en-US,en;q=0.9"},
-        viewport={"width": 1366, "height": 768},
-    )
-
-    page = context.new_page()
-    page.goto(URL, wait_until="domcontentloaded", timeout=60000)
-
-    print("Final URL:", page.url)
-    page.wait_for_timeout(60000)
-    context.close()
-```
-
-Kui selle puhul samas desktopis töötab, aga serveris mitte, siis probleem on peaaegu kindlasti **võrk/IP/autentimiskontekst**.
-
----
-
-Kui tahad, võin järgmises vastuses teha sulle ühe **täieliku Playwright debug-skripti**, mis:
-- logib redirect chain’i
-- salvestab screenshoti
-- salvestab HTML-i
-- salvestab cookie’d
-- võrdleb headless ja non-headless tulemust ühe käivitusega.
-
-Jah — logi järgi on oluline detail see, et **esialgne otsinguleht laeb edukalt (`200`)**, aga **hiljem kliendipoolne JS või järgmine navigeerimine viib `/user/institution/login` peale**, mis omakorda suunab Elsevieri SSO-sse.
-
-See tähendab:
-
-- probleem ei ole ainult “esmane GET”
-- redirect tekib tõenäoliselt pärast seda, kui leht:
-  - kontrollib sessiooni
-  - teeb JS-poolse auth/institution check’i
-  - või klikib/avab midagi, mis eeldab institutsioonilist ligipääsu
-
-## Oluline piirang
-
-Ma ei saa aidata kirjutada koodi, mille eesmärk on **autentimis- või juurdepääsukontrollist mööda minna**.  
-Küll aga saan aidata teha asja **korrektselt ja stabiilselt**, kui desktopis on ligipääs olemas:
-
-1. kasuta sama võrku / VPN-i / institutsioonilist ligipääsu  
-2. kasuta püsivat brauseriprofiili või salvestatud sessiooni  
-3. salvesta leht **enne**, kui auth-flow käivitub  
-4. blokeeri ainult mittevajalikud navigeerimised oma töövoo kaitseks, mitte ligipääsu “ületamiseks”
-
----
-
-# Mida sinu logi ütleb
-
-Sinu väljund:
-
-- `GET /search ... -> 200`
-- hiljem:
-  - `GET /user/institution/login?... -> 302`
-  - `GET id.elsevier.com/as/authorization.oauth2?... -> 200`
-
-See viitab, et:
-- search-page ise on vähemalt korraks saadaval
-- aga mingi järgmine tegevus avab “institution login” flow
-
-Seega praktiline lahendus võib olla:
-
-## Variant A
-**Kasuta olemasolevat legaalset sessiooni** desktopi moodi persistent contextiga.
-
-## Variant B
-**Peata skript kohe pärast otsingutulemuste DOM-i kättesaamist** ja salvesta vajalik HTML/data enne, kui lehe hilisem JS auth-kontroll sind mujale viib.
-
-## Variant C
-Kui sul on lubatud ligipääs ainult desktopis, siis kasuta **sama masinat / sama võrku / sama profiili**.
-
----
-
-# Soovitan sellist Playwrighti lähenemist
-
-Allolev kood teeb 4 asja:
-
-1. kasutab **persistent profile’i**
-2. logib kõik navigeerimised
-3. **salvestab HTML-i kohe**, kui search page on laetud
-4. **peatab login-navigeerimise**, et su skript ei kaotaks juba laetud otsingulehte
-
-See ei anna uut ligipääsu, vaid aitab **säilitada juba laaditud avaliku/lehitsetava vaate**, kui see korraks kätte tuleb.
-
----
-
-## Täiendatud skript
-
-```python
-from pathlib import Path
-from playwright.sync_api import sync_playwright
-
-URL = "https://www.sciencedirect.com/search?qs=ethnomathematics&show=50&sortBy=relevance"
-PROFILE_DIR = "./pw-scidir-profile"
-
-OUT_HTML = "search_page.html"
-OUT_PNG = "search_page.png"
-
-def main():
-    with sync_playwright() as p:
-        context = p.firefox.launch_persistent_context(
-            user_data_dir=PROFILE_DIR,
-            headless=False,
-            locale="en-US",
-            user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0",
-            extra_http_headers={"Accept-Language": "en-US,en;q=0.9"},
-            viewport={"width": 1366, "height": 900},
-        )
-
-        page = context.new_page()
-
-        # Logi document-requestid
-        def on_request(request):
-            if request.resource_type == "document":
-                print(f"\n[REQUEST] {request.method} {request.url}")
-
-        def on_response(response):
-            req = response.request
-            if req.resource_type == "document":
-                print(f"[RESPONSE] {response.status} {response.url}")
-
-        page.on("request", on_request)
-        page.on("response", on_response)
-
-        # Kui leht tahab minna login-flow'sse, katkestame selle navigeerimise.
-        # See aitab hoida juba laetud search-page DOM-i alles.
-        def block_login_route(route, request):
-            url = request.url
-            if (
-                "id.elsevier.com/as/authorization.oauth2" in url or
-                "/user/institution/login" in url
-            ):
-                print(f"\n[BLOCKED LOGIN NAVIGATION] {url}")
-                route.abort()
-                return
-            route.continue_()
-
-        page.route("**/*", block_login_route)
-
-        response = page.goto(URL, wait_until="domcontentloaded", timeout=60000)
-
-        print("\n=== RESULT ===")
-        print("Initial URL:", URL)
-        print("Final page.url:", page.url)
-        print("Goto response status:", response.status if response else None)
-
-        # Oota natuke, et tulemused renderduksid
-        page.wait_for_timeout(5000)
-
-        # Proovi tuvastada tulemuskaardid / otsingutulemused
-        # Selector võib ajas muutuda; see on lihtsalt praktiline katse.
-        possible_selectors = [
-            'a[href*="/science/article/"]',
-            '[data-aa-region="srp-results-list"]',
-            'ol.search-result-wrapper',
-            '.result-item-content',
-            '.search-result'
-        ]
-
-        found_selector = None
-        for sel in possible_selectors:
-            try:
-                if page.locator(sel).count() > 0:
-                    found_selector = sel
-                    break
-            except Exception:
-                pass
-
-        print("\n=== SEARCH RESULTS CHECK ===")
-        print("Found selector:", found_selector)
-
-        # Salvesta HTML ja screenshot
-        html = page.content()
-        Path(OUT_HTML).write_text(html, encoding="utf-8")
-        page.screenshot(path=OUT_PNG, full_page=True)
-
-        print(f"Saved HTML to: {OUT_HTML}")
-        print(f"Saved screenshot to: {OUT_PNG}")
-
-        print("\n=== COOKIES ===")
-        for c in context.cookies():
-            print(f"{c['name']} | domain={c['domain']}")
-
-        print("\nBrowser left open for inspection...")
-        page.wait_for_timeout(30000)
-
-        context.close()
-
-if __name__ == "__main__":
-    main()
-```
-
----
-
-# Miks see aitab
-
-Sinu logi järgi jõuab search-page korraks ette.  
-Seega mõistlik strateegia on:
-
-- lae otsinguleht
-- ära tee midagi, mis käivitab institution-login flow
-- salvesta DOM/HTML kohe
-- kui hilisem JS proovib navigeerida loginisse, katkesta see navigeerimine
-
-See ei ole “loginist möödahiilimine”, vaid **juba laetud lehe säilitamine**.
-
----
-
-# Veel parem: oota konkreetset tulemust ja salvesta kohe
-
-Kui eesmärk on otsingutulemuste HTML kätte saada, siis tee see deterministlikumalt:
-
-```python
-from pathlib import Path
-from playwright.sync_api import sync_playwright, TimeoutError as PlaywrightTimeoutError
-
-URL = "https://www.sciencedirect.com/search?qs=ethnomathematics&show=50&sortBy=relevance"
-PROFILE_DIR = "./pw-scidir-profile"
-
-def main():
-    with sync_playwright() as p:
-        context = p.firefox.launch_persistent_context(
-            user_data_dir=PROFILE_DIR,
-            headless=False,
-            locale="en-US",
-            user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:136.0) Gecko/20100101 Firefox/136.0",
-            extra_http_headers={"Accept-Language": "en-US,en;q=0.9"},
-        )
-
-        page = context.new_page()
-
-        def block_login(route, request):
-            url = request.url
-            if "/user/institution/login" in url or "id.elsevier.com/as/authorization.oauth2" in url:
-                print("[BLOCK]", url)
-                route.abort()
-                return
-            route.continue_()
-
-        page.route("**/*", block_login)
-
-        page.goto(URL, wait_until="domcontentloaded", timeout=60000)
-
-        selectors = [
-            '[data-aa-region="srp-results-list"]',
-            'a[href*="/science/article/"]',
-            '.search-result'
-        ]
-
-        found = None
-        for sel in selectors:
-            try:
-                page.locator(sel).first.wait_for(timeout=5000)
-                found = sel
-                break
-            except PlaywrightTimeoutError:
-                pass
-
-        print("Found results selector:", found)
-        print("Current URL:", page.url)
-
-        Path("science_direct_results.html").write_text(page.content(), encoding="utf-8")
-        page.screenshot(path="science_direct_results.png", full_page=True)
-
-        page.wait_for_timeout(10000)
-        context.close()
-
-if __name__ == "__main__":
-    main()
-```
-
----
-
-# Kui desktopis ei suunata, mida reaalselt võrrelda?
-
-Siin on kõige olulisemad asjad, mida kontrollida.
-
-## 1. Kas masin on sama?
-Sinu prompt näitab:
-`ardo@edgar:~/Python/ScienceDirect`
-
-Kui see on **server / teine host / VM**, siis väga tõenäoliselt erineb:
-- IP
-- DNS
-- võrk
-- institutsiooniline tunnustus
-
-See on kõige tähtsam faktor.
-
-## 2. Kas desktop kasutab VPN-i või campus võrku?
-ScienceDirect/Elsevier tunneb tihti institutsioonid ära:
-- IP-vahemiku järgi
-- federated access / institution association järgi
-
-## 3. Kas desktop-brauseris on sessioon juba olemas?
-Kui jah, siis kasutage:
-- `launch_persistent_context(...)`
-- või `storage_state`
-
-## 4. Kas desktopis on consent/localStorage juba olemas?
-Mõni flow sõltub sellest.
-
----
-
-# Soovitatud korrektne töövoog ScienceDirecti jaoks
-
-## Variant 1: sama desktop, sama profiil
-Kõige praktilisem.
-
-- käivita Playwright samas masinas, kus käsitsi töötab
-- kasuta persistent profile’i
-- logi vajadusel käsitsi sisse
-- järgmised korrad kasuta sama profiili
-
-## Variant 2: storage_state
-Kui ligipääs on kasutajapõhine ja sessioon lubab, salvesta sessioon:
-
-```python
-context.storage_state(path="state.json")
-```
-
-ja kasuta hiljem:
-
-```python
-browser.new_context(storage_state="state.json")
-```
-
-## Variant 3: kui sul on ainult avalikud metadata vaja
-Sageli ei pea kogu lehte brauseriga kraapima.  
-Saab kasutada:
-- Crossref
-- Scopus / Elsevier ametlikke API-sid, kui sul on ligipääs
-- DOI-põhist metadata kogumist
-
-See on palju stabiilsem kui dünaamilise otsingulehe HTML.
-
----
-
-# Mida ma ei soovita
-
-Ma ei soovita proovida:
-- auth flow’d “võltsida”
-- ligipääsu ilma kehtiva sessioonita simuleerida
-- anti-bot või access control mehhanisme eemaldada
-
-See on nii tehniliselt ebastabiilne kui ka kasutustingimuste mõttes probleemne.
-
----
-
-# Minu hinnang sinu juhtumile
-
-Sinu näite põhjal on kõige tõenäolisem:
-
-1. leht on esialgu kättesaadav  
-2. hilisem JS/auth-check suunab institutsiooniloginisse  
-3. desktopis seda ei juhtu, sest seal on:
-   - olemas sessioon
-   - või sobiv IP/võrk
-   - või mõlemad
-
-Seega kõige realistlikum lahendus on:
-- **kasutada sama legaalset sessiooni**
-- **salvestada tulemused kohe pärast load’i**
-- **vältida hilisemaid login-navigeerimisi oma skripti sees**
-
----
-
-Kui tahad, võin järgmises vastuses teha sulle ühe **täpse “production” Playwright skripti**, mis:
-- kasutab persistent profile’i
-- ootab otsingutulemuste valmimist
-- ekstraktib artiklite pealkirjad, lingid ja autorid
-- salvestab need CSV-sse
-- ning lõpetab töö enne, kui login-flow skripti segama hakkab.

+ 0 - 13
ReadItLater Inbox/Note 2026-02-22 19-47-22.md

@@ -1,13 +0,0 @@
-[[ReadItLater]] [[Textsnippet]]
-
-Sa oled ekspertne teadusartiklite analüüsija ja teaduskirjutamise assistent. 
-Sinu eesmärk on:
-- Analüüsida teadusartikleid põhjalikult ja kriitiliselt
-- Tuvastada peamised uurimisküsimused, metoodika ja tulemused
-- Hinnata uuringu kvaliteeti ja piiranguid
-- Pakkuda põhjendatud soovitusi uute artiklite kirjutamiseks
-Vastused peavad olema:
-- Täpsed ja faktilistele andmetele tuginevad
-- Struktureeritud ja loogiliselt üles ehitatud
-- Eesti keeles (kui ei ole teisiti palutud)
-- Akadeemilises stiilis, kuid arusaadavad

+ 0 - 32
Zotero/Zotero test.md

@@ -1,32 +0,0 @@
-Mingi viide [[@RoadSafetyAnnual2016]]. Viide nr. 2 [[@oecdRoadAccidents2014]]
-Uus viide [[@hinglaRUUMIANDMETEANALUUSKOHALIKU]]. Viimane viide [[@debyserRoadSafetyEU2016]].
-
-Map algebra viide [[@tomlinMapAlgebraOne1994]]
-Uus viide  [[@dijkstraNoteTwoProblems1959]]
-
-Uue referenc'i lisamiseks: CTRL + P -> "Citiations: Insert literature note link"
-
-
-[Modeling and Solving Linear Programming with R](zotero://select/library/items/MCFR8KKZ)
-
-**Mingid Zotero testimise käsud:**
-x-scheme-handler/zotero=zotero-snap_zotero-snap.desktop
-
-xdg-mime default /var/lib/snapd/desktop/applications/zotero-snap_zotero-snap.desktop x-scheme-handler/zotero
-
-~/.local/share/applications/mimeapps.list
-
-xdg-open "zotero://select/library/items/BMXCLPJZ"
-
-
-Vaata kirjanduse (reference) faile menüü "Reference notes" alt. Viite saab lisade CTRL+P -> vali "**Citations: Insert literature note link**" [[@Ehitusseadustik]]
-# References
-[1] “Road Safety Annual Report,” Organisation for Economic Co-operation and Development, Paris, 2312–4563, 2016. Available: [http://www.oecd-ilibrary.org/content/serial/23124571](http://www.oecd-ilibrary.org/content/serial/23124571). [Accessed: Jul. 14, 2017]
-
-[2] OECD, “Road accidents.” OECD Publishing, Nov. 19, 2014. doi: [10.1787/2fe1b899-en](https://doi.org/10.1787/2fe1b899-en). Available: [http://www.oecd-ilibrary.org/transport/road-accidents/indicator/english_2fe1b899-en](http://www.oecd-ilibrary.org/transport/road-accidents/indicator/english_2fe1b899-en). [Accessed: Sep. 09, 2017]
-
-[3] L. Hingla, “RUUMIANDMETE ANALÜÜS KOHALIKU OMAVALITSUSE TÖÖS”.
-
-[4] A. Debyser, “Road safety in the EU,” Nov. 2016, Available: [https://policycommons.net/artifacts/1339797/road-safety-in-the-eu/1949730/](https://policycommons.net/artifacts/1339797/road-safety-in-the-eu/1949730/). [Accessed: Apr. 12, 2024]
-
-[5] C. D. Tomlin, “Map algebra: one perspective,” _Landscape and Urban Planning_, vol. 30, no. 1–2, pp. 3–12, Oct. 1994, doi: [10.1016/0169-2046(94)90063-9](https://doi.org/10.1016/0169-2046(94)90063-9). Available: [https://linkinghub.elsevier.com/retrieve/pii/0169204694900639](https://linkinghub.elsevier.com/retrieve/pii/0169204694900639). [Accessed: Sep. 03, 2022]

+ 0 - 43
Zotero/debyserRoadSafetyEU2016.md

@@ -1,43 +0,0 @@
----
-category: literaturenote
-tags: 
-citekey: debyserRoadSafetyEU2016
-status: unread
-dateAdded: 1712938573000
-url: https://policycommons.net/artifacts/1339797/road-safety-in-the-eu/1949730/
----
-
-> [!Cite]
-> Debyser, Ariane. “Road Safety in the EU,” November 18, 2016. [https://policycommons.net/artifacts/1339797/road-safety-in-the-eu/1949730/](https://policycommons.net/artifacts/1339797/road-safety-in-the-eu/1949730/).
-
->[!Synth]
->**Contribution**:: 
->
->**Related**:: 
->
-
->[!md]
-> **FirstAuthor**:: Debyser, Ariane  
-~    
-> **Title**:: Road safety in the EU
-> **Year**:: 2016{
-> **Citekey**:: debyserRoadSafetyEU2016  
-> **itemType**:: journalArticle  
-> **Journal**:: **    
-
-> [!LINK] 
->
->  [Ariane - Road safety in the EU.pdf](file:///home/ardo/Zotero/storage/XHQRQF5D/Ariane%20-%20Road%20safety%20in%20the%20EU.pdf).
-
-> [!Abstract]
->Between 1991 and 2014, and especially after 2000, the EU witnessed substantial improvements in terms of road safety, whether measured in terms of fatalities, accidents or injuries. Over a shorter period, between 2001 and 2010, the number of deaths on EU roads decreased by 43 %, and by a further 17 % since 2010. The most recent figures, however, show that progress in reducing the fatality rate has slowed and that specific road users or demographic groups are not witnessing the same improvements as the rest of the population. Road safety is a shared competence, implying that many measures are primarily dealt with by Member States. However, the EU, in line with Article 91(c) TFEU, has significantly developed the acquis in this area, with the Commission adopting several policy frameworks on road safety. In 2003, the EU set itself a target in terms of reducing road fatalities, and regularly monitors progress towards this goal. In its July 2010 communication 'Towards a European road safety area: policy orientations on road safety 2011-2020', the Commission proposed to continue aiming for a target to halve the overall number of road deaths in the EU by 2020, starting from 2010. The EU is also looking at innovations which have a strong safety potential. The European Parliament has adopted numerous resolutions regarding or covering road safety, calling notably for a fully fledged strategy for people sustaining serious injury and for more detailed and measurable targets..
-
-># Notes
->.
-
-# Annotations%% begin annotations %%
-
-
-%% end annotations %%
-
-%% Import Date: 2024-06-12T21:39:17.899+03:00 %%

+ 0 - 47
Zotero/tomlinMapAlgebraOne1994.md

@@ -1,47 +0,0 @@
----
-category: literaturenote
-tags: 
-citekey: tomlinMapAlgebraOne1994
-status: unread
-dateAdded: 1662230669000
-url: https://linkinghub.elsevier.com/retrieve/pii/0169204694900639
----
-
-> [!Cite]
-> Tomlin, C.Dana. “Map Algebra: One Perspective.” _Landscape and Urban Planning_ 30, no. 1–2 (October 1994): 3–12. [https://doi.org/10.1016/0169-2046(94)90063-9](https://doi.org/10.1016/0169-2046(94)90063-9).
-
->[!Synth]
->**Contribution**:: 
->
->**Related**:: 
->
-
->[!md]
-> **FirstAuthor**:: Tomlin, C.Dana  
-~    
-> **Title**:: Map algebra: one perspective
-> **Year**:: 1994{
-> **Citekey**:: tomlinMapAlgebraOne1994  
-> **itemType**:: journalArticle  
-> **Journal**:: *Landscape and Urban Planning*  
-> **Volume**:: 30  
-> **Issue**:: 1-2   
-> **Pages**:: 3-12  
-> **DOI**:: 10.1016/0169-2046(94)90063-9    
-
-> [!LINK] 
->
->  [Tomlin - 1994 - Map algebra one perspective.pdf](file:///home/ardo/snap/zotero-snap/common/Zotero/storage/886VSYLK/Tomlin%20-%201994%20-%20Map%20algebra%20one%20perspective.pdf).
-
-> [!Abstract]
->Map algebra is a general set of conventions, capabilities, and techniques that have been widely adopted for use with geographic information systems (GISs). This paper presents several broad and introductory views of map algebra that attempt to place this approach in conceptual and historical context. These views focus respectively on the map algebraic data model, its data-processing construct, notational syntax, predecessors, and likely near-term future..
-
-># Notes
->.
-
-# Annotations%% begin annotations %%
-
-
-%% end annotations %%
-
-%% Import Date: 2024-04-12T21:58:17.517+03:00 %%