# 06 · Üniversite sayfaları için veri zenginleştirme — keşif raporu **Rol:** veri-muhendisi · **Tarih:** 21 Eylül 2026 · **Kapsam:** `/universite/[slug]` (229 sayfa) ## Özet 1. Bugün üniversite sayfası yalnızca `programs` tablosundan türetilen 6 sayıyı gösteriyor (program, fakülte, tür, il, en iyi sıra, kontenjan); üniversiteye ait ayrı bir tablo ne `yokatlas.db`'de ne `app.db`'de var. 2. OpenAlex prototipi (`scripts/kesif-openalex.ts`) sitedeki 229 üniversitenin **201'ini (%87,8)** eşledi; yayın/atıf/h-index yıllık seriyle geliyor, CC0 lisanslı, anahtarsız. Kalan 28'in 10'u ad değişikliği (Adnan Menderes → Aydın Adnan Menderes vb.), küçük bir takma ad tablosuyla ~%92'ye çıkar; geri kalanı yurt dışı/KKTC küçük kurumlar. 3. Öğrenciye en çok işe yarayan üç kaynak açık ve yıllık yayımlanıyor: **YÖK İstatistik** (öğrenci + öğretim elemanı sayısı, Excel), **TÜBİTAK ARDEB üniversite tablosu** (2021–2025, PDF, 199 üniversite) ve **URAP Türkiye 2025-2026** (tam sıralama tablosu basın PDF'inde). Üçü de yılda bir el ile indirilip repoya konur; kod tarafı ayrıştırıcı. 4. THE/QS (telifli, kazıma yasak), Scimago (403), Webometrics (bu ağdan erişilemedi, CC BY-NC-SA) ve Üni-Veri (üniversite düzeyi yalnız rehber öğretmen sistemi DABİS'te) ilk sürüme **girmemeli**; yurt kapasitesi ve şehir yaşam maliyeti için üniversite bazlı açık veri yok. 5. Önerilen ilk sürüm: 8 alan, tek yeni tablo (`uni_kimlik` + `uni_gosterge`, uzun biçim, kaynak/yıl damgalı), yıllık güncelleme, toplam **~22 saat** iş. 6. Yan bulgu (veri kalitesi): 3 yurt dışı/KKTC üniversitesi `unitur='DEVLET'` etiketli ve Uluslararası Balkan Üniversitesi'nin 26 satırında il "SARAYBOSNA - BOSNA - HERSEK" (üniversite Üsküp'te). `/universiteler` hub'ında bu üniversiteler "Devlet" listesinde görünüyor. --- ## 1. Mevcut durum ### 1.1 `yokatlas.db` — üniversiteye ait alanlar Üniversite ayrı bir varlık değil; `programs` satırlarındaki dört kolonun `GROUP BY` ile toplanmasından oluşuyor (`sqlite3 -readonly data/yokatlas.db ".schema programs"`): | Kolon | Tip | Not | |---|---|---| | `universite` | TEXT | Ham ad, **iki yazım**: `"X ÜNİVERSİTESİ"` ve `"X ÜNİVERSİTESİ (İL)"`; 322 ham ad → 229 slug (93 üniversite çift yazımlı) | | `unitur` | TEXT | DEVLET 170 · VAKIF 117 · KKTC 23 · VAKIF MYO 4 · YURTDISI KAMU 6 · YURTDISI VAKIF 2 (ham ad bazında) | | `il` | TEXT | NULL olabilir; yurt dışı için serbest metin ("SARAYBOSNA - BOSNA - HERSEK") | | `fakulte` | TEXT | Birim adı | Örnek satır (`SELECT universite, unitur, il, fakulte, isim, sira2026, kontenjan2026 FROM programs WHERE universite LIKE 'BOĞAZİÇİ%' LIMIT 1`): `BOĞAZİÇİ ÜNİVERSİTESİ | DEVLET | İSTANBUL | Eğitim Fakültesi | ...`. Üniversite düzeyinde **hiçbir gösterge** (öğrenci sayısı, akademisyen, yayın, sıralama, kuruluş yılı, web sitesi) yok. `netler`, `programs_arsiv`, `veri_meta` tablolarında da üniversite alanı yok. Dış anahtar durumu: YÖK Atlas API `tercih-kilavuz/universiteler` ucu **228 üniversite için `universiteId`** (YÖKSİS kodu, ör. Abdullah Gül = 173499) veriyor; `scripts/logo-indir.ts` bunu logo için kullanıyor ama DB'ye yazmıyor. Bu kod, YÖK'ün tüm sistemlerinde (İstatistik, İzleme raporu) ortak anahtar — ilk sürümde saklanmalı. ### 1.2 `app.db` Tablolar: `user, session, account, verification, orders, credit_ledger, reports, saved_lists, chat_messages, tadimlik_havuzu`. Üniversite verisi yok; olması da gerekmiyor (katalog verisi salt okunur `yokatlas.db`'de). ### 1.3 `/universite/[slug]` bugün ne gösteriyor Kaynak: `src/features/katalog/components/universite-icerik.tsx`, veri: `src/lib/katalog.ts:getUniversiteBySlug`. - Başlık + logo (`public/uni-logo/.png`, 229 dosya, YÖK Atlas'tan) - Özet paragraf: program sayısı, fakülte sayısı, en iyi taban sırası, toplam kontenjan - 4 istatistik kutusu: Program · Fakülte/Birim · Tür · En iyi sıralama - Türkiye haritasında konum (`universite-konum-haritasi.tsx`, `uni-koordinatlar.ts`) - Fakülteye göre program tablosu (50'lik sayfalar) + CTA - JSON-LD `CollegeOrUniversity` (name, url, logo, address) — `foundingDate`, `sameAs`, `numberOfStudents` gibi alanlar boş Yani sayfa, öğrencinin "bu üniversite nasıl bir yer" sorusuna değil, "hangi programı kaçla alıyor" sorusuna cevap veriyor. Bilal'in istediği alanların **hiçbiri** yok. ## 2. Kaynak araştırması Erişim testleri bu oturumda `curl`/WebFetch ile yapıldı (21 Eyl 2026). "Eşleşme" sütunu sitedeki 229 slug'a karşı tahmini oran; OpenAlex ve TÜBİTAK için ölçüldü, diğerleri koddan çıkarım. | Kaynak | URL | Ne veriyor | Güncellik | Erişim | Lisans / izin | Eşleşme zorluğu | |---|---|---|---|---|---|---| | **OpenAlex** | `api.openalex.org/institutions` | Toplam yayın, toplam atıf, yıllık yayın/atıf/açık erişim (2010→2026), h-index, i10, 2 yıllık ort. atıf, ROR, web sitesi, konum, konu dağılımı | Sürekli (kayıt `updated_date`'li; 2026 yılı kısmi) | JSON API, anahtarsız, 100k istek/gün, 10/sn; `mailto` ile polite pool | **CC0** — ticari kullanım ve atıfsız kullanım serbest | **Ölçüldü: 201/229.** Türkçe alternatif adlar var; 2018 sonrası kurulanların çoğunda `country_code=null` → TR filtresi kaçırır, ad aramasıyla bulunur | | **ROR** | `api.ror.org/v2/organizations?filter=country.country_code:TR,types:education` | Kanonik kurum kimliği, TR/EN adlar, web sitesi, **kuruluş yılı**, Wikidata/ISNI/GRID kodları; 239 TR eğitim kurumu | Aylık sürüm | JSON API, anahtarsız | CC0 | OpenAlex ile aynı kimlik; eşleme bir kez yapılır, ROR id saklanır | | **YÖK Atlas API** | `yokatlas.yok.gov.tr/api/tercih-kilavuz/universiteler` | Yalnız `universiteAdi` + `universiteId` (YÖKSİS). SPA paketi program düzeyinde "Öğretim Elemanları (kadro/unvan)" paneli içeriyor; üniversite düzeyi uç **yok** (denenen 5 kalıp 403) | Yıllık | JSON, Referer zorunlu | Kamu verisi; resmî kullanım şartı yok, mevcut hat zaten kullanıyor | Ad ham adla birebir; 228/229 | | **YÖK İstatistik** | `istatistik.yok.gov.tr` | Üniversite bazında öğrenci sayısı (ön lisans/lisans/YL/doktora, cinsiyet, uluslararası), öğretim elemanı sayısı (unvan bazında) → **öğrenci/öğretim üyesi oranı** hesaplanır | 2025-2026 yılı 27 Mart 2026'da yayımlandı; yıllık (Mart) | ZK (Java) web uygulaması, API yok; arayüzden **Excel indirme** | YÖK verisi, açık; metaveri PDF'i var (`veriyonetim.yok.gov.tr/documentFiles/1776871774464...pdf`) | Ad YÖK yazımı (ham adla neredeyse aynı); ~%98. **Bilal indirir**, betik ayrıştırır | | **YÖK Üniversite İzleme ve Değerlendirme Genel Raporu 2025** | `veriyonetim.yok.gov.tr/tr/document/2494` (251 s., 17 MB) | 71 gösterge başlığı (A.1–E.5): doktora mezun, **mezunların ilk 6 ayda işe girme oranı**, akredite program, WoS yayın/öğretim üyesi, CNCI, patent, TÜBİTAK proje/bütçe, uluslararası öğrenci, değişim öğrencisi, dünya sıralamaları, kişi başı enerji, WCAG… | 19 Aralık 2025 (2023-2024/2024 verisi) | PDF; her göstergede **yalnız ilk 10–20 üniversite** listeleniyor. Üniversite bazlı "karne"ler ayrı PDF'ler (Faaliyetler → Yayınlarımız), toplu Excel yok | YÖK, açık | Tam liste yok → ilk sürüme uygun değil; 201 karne PDF'ini tek tek ayrıştırmak ayrı proje (~2 gün) | | **TÜBİTAK ARDEB üniversite tablosu** | `tubitak.gov.tr/sites/default/files/2025-05/9_universite_bazinda_ardeb_verileri_2020_2024_0.pdf` | Üniversite başına: başvuru sayısı, **destek kararı verilen proje sayısı**, bütçe (2025 sabit fiyat), yürürlükteki proje, ortalama bütçe; **199 üniversite**, dosya içeriği **2021–2025** | Yıllık (Mayıs) | PDF, 11 sayfa; pypdf ile satırlar okunuyor, çok satırlı adlar birleştirilmeli | Kamu istatistiği | Adlar kısaltmalı ("ZONGULDAK BÜLENT ECEVİT Ü."); naif eşleme 187/199, satır birleştirmeyle ~195 | | **URAP Türkiye 2025-2026** | `newtr.urapcenter.org` (Meteor SPA) + basın PDF `…/cdn/storage/PDFs/mezDn2uAd4mx2mZzW/original/…pdf` (31 s.) | 15 gösterge, 9 puan sütunu (makale, atıf, doküman, doktora, öğretim üyesi/öğrenci, uluslararası/yurt içi iş birliği, TÜBİTAK proje) + toplam puan; **Tablo 8–10 tüm üniversitelerin tam sıralaması**, Tablo 11 geçen yıla göre değişim | Ekim 2025; yıllık (Ekim) | PDF (SPA kazınmaz); pypdf ile tablo satırları okunuyor, üniversite adı iki satıra bölünebiliyor | Kâr amaçsız (ODTÜ), "herkesin erişebileceği veri" ilkesi; sitede lisans metni yok → **atıf + link ile kullanım, [BİLAL] kısa e-posta ile izin teyidi önerilir** | Adlar YÖK yazımıyla aynı büyük harf; ~%95 | | **URAP Dünya 2025-2026** | aynı site, PDF `…/amdSDGMGFJkWCgFG6/…pdf` (19 Haz 2026) | ~90 TR üniversitesinin dünya sırası | Yıllık (Haziran) | PDF | aynı | aynı | | **Times Higher Education WUR 2026** | `timeshighereducation.com/…/best-universities-turkey` | 109 TR üniversitesi, bant (301–350 …) | Yıllık (Ekim) | HTML | **"All rights reserved"**, kullanım şartları kazımayı yasaklıyor → **[BİLAL] hukuk** | İngilizce adlar | | **QS WUR 2027** | topuniversities.com | 25 TR üniversitesi | Yıllık (Haziran) | HTML | Telifli, aynı durum | İngilizce adlar | | **Scimago Institutions** | `scimagoir.com/rankings.php?country=TUR` | Araştırma/inovasyon/toplumsal etki sırası | Yıllık | curl → **403**; tarayıcıdan CSV düğmesi var | Kullanım şartı sitede; ticari yeniden yayın belirsiz | İngilizce adlar | | **Webometrics** | `webometrics.info/en/Europe/Turkey` | Dünya sırası, etki/açıklık/mükemmellik | Yılda 2 (Oca/Tem) | Bu ağdan **DNS çözülmedi** (ENOTFOUND) | CC BY-NC-SA → **ticari sitede kullanılamaz** | — | | **Üni-Veri (CBİKO)** | `cbiko.gov.tr` (univeri.cbiko.gov.tr bu ağdan çözülmedi) | Mezun istihdam oranı, ilk iş bulma süresi, ücret, nitelik uyuşmazlığı (15 gösterge; 2010–2022 mezunları) | 2024 genişletme | Arayüz; **üniversite düzeyi yalnız DABİS'te (rehber öğretmen girişi)**, kamuya bölüm düzeyi ülke geneli | Kamu | Üniversite düzeyi kamuya kapalı → ilk sürüm dışı | | **Erasmus+ ham hareketlilik verisi** | `data.europa.eu/…/erasmus-mobility-raw-data`; `erasmus-plus.ec.europa.eu/…/for-researchers` | 2014–2024, hareketlilik başına satır (gönderen/alan kurum) → üniversite başına giden/gelen öğrenci sayısı toplanabilir | Yıllık; 2023–2024 geçici | Excel, yıl başına yüz binlerce satır | EU açık veri (yeniden kullanım serbest, atıf) | Kurum adları İngilizce/serbest; ECHE kodu eşlemesi gerekir → orta zorluk, ~6 saat | | **KYK / GSB yurt kapasitesi** | `kygm.gsb.gov.tr` | Toplam 867 yurt / 1 milyon+ yatak (ülke geneli); il bazlı kapasite sayfası **bulunamadı** | — | Açık veri yok | — | Üniversite bazlı değil, il bazlı bile yok → ilk sürüm dışı | | **TÜİK** | `data.tuik.gov.tr` | Kira endeksi İBBS-2 (26 bölge), TÜFE bölgesel; il bazlı yaşam maliyeti yok | Aylık | Veri portalı (Excel) | Açık | İl→bölge eşlemesi; "şehir yaşam maliyeti" iddiası için zayıf → ilk sürüm dışı | | **Kendi verimiz** | `yokatlas.db` | Vakıf üniversitelerinde burslu/indirimli/ücretli kontenjan dağılımı program adından türetilebilir | Yıllık (zaten var) | SQL | — | Program adında `(Burslu)`/`(%50 İndirimli)` kalıbı; **doğrulanmalı**: SQLite `LIKE` Türkçe İ'ye duyarsız değil, 70 vakıf üniversitesinde kalıp var ama sayım düşük çıktı — `turkishSlugify` ile TS tarafında sayılmalı | ## 3. Prototip: OpenAlex × KolayTercih **Betik:** `/Users/bilalgursen/Desktop/kolaytercih/scripts/kesif-openalex.ts` (salt okunur; `src/`'ye ve şemaya dokunmaz; lint + proje tsc temiz). **Çalıştırma:** `OPENALEX_MAILTO= pnpm tsx scripts/kesif-openalex.ts --cikti ` (~40 sn, 2 liste + 28 arama isteği). **Çıktı:** `/private/tmp/claude-501/-Users-bilalgursen-Desktop-kolaytercih/a9337d4b-f90c-4aee-a4e5-cac37b02c64c/scratchpad/kesif-openalex.json` (229 kayıt; eşleşme yöntemi, OpenAlex/ROR id, web, yıllık 2021–2026 serisi). ### 3.1 Eşleşme | Aşama | Yöntem | Eşleşen | |---|---|---| | 1 | TR+CY `type:education` listesi (219+39 kurum), ad slug'ı birebir (Türkçe alternatif adlar dahil) | 179 | | 2 | Gevşek anahtar (üniversitesi/university/vakıf atılmış, sıralı parçalar) | 6 | | 3 | İngilizce→Türkçe kalıp çevirisi | 0 | | 4 | Ülke filtresiz `search=` ile ad araması, aday yalnız slug/gevşek anahtar tutuyorsa | 16 | | | **Toplam** | **201 / 229 (%87,8)** — DEVLET 122/132 · VAKIF 68/78 · KKTC 11/15 · YURTDIŞI 0/4 | Slug dışı 22 eşleşmenin tamamı göz kontrolünden geçti (web sitesi alanı doğruluyor; ör. "İSTANBUL ATLAS ÜNİVERSİTESİ → Atlas Üniversitesi (atlas.edu.tr)"). ### 3.2 Neden %100 değil, nasıl çözülür | Neden | Etkilenen | Çözüm | |---|---|---| | **Ad değişikliği** — OpenAlex eski adı taşıyor: Adnan Menderes (17.965 yayın), Mustafa Kemal (13.202), Bezmiâlem, Acıbadem, Okan, Beykent, Gedik, Adana BTÜ, İstanbul Bilim (→ Demiroğlu), Ankara Medipol vb. | 10 | 10 satırlık takma ad tablosu (`data/uni-eslesme.json`: slug → openalex_id/ror). Bir kez yapılır; id saklanınca ad bir daha kullanılmaz | | **`country_code=null`** — 2018 sonrası kurulanların çoğu | 16 (çözüldü) | 4. aşama zaten çözüyor; kalıcı çözüm id saklamak | | **Şehir adı çakışması riski** — "Ankara Medipol" ↔ "İstanbul Medipol" | ilk sürümde 1 yanlış pozitif çıktı, düzeltildi | Gevşek anahtardan şehir adlarını **atmamak** (betikte düzeltildi); gevşek eşleşmeleri her koşuda listeye yazmak | | **Kurum gerçekten yok/çok küçük**: Kıbrıs Aydın, Kıbrıs Sağlık ve Toplum, Rauf Denktaş, Bahçeşehir Kıbrıs, Kocaeli Sağlık ve Teknoloji, İstanbul Sağlık ve Teknoloji, Türk-Japon BTÜ, MYO'lar | ~10 | Eksik olarak gösterilir ("Yayın verisi yok"); komşu üniversiteden kopyalanmaz | | **Yurt dışı kampüsler** (Manas, Hoca Ahmet Yesevi, Tiran New York, Azerbaycan Pedagoji) | 4 | Ülke kodu KG/KZ/AL/AZ ile aranabilir; öğrenci için düşük öncelik | | **Sağlık Bilimleri Ü. (İçişleri/MSB adına)** | 1 | Zaten "SAĞLIK BİLİMLERİ ÜNİVERSİTESİ" ile aynı kurum; slug'a takma ad | Takma ad tablosu sonrası beklenen: **~211/229 (%92)**; eksik kalanların toplam programı 229 üniversitenin program sayısının %2'sinden az. ### 3.3 Örnek 10 üniversite (OpenAlex, 21 Eyl 2026 çekimi) | Üniversite | OpenAlex adı | Toplam yayın | Toplam atıf | Yayın 2024 | Yayın 2025 | Atıf 2025 | h-index | 2y ort. atıf | |---|---|---:|---:|---:|---:|---:|---:|---:| | Boğaziçi | Boğaziçi University | 25.402 | 2.069.758 | 1.352 | 1.327 | 3.260 | 416 | 3,89 | | ODTÜ | Middle East Technical University | 48.900 | 2.621.914 | 2.331 | 2.101 | 4.688 | 433 | 2,90 | | Hacettepe | Hacettepe University | 82.851 | 3.204.640 | 5.917 | 5.830 | 12.068 | 387 | 1,91 | | İTÜ | Istanbul Technical University | 58.913 | 2.395.731 | 4.127 | 4.537 | 11.508 | 375 | 3,11 | | Koç | Koç University | 24.966 | 853.255 | 2.487 | 2.355 | 6.275 | 272 | 3,22 | | Ege | Ege University | 54.395 | 1.931.127 | 4.004 | 4.102 | 6.917 | 309 | 1,82 | | Atatürk | Atatürk University | 42.571 | 1.449.438 | 3.650 | 3.957 | 10.393 | 273 | 2,80 | | Bahçeşehir | Bahçeşehir University | 11.986 | 251.976 | 1.293 | 1.330 | 3.368 | 175 | 2,47 | | Muş Alparslan | Muş Alparslan University | 6.390 | 54.625 | 625 | 853 | 1.589 | 79 | 1,89 | | Doğu Akdeniz (KKTC) | Eastern Mediterranean University | 10.513 | 399.227 | 655 | 712 | 3.107 | 219 | 4,34 | Yorum: "Atıf 2025" o yıl **alınan** atıf; yeni yayınlar az atıf aldığı için düşüktür — sayfada gösterilecekse "son 5 yıl yayın" ve "toplam atıf" daha dürüst. `2yr_mean_citedness` (yayın başına ortalama atıf) küçük-büyük üniversiteyi karşılaştırmak için tek adil gösterge; "Koç 25 bin yayınla Hacettepe'nin üçte biri" gibi ham sayı karşılaştırması öğrenciyi yanıltır — ham sayı yanında **öğretim üyesi başına** değer verilmeli (YÖK İstatistik ile birleşince mümkün). ## 4. Öneri ### 4.1 İlk sürüm: 8 alan Sıralama = öğrenciye fayda × erişilebilirlik × güncellik. Her satırda kaynak, tazelenme ve tahmini iş (ayrıştırıcı + test + UI kutusu hariç). | # | Alan | Kaynak | Güncelleme | Eşleşme | İş (saat) | Öğrenciye ne söyler | |---|---|---|---|---|---|---| | 1 | **Öğrenci sayısı** (toplam, lisans/ön lisans, uluslararası oranı) | YÖK İstatistik Excel | Yıllık (Nisan) | ~%98 | 3 | Kampüs büyüklüğü, "kalabalık mı butik mi" | | 2 | **Öğretim elemanı sayısı ve öğrenci/öğretim üyesi oranı** | YÖK İstatistik Excel (aynı dosya) | Yıllık | ~%98 | 1 (1 ile birlikte) | Ders/danışman erişimi; URAP da aynı oranı puanlıyor | | 3 | **Son 5 yıl yayın sayısı + öğretim üyesi başına yayın** | OpenAlex (`counts_by_year`) ÷ #2 | 6 ayda bir (API) | %88→%92 | 4 (mevcut betik → üretim betiği + takma ad tablosu) | Araştırma canlılığı; adil karşılaştırma | | 4 | **Toplam atıf, h-index, yayın başına ortalama atıf** | OpenAlex | 6 ayda bir | aynı | 0,5 | Araştırmanın etkisi | | 5 | **TÜBİTAK ARDEB desteklenen proje sayısı (2021–2025) ve başvuru→destek oranı** | TÜBİTAK PDF | Yıllık (Mayıs) | ~%97 | 4 (PDF ayrıştırıcı, çok satırlı adlar) | Proje/burs fırsatı, laboratuvar canlılığı | | 6 | **URAP Türkiye sırası + toplam puan + geçen yıla göre değişim** | URAP basın PDF (Tablo 10–11) | Yıllık (Ekim) | ~%95 | 4 | Tek, yerli, açık, 15 göstergeli akademik sıralama; THE/QS'e hukuki risksiz alternatif | | 7 | **Kuruluş yılı, resmî web sitesi, ROR/Wikidata kimliği** | ROR / OpenAlex | Yıllık | %92 | 1 | "Yeni üniversite" bağlamı; JSON-LD `foundingDate`/`sameAs` → SEO | | 8 | **Vakıf üniversitelerinde burslu / indirimli / ücretli kontenjan dağılımı** | `yokatlas.db` (program adı) | Otomatik (refresh ile) | %100 | 2 (Türkçe harf duyarlı sayım + doğrulama) | Vakıf tercihinde en somut soru: "kaç kişi bursla giriyor" | Toplam ayrıştırma/veri işi **~19,5 saat**; katalog okuma katmanı (`katalog.ts` → `UniDetay.gostergeler`) + `universite-icerik.tsx` kutuları + kaynak dipnotu **~6 saat** (yazılımcı). Eşleme tablosunun ilk el kontrolü (28 üniversite) **~1 saat** (Bilal veya veri-muhendisi). **İlk sürüme girmemesi önerilenler ve nedeni:** THE/QS (telif, [BİLAL] hukuk görüşü olmadan hayır); Webometrics (NC lisans); Scimago (erişim + şart belirsiz); Üni-Veri mezun istihdamı (üniversite düzeyi kamuya kapalı; YÖK raporunda yalnız ilk 20); Erasmus (yapılabilir ama 6 saat, ikinci sürüm); yurt kapasitesi / şehir yaşam maliyeti / kütüphane / ulaşım (üniversite bazlı açık veri yok — uydurma ya da il ortalaması gösterilmesin). ### 4.2 Şema taslağı `yokatlas.db` içinde, **`ingest.ts` DB'yi sildiği için** (`rmSync(dbPath)`, satır 26) üniversite tabloları ayrı bir dosyada tutulmalı: `data/universiteler.db` (salt okunur açılır; `src/lib/db.ts`'teki `getDb` kalıbının ikizi). Alternatif: `ingest.ts`'e "koru" listesi eklemek — daha kırılgan. ```sql -- Kimlik: bir kez kurulur, el ile denetlenir, yıllık güncellemede değişmez CREATE TABLE uni_kimlik ( slug TEXT PRIMARY KEY, -- katalog.ts slug'ı (uniAdiNormalize + turkishSlugify) yoksis_id INTEGER, -- YÖK Atlas universiteId ror_id TEXT, -- https://ror.org/xxxx openalex_id TEXT, -- https://openalex.org/Ixxxx wikidata_id TEXT, kurulus_yili INTEGER, web TEXT, tubitak_ad TEXT, -- PDF'teki kısaltmalı yazım ("… Ü.") urap_ad TEXT, eslesme_notu TEXT -- "el ile" / "slug" / "arama"; denetim izi ); -- Göstergeler: uzun biçim; her değer kaynak + dönem + çekim damgası taşır CREATE TABLE uni_gosterge ( slug TEXT NOT NULL REFERENCES uni_kimlik(slug), anahtar TEXT NOT NULL, -- 'ogrenci_toplam' | 'ogretim_elemani' | 'yayin_5y' | 'atif_toplam' | 'h_index' | 'tubitak_destek_2021_2025' | 'urap_tr_sira' | ... donem TEXT NOT NULL, -- '2025-2026' | '2021-2025' | '2025' ; karşılaştırma bu alanla yapılır deger REAL, -- NULL = kaynakta yok (eksik eksik görünür) kaynak TEXT NOT NULL, -- 'yok-istatistik' | 'openalex' | 'tubitak-ardeb' | 'urap' | 'ror' | 'yokatlas' kaynak_url TEXT, alindi TEXT NOT NULL, -- ISO tarih PRIMARY KEY (slug, anahtar, donem) ); CREATE INDEX idx_uni_gosterge_anahtar ON uni_gosterge (anahtar, donem); ``` Okuma tarafı: `getUniversiteBySlug` → `gostergeler: Record`; UI her kutunun altına "Kaynak: YÖK İstatistik 2025-2026" dipnotu koyar (`VeriKaynagi` bileşeni zaten var). Ham sayı yanında oran (öğretim üyesi başına) gösterilir; eksik değer "—" ve "bu kaynakta yok" metni. Göç: yeni dosya olduğu için `app.db` göçüne dokunulmaz; `yokatlas.db` şeması değişmez; geri alma = dosyayı silmek + `katalog.ts`'te opsiyonel okuma (dosya yoksa `gostergeler = {}`). ### 4.3 Güncelleme takvimi | Ay | İş | Kim | |---|---|---| | Mart–Nisan | YÖK İstatistik Excel'i indir → `pnpm uni-gosterge --kaynak yok-istatistik --dosya …` | Bilal indirir, betik | | Mayıs | TÜBİTAK ARDEB PDF → ayrıştırıcı | Bilal indirir, betik | | Haziran, Aralık | OpenAlex API çekimi (`pnpm uni-gosterge --kaynak openalex`) | Betik (otomatik, ağ) | | Ekim | URAP Türkiye PDF → ayrıştırıcı | Bilal indirir, betik | | Her yıl kılavuz sonrası | Yeni üniversite slug'ları için `uni_kimlik` satırı + eşleme kontrolü (`pnpm uni-gosterge --denetim` eşleşmeyenleri listeler) | veri-muhendisi | Doğrulama sorguları (her koşu sonrası): (a) `SELECT COUNT(*) FROM uni_kimlik WHERE openalex_id IS NULL` ≤ 20; (b) her `anahtar, donem` için dolu satır ≥ önceki dönemin %95'i; (c) `deger < 0` yok; (d) `ogrenci_toplam / ogretim_elemani` 2–80 aralığı dışında kalanlar listelenir. ## 5. Yan bulgu: veri kalitesi (üniversite alanları) | Kontrol | Sorgu | Sonuç | Önem | |---|---|---|---| | Yurt dışı/KKTC üniversitesi `DEVLET` etiketli | `SELECT universite, il, unitur, COUNT(*) FROM programs WHERE unitur='DEVLET' AND (universite LIKE '%KIBRIS%' OR universite LIKE '%ULUSLARARASI%') GROUP BY 1,2,3` | KIBRIS AMERİKAN (42 satır, il LEFKOŞA/KIBRIS/NULL), ULUSLARARASI BALKAN (34), ULUSLARARASI SARAYBOSNA (24) — aynı üniversitelerin `(…)` ekli eski yazımı `YURTDISI KAMU`/`KKTC`; parantezsiz 2026 yazımı `DEVLET` | **Yüksek**: `/universiteler` hub'ı bu 3'ünü "Devlet" listesinde gösterir (`universite-listesi.tsx:45`), üniversite sayfası "Tür: Devlet" yazar, sihirbazın devlet/vakıf filtresi de etkilenir. Kaynak muhtemelen `unitur-onar.ts`/2026 refresh eşlemesi — **doğrulanmalı** | | Yanlış il | `SELECT DISTINCT il FROM programs WHERE universite LIKE 'ULUSLARARASI BALKAN%'` | 26 satırda "SARAYBOSNA - BOSNA - HERSEK"; üniversite Üsküp'te (eski yazım `(ÜSKÜP-MAKEDONYA)` bunu doğruluyor) | Orta: harita/adres JSON-LD yanlış ülke | | Çift yazım | slug bazlı gruplama (bkz. 1.1) | 93 üniversite iki ham adla | Düşük: `katalog.ts` slug'da birleştiriyor; ama `GROUP BY universite` kullanan her yeni sorgu çift sayar — üniversite tabloları **slug** anahtarlı olmalı | | Sağlık Bilimleri Ü. özel kontenjanı | `SELECT COUNT(*) FROM programs WHERE universite LIKE 'İÇİŞLERİ BAKANLIĞI%'` | 15 satır, ayrı "üniversite" gibi görünüyor, `/universite/icisleri-bakanligi-ve-milli-savunma-bakanligi-adina-...` diye sayfa üretiliyor | Düşük–orta: SEO'da anlamsız sayfa; slug'ı Sağlık Bilimleri'ne bağlamak ya da hub'dan gizlemek | ## Bilal'den istenen 1. `istatistik.yok.gov.tr`'den 2025-2026 "Üniversite bazında öğrenci sayıları" ve "öğretim elemanı sayıları" Excel'lerini indirip `data/ham/yok-istatistik-2025-2026/` altına koymak (~10 dk; API yok, tarayıcı gerekiyor). 2. URAP'a tek cümlelik e-posta: Türkiye sıralaması tablolarını kaynak ve link göstererek KolayTercih üniversite sayfalarında yayımlamak için izin teyidi (~5 dk; kâr amaçsız kurum, "herkese açık veri" ilkesi — düşük risk ama ticari site). 3. [BİLAL] karar: THE/QS bantları hiç gösterilmesin mi, yoksa hukuk görüşü alınsın mı (kararın kendisi ~2 dk; alınmazsa varsayılan "gösterme").