Syntax highlighting of Archiv/Formální základy databázové technologie

okruhy 14/15: ''Relacní kalkuly, relacní algebry, deduktivní databáze. Relacní úplnost. Bezpecné výrazy, ekvivalence relacních dotazovacích jazyku. Veta o tranzitivním uzáveru relace. Sémantika SQL. Datalog, 3 sémantiky a jejich ekvivalence. Datalog s negací, stratifikace. Deduktivní databáze. Rekurze v SQL. Tablo dotazy - statická analýza a optimalizace relacních dotazovacích jazyku. Modelování preferencí, dotazování s preferencemi.''

Podle Majklových zápisků: [http://ttnz.cz/statnice/statnice/]

== Relacní kalkuly, relacní algebry. Relacní úplnost. Bezpecné výrazy, ekvivalence relacních dotazovacích jazyku. ==
[[Soubor:Relational model concepts.png|right|thumb|460px|'''Koncepty v relačním modelu''']]
{{Zkazky|
* '''Relačí algebra + kalkuly + SQL (Mlýnková)''' - Stačilo vědět nástřel definice a hlavně, jak to přirovnat k SQL (prvky jsou tabulky/řádky/atributy ... algebra/n-ticový/doménový). U popisu algebry a kalkulu ukázat nějaké příklady. Vědět že je to ekvivalentní (kalkuly a algebra), ale že SQL je silnější protože má navíc agregačí funkce. 
* '''Relacni kalkuly a algebry (Knap)''' - Kalkuly jsou zalozene na predikatove logice 1. radu, mohou obsahovat nebezpecna pravidla atd. Algebra muze byt pozitivni (bez mnozinoveho rozdilu), nema nebezpecna pravidla. Pak jsem byl dotazan na to, jak se v relacni algebre zapise prunik - pomoci sjednoceni a selekce. 
}}
Relační kalkul a relační algebra jsou prostředky relačního modelu dat pro manipulaci s daty 

=== Relační kalkuly ===
{{Zkazky|
* '''DRK (Riha)''' - kde sa vyuziva prakticky - QBE, Oracle - dake formulare ci co
* '''Relační kalkuly (?)''' - ''Popsal jsem NRK, DRK, jak se v nich dotazuje (na příkladu), dále jsem zmínil doménově závislé dotazy, neomezené, problémy a jak je řešit a bezpečné formule (eliminace všeobecného kvantifikátoru, omezení volných proměnných atd.). To stačilo.''
* '''Doménový kalkul (Říha)''' - ''Na papier som napísal väčšinu informácii z Pokorného skrípt, definícia, bezpečné výrazy, 1-2 príklady, použitie - to som našiel na inej diskusii - a to Říhu potešilo, že som tam mal. Bohužiaľ otázky Říhu smerovali k logike, ktorú som si už nepamätal a neopakoval. Takže najprv som z dvoch možností skúšal uhádnuť správnu, ale trafil stále špatne. Naviac som sa do toho začínal zamotávať a akosi som už nedokázal racionálne premýšľať. Červenal som sa i za ušami, ale nakoniec to Říha zhodnotil tak, že všetko podstatné bolo na papieri a tie otázky boli nad požadovaný rámec a prepustil ma. Odporúčam ujasniť si základy a spoľahlivo vedieť, čo znamená PRL 1.řádu, 2.řádu, čo je term, funkč. symbol, formula, pred. symbol, voľná premenná atp.''
* '''Relacne kalkuly (Skopal)''' - Toto uz islo lepsie. Chcel odo mna pocut ako by som naivne implmementoval relacny kalkul v nej, programovacom jazyku - odpoved: dosadzujem prvky z domeny a skusam kedy bude podmienka true. Este chcel rozirenie kalkulu o agreg. operacie - ako by som implemetoval trebars AVG - odpoved: mam predikat AVGZAM(x) a hadam priemerny plat a ten predikat mi niekedy povie true. 
* '''N-ticovy kalkul (Riha)''' - (priklad relacie, dotaz, realne pouzitie) Napisal som zakladne veci, ze je to rozsirenie jazyka logiky 1. radu. A uviedol som priklad na filmoch a hercoch. Realne pouzitie som nevedel. Zacali sme to rozoberat, presli sme ake veci su v jazyku logiky a ako si odpovedaju s NDK. Ked chcel to pouzitie a ja som to nevedel, tak mi napomohol poznamkou, aby som si ukazany dotaz napisal v SQL. Realne pouzitie je SQL :) Aj ked som sa dost tazko nechytal na niektore otazky, tak to uzavrel tym, ze som vlastne vsetko podstatne napisal. Celkovo velmi prijemne skusanie.  
}}
*neprocedurální jazyky
*relačně úplné, mohou obsahovat nebezpečná pravidla (⇒ silnější než RA)
*vychází z [[wcs:Predikátová_logika_prvního_řádu|predikátové logiky 1. řádu]] (při dotazování) relační algebra ne

==== n-ticový relační kalkul (NRK) ====

{{zarovka 
| 
* { x.NÁZEV_K, k.ADRESA, x.JMÉNO_F <math>|</math> PŘEDSTAVENÍ(x) & KINA(k) & k.NÁZEV_K <math>=</math> x.NÁZEV_K } 
 | '''př(NRK):''' spojení (představení * kina):
}}

{{zarovka 
| 
* {p.JMÉNO_F <math>|</math> P(p) & ∀x ( P(x) ⇒ ∃y ( P(y) & y.NÁZEV_K <math>=</math> x.NÁZEV_K & p.JMÉNO_F <math>=</math> x.JMÉNO_F) ) }
 | '''př(NRK):''' film, který dávají ve všech kinech, kde něco dávají (P <math>=</math> PŘEDSTAVENÍ)
}}

* pracuje s daty na úrovni n-tic (prvků relace/řádků)
* '''Termy  '''- n-ticové proměnné, jejich komponenty a konstanty
* '''Predikáty '''- jména relací a '''binární porovnávací predikáty θ''' (>, <, >=, <=, <>, =)
* '''Atomické formule''' '''R(x)''', x.A θ y.B, x.C θ 'konstanta', (θ je bin. porov. Predikát), R(t1,....tn) (R predikát, ti je term) 
** Atomické formule NRK jsou formule NRK a formule složené z formuli pomocí &, ∨, ¬, ⇒, ⇔ jsou také NRK fle 
* '''Kvantifikátory''': ∃, ∀

==== doménový relační kalkul (DRK) ====
{{zarovka 
| 
* {f <math>|</math> ∀k(P(Název_kina:k) & P(Jméno_Filmu:f, Název_kina:k))} 
 | '''př(DRK):''' spojení (P<math>=</math>představení * k<math>=</math>kina)
}}

* Místo n-tic používá doménové proměnné (tj. atributy),  (místo R.u se používá R(A:x, B:y,...), atribut:typ 
* '''Termy '''- jednoduché proměnné, konstanty 
* '''Atomické formule''' '''R(A1:T1, A2:T2, ...)''' - stejné jako u NRK 

{{Zdroje|
* [http://siret.ms.mff.cuni.cz/skopal/databaze/slidy/DBI025_06.ppt Relační model - dotazování - relační kalkuly] (Skopal)
}}

=== Relační algebry ===
{{Zkazky|
*'''Relační algebra a její použití (?)''' - popsal jsem základní operace, odvozené operace, relační úplnost, základ k tomu, jak se díky ní optimalizuje v SQL a Datalogu (ten jsem spíš jen zmínil).
}}
{{zarovka 
| 
* (Hrají(Název_k <math>=</math> Mír)[Jméno_f, Čas] * Film)[Herec]
 | '''př.:''' herci z filmů v kině Mír
}}
{{zarovka 
| 
* Jestliže všechny atributy ve selekci jsou současně v E1
 | '''př.:''' kdy je v RA mozne: <math>\small(E_1 \times E_2)(selekce) =</math> <math>\small E_1(selekce) \times E_2</math> ?
}}

je neprocedurální (můžeme chápat jako procedurální) jazyk vysoké úrovně pro práci s relacemi v relačním datovém modelu (nemá nebezpečná pravidla)
* '''Relace''' - má schema (atributy + domény, na pořadí atributů nezáleží ), obsahuje množinu n-tic (duplicity jsou eliminovány) 
* '''Operace''' - vytvoří z vstupní relace/í výsledek jako novou relaci
* '''Minimálni množina 6ti operací (tvoří rel.algebru A<sub>R</sub>)''':
**výběr () (select): - vrací relaci jejíž hodnoty atributů splňují danou podmínku, která může obsahovat jména atributů, konstanty, operátory prorovnávání a logické spojky 
**projekce [] (project) - vrací relaci obsahující vybrané sloupce (duplicity jsou eliminovány) 
**sjednocení <math>\cup</math> (union) - vstupní relace musí mít shodnou aritu (stejný počet atributů) a domény atributů musí být stejného typu (duplicity jsou eliminovány) 
**množinový rozdíl <math>\setminus</math> (set difference) - musí platit stejné předpoklady jako u sjednocení 
**kartézský součin <math>\times</math> (Cartesian product) - předpokládá se, že atributy vstupních relací jsou disjunktní (v opačném případě musí být provedeno přejmenování), v praxi mnohdy neproveditelné kvůli vysoké režii 
**přejmenování <math>ρ</math> (rename) 
*další odvozené operace
** '''Průnik <math>\cup</math>''' - odvodíme pomocí sjednocení a selekce {{TODO|viz odvozovaní z Bc}}
** '''Přirozené spojení <math>*</math>''' (Natural join)
** '''Spojení přes výraz''' (normální je přes atributy) = inner join (zobečnění vnitřního spojení)
** '''Polospojení '''R <* S. Spojení s projekcí na schema relace, které je menší tj. R
** '''Levé/Pravé vnější spojení''' - ve spojení jsou zachovány všechny n-tice z levé/pravé/obou relací, pokud řádky vyhovují podmínkám spojení (v SQL jsou doplněné null, RA toto neumožňuje, jelikož je relačně úplná)
** [http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/ Rozdíly mezi Joiny]
** '''Dělení '''(÷) : Dělíme všechny představení Filmy(režisér=čáp).[jmeno_f]. Vrátí to ntici odpovídajícím všechem kinům, kde všechny filmy režíroval čáp (defakto to vydělí všechny stejný kina čápem a pokud je to jedna tak to vypíše)

* '''Dotazovací jazyk Relační algebry''' - jeden dotaz lze zapsat mnoha způsoby, toho se vyžívá v alg. optimalizaci dotazu
** '''Jednoduchý dotaz''' - lze vyjádřit pouze pomocí selekce, projekce a spojení (až 80%) - nejvíc optimalizovány 
* '''[[#Relační úplnost|Relační úplnost]]''' - pokud lze prostředky jazyka lze vyjádřit min.množinou operací (selekce, projekce,sjednocení, kartézský součin, mn.rozdíl, rename)
* '''Pozitivní relatiční algebra <math>A_{RP} \{(), [ ], \cup, \times, rename \}</math>''' - je fragment RA vzniklý odstraněním množinového rozdílu

* '''Konstantní relace''' (relace co se nemění po dobu života DB) - např Číselník

{{Collapse|'''Příklad(srovnání RA, DRK, NRK)'''|

definujeme rel.schémata:
<pre>
   FILM(JMENO_FILMU, JMENO_HERCE) 
   HEREC(JMENO_HERCE, ROK_NAROZENI)
</pre>
'''Dotaz:''' ''Ve kterých filmech hráli všichni herci?''

'''RA:''' <math>\small FILM \div HEREC[JMENO\_HERCE]</math>

'''NRK:'''<math>~ \small\{f.JMENO\_FILMU \;|\; \forall herec(HEREC(herec) \Rightarrow f(FILM(f) \wedge\; f.JMENO\_HERCE = herec.JMENO\_HERCE \;\wedge f.JMENO\_FILMU = film.JMENO\_FILMU))\}</math>

'''DRK:''' <math>\small\{(f) | FILM(f)\wedge \forall h (HEREC(h) \Rightarrow FILM(f, h))\}</math>
}}

{{Zdroje|
* [http://www.ksi.mff.cuni.cz/~pokorny/vyuka/srbd/ds/ Pokorného slajdy]
* [http://siret.ms.mff.cuni.cz/skopal/databaze/slidy/DBI025_05.ppt Relační model - dotazování - relační algebra] (Skopal)
}}

=== Bezpečné výrazy ===
{{Zkazky|
* '''Bezpečné výrazy (Skopal)''' - problémem u relačních kalkulů jsou nekonečné domény, takže je potřeba výrazy nějak omezit (aktuální doménou), kromě toho je dobré znát (resp. umět pohotově vymyslet) výrazy, na kterých jsou ty problémy relačních kalkulů vidět 
}}

{{:Formální_základy_databázové_technologie/Bezpečné_výrazy}}

=== Ekvivalence dotazovacích jazyků ===
[[Soubor:Dalalog.jpg|right|thumb|800px|'''vyjadřovací síla relačních dotazovacích jazyků''']]
;NRK omezený na bezpečné výrazy je ekvivalentní <math>A_{R}</math> (relační algebře)
* Z toho plyne, že kalkulové jazyky lze realizovat pomocí <math>A_{R}</math>, která je relativně dost silná (ale nemá na logiku 1. řádu - Datalog)
;DRK s doménově nezávislými výrazy je silnější než <math>A_{R}</math>
;DRK omezený na bezpečné výrazy je ekvivalentní <math>A_{R}</math>
;NRK omezený na bezpečné výrazy je ekvivalentní DRK omezený na bezpečné výrazy
;Datalog je silnější než <math>A_{RP}</math> (pozitivní RA)
* Tranzitivní uzávěr (rekurze)
* V datalogu nelze vyjádřit rozdíl, proto není silnější než obyč RA
;Stratifikovaný Datalog s negací je silnější než <math>A_{R}</math>
;Datalog s negací bez rekurze je ekviv <math>A_{R}</math>

=== Relační úplnost ===
{{Zkazky|
* '''Relační úplnost (?)''' - bylo 30.5.2012
}}

'''relačně úplný jazyk''' - minimalne tak silny jako RA

Relačně úplný je:
*NRK, DRK (s bezpecnymi vyrazy je ekvivalentní RA)
*SQL (silnější, protože má navíc agregační fce, aritmetiku, null...)
*Datalog (nerekurzivní Datalog s negací je ekvivalentní RA)

{{Zdroje|1 = 
* Anglicky ''relational completeness''
* DJ2-2-vyjadrovaci-sila.pdf 10. slide
* [https://onedrive.live.com/view.aspx?resid=388A82B3C4CE1DFE!1759&app=OneNote&authkey=!ABoWVv2NQ4DuOcQ zapisky]
}}

== Věta o tranzitivním uzávěru relace ==
{{Zkazky|
* '''Věta o tranzitivním uzávěru relace (?)''' - Napsal jsem definici tranzitivního uzávěru, znění věty a důkaz podle slidů prof. Pokorného. Až na drobnou chybu v definici tranzitivního úzávěru, kterou jsem opravil, to stačilo.
* '''Veta o tranzitivnim uzaveru relace (Galambos)''' - jeste ze jsem si tu otazku nechal az na konec, jinak bych tam sedel asi az do vecera. Nebyl jsem jedinej, koho otazka tohoto zkousejiciho dost zdrzela, spis to bylo pravidlo. Styl zkouseni podobny tomu pana Skopala s tim rozdilem, ze "se teda hezky snazte, vas necham chvili uzrat" a takhle se to opakuje nekolikrat..si osobne myslim, ze tenhle styl zkouseni je pro matfyz potrebnej, ale nikoliv u statnic, kde ma clovek dalsi ctyri otazky. Uz takhle tam nektery lidi sedeli a "zrali" u tech statnic celkem pres pet hodin (nebo i dyl-vyhlaseni melo bejt ve tri, ale ve trictvrte prisla pani Dejmkova, at prej mame strpeni, ze dva lidi jsou jeste zkouseny. Zacinali vsichni v devet..) Vubec si neumim predstavit, ze by v jedny komisi bylo takovejchhle zkousejicich vic. Navic nutit lidi na fleku (navic u statnic pod takovym tlakem) vymejslet veci, ktery treba nikdy neslyseli, protoze v doporucenejch kurzech ke statnicim se neberou, ale podle nazoru zkousejiciho se "do toho tematu daj zahrnout" (abych nekrivdil - to nebyl zrovna muj pripad, ale u nekterejch kolegu jo) podle me neni uplne stastnej pristup.. 
}}

{{:Formální_základy_databázové_technologie/TransitiveClosure}}

== Deduktivní databáze ==
{{zarovka| 
:F(Oldřich, Pavel)
:F(Oldřich, Jaroslav)
:F(Jaroslav, Veronika)
|př. EDB}}
{{zarovka| 
:M(x):- F(x,y)
:S(y,w) :- F(x,y), F(x,w)
:B(x,y) :- S(x,y),M(x)
|př. IDB}}
{{zarovka| 
:D1: Má Pavel bratra?
:D2: Najdi všechny (x,y), kde x je bratrem y
:D3: Najdi všechny (x,y), kde x je sourozencem y
|př. dotazy}}
je db systém, který dokáže provádět dedukce (např. odvodit další fakta) založené na faktech a pravidlech uložených v (deduktivní) db
: '''fakta''' - ''tvrzení'', atomické fle obsahující pouze konstanty (statická data, základní informace) - tj. '''základní literály'''
:* termy - proměnné nebo konstanty
: '''pravidla''' - jsou Hornovy klausule <math>L_0:- L_1,…,L_n</math> (návod jak odvodit data, která nejsou explicitně uložena)
:* kde <math>L_i</math> jsou atomické fle nebo negace atomických flí - tj. ''positivní a negativní literály''
:* <math>L_0</math> hlava pravidla, <math>L_1,…,L_n</math> tělo pravidla
:* tvrzení i literály jsou Hornovy klauzule
: '''dotazy''' - výraz jehož výsledkem jsou nalezená a odvozená data
* Datalog je jazyk typicky používaný pro specifikaci faktů, pravidel a dotazů v deduktivních db 
* jsou výsledkem snahy kombinovat logické programování s relačními db za účelem vytvořit systém, který podporuje mocný formalismus (s vyjadřovacími schopnostmi logických prog. jazyků) a je stále rychlý a schopný pracovat s velmi rozsáhlými objemy dat.
* mají větší vyjadřovací schopnosti než relační db, ale menší než logické programovací jazyky

'''Deduktivní db''' se skládá z:
* '''Extenzionální db (EDB)''' (základní data)
* '''Intenzionální db (IDB)''' (virtuální relace dané odvoz pravidly, "pohledy" z SQL)
** mžina Hornových klauzulí (pravidel): hlava:-tělo (např: Sourozenec(y,w) :- Otec(x,y), Otec(x,w), y != w )
* '''Integritní omezení (IO)'''
** tvrzení vymezující korektní DB (na konceptuální a db úrovni)
** př: název_k jednoznačně identifikuje řádky tabulky Kina
{{Zdroje|
* [http://www.ksi.mff.cuni.cz/~pokorny/vyuka/dj2-vyjadrovaci-sila/img83.html DJ II]
* ''viz [[wcs:Deduktivní databáze]]''
}}

== Datalog, 3 sémantiky a jejich ekvivalence. ==
{{Zkazky|
* '''FZDT - Datalog s negací (Pokorný?)''' -  Profesor si přípravu nepřečte pořádně, na škodu studentovi. Očekával jsem, že je hodný, nevyžaduje moc (např. kdybych si vytáhl větu o tr. uzávěru, nechtěl by důkaz), tak jsem se ani neobhajoval; nijak jsem se nechtěl hádat u státnic. Měl jsem popsané asi dvě stránky. Jednou z prvních otázek bylo: "A jak vypadá ten Datalog?" Zas a znovu, jako se stalo jiným, i já jsem spletl termíny term/proměnná/predikát. To, že má člověk praxi v prologu/datalogu, ještě nestačí k tomu, aby správně vysvětlil syntaxi. Dá se říct, že v Datalogu P(x) :- A(x), B(x) je něco jako A(x) & B(x) ⇒ P(x) v logice 1. řádu. Doporučuji psát obecně, ne hned příklady. Profesor si dá záležet na detailech (např. u stratifikace se jednotlivé vrstvy píší jako P1, P2, ..., Pn, tedy čárky místo sjednocení, protože sjednocení by znamenalo, že nám nezáleží na pořadí). Ale kvůli takovým detailům zas nevyhazuje. 

* '''FZDT - Sémantika Datalogu pomocí NPB (Pokorný)''' - Posledná otázka, čas už tlačil - Pokorný musel za 45 min. odísť, tak sme sa dali do rozpracovanej otázky. V podstate príjemný rozhovor, na papieri som mal to, čo som si pamätal zo skrípt, akurát mi to veľmi nedávalo dokopy zmysel Skúšajúci bol ale vynikajúci, pýtal sa návodne, prípadne to doplnil. Nič detailné, ani nevyžadoval formalizmy. Ja som zodpovedal čo je to min. pevný bod, ako sa vyhodnocuje, ako sa vyhodnocujú datalog. programy, ako vyzerá EDB, IDB. 

* '''FZDT - Sémantika Datalogu pomocí NPB (Pokorny)''' - Takhle by se podle me melo u statnic zkouset. S prihlednutim k tomu, ze je clovek zkousen nejen z ty jedny otazky, ale i ctyrech dalsich. Pritom docela proklepnout, zjistit, co clovek umi, neumi a pustit. Zadnej stres. 

* '''DMJ - Stratifikovany Datalog s negaci (Pokorny)''' - Popsal jsem co je stratifikace. Program je stratifikovatelny, kdyz neexistuje v zavislostnim grafu cyklus s negativni hranou. Kdyz je program stratifikovatelny, tak ma MPB (minimalni pevny bod). Vyhodnoceni - pravidla se rozdeli do vrstev a postupne se od prvni vrstvy program vyhodnocuje algoritmem pro Datalog bez negace, tj. naivnim ci semi-naivnim pristupem.
}}

{{TODO|projit a doformatovat}}
''viz také otázka v DMJ: [[Databázové_modely_a_jazyky#Algoritmy_vyhodnocen.C3.AD_dotaz.C5.AF_v_Datalogu_a_Datalogu_s_negac.C3.AD|Algoritmy vyhodnocení dotazů v Datalogu a Datalogu s negací]]''

jazyk používaný v deduktivních db je Datalog - '''(data)logický program''' je množinou tvrzení a pravidel

Proměnnou x vyskytující se v pravidle nazveme '''omezenou''', jestliže se vyskytuje v literálu L v těle tohoto pravidla, přičemž:
* L je dán pravým predikátem, nebo
* L má tvar x = a nebo a = x, nebo
* L má tvar x=y nebo y=x a y je omezená.

Pravidlo je '''bezpečné''', jsou-li všechny jeho proměnné omezené.

Datalog má pouze bezpečná pravidla.

'''Sémantiku logických programů je možné vybudovat minimálně třemi různými způsoby:''' 
=== logicko-odvozovací přístup (Proof-Theoretic Approach) ===

Metoda: interpretace pravidel jako axiomů použitelných k důkazu, tj. provádíme substituce v těle pravidel a odvozujeme nová tvrzení z hlavy pravidel. V případě DATALOGu tak lze získat právě všechna odvoditelná tvrzení.

=== logicko-modelový přístup (Model-Theoretic Semantics) ===
:''Predstavme si to jako model v logice (analogicke pro logicko-odvozovaci pristup, kde je to take stejne jako v logice - take se z "axiomu" odvozuji vsechna tvrzeni).''

Metoda: za predikátové symboly dosadíme relace tak, aby na nich byla splněna pravidla. 

Př.: Uvažujme logický program LP 
 IDB: P(x) :- Q(x) 
 Q(x) :- R(x), 
tj. Q a P označují virtuální relace. 

Nechť:
 R(1) Q(1) P(1) 
 Q(2) P(2) M1 
 P(3) 
Relace P*, Q*, R* tvoří model M1 logického programu LP. 

* Nechť: R(1) (a ostatní tvrzení mají hodnotu FALSE). Pak relace P*, Q*, R* netvoří model programu P. 
* Nechť: R(1) Q(1) P(1) M2 

Pak relace P*, Q*, R* tvoří model M2 logického programu P. 
* Nechť EDB: R(1), tj. relační DB je dána jako R* ={(1)}. 
Pak M1 i M2 jsou s danou databází konzistentní. 

* M2 tvoří dokonce minimální model, tj. změníme-li v něm cokoliv, porušíme konzistenci.
 
* M1 netvoří minimální model. 
Pz.: při obou sémantikách obdržíme stejný výsledek. 

Nevýhody obou přístupů: neefektivní algoritmy v případě, že EDB je dána databázovými relacemi.

=== pomocí pevného bodu zobrazení (Fixpoint Semantics) ===

*Metoda: vyhodnocovací algoritmus+relační db stroj

Definice: '''Minimální pevný bod (MPB)''' pro program je takový pevný bod R*, že neexistuje žádný další pevný bod, který je vlastní podmnožinou R*.

Z toho plyne:
*Kdyz existuje '''nejmensi pevny bod (NPB)''', pak je jediným MPB.
*Existuje-li více MPB, pak jsou navzájem neporovnatelné a NPB neexistuje.

{{Zdroje|
* http://www.cs.nott.ac.uk/~nza/G53RDB07/rdb14.pdf
* http://webdam.inria.fr/Alice/pdfs/Chapter-12.pdf
**Knížka v pdf formátu zabývající se problematikou Datalogu [http://webdam.inria.fr/Alice/ link Datalog]
**Kopie z [http://www.ksi.mff.cuni.cz/~pokorny/vyuka/pokorny.dj/]:
}}

== Datalog s negací, stratifikace. ==
{{Zkazky|
* '''Datalog s negací (Pokorny)''' - Profesor si přípravu nepřečte pořádně, na škodu studentovi. Očekával jsem, že je hodný, nevyžaduje moc (např. kdybych si vytáhl větu o tr. uzávěru, nechtěl by důkaz), tak jsem se ani neobhajoval; nijak jsem se nechtěl hádat u státnic. Měl jsem popsané asi dvě stránky. Jednou z prvních otázek bylo: "A jak vypadá ten Datalog?" Zas a znovu, jako se stalo jiným, i já jsem spletl termíny term/proměnná/predikát. To, že má člověk praxi v prologu/datalogu, ještě nestačí k tomu, aby správně vysvětlil syntaxi. Dá se říct, že v Datalogu P(x) :- A(x), B(x) je něco jako <math>A(x) \& B(x) \Rightarrow P(x)</math> v logice 1. řádu. Doporučuji psát obecně, ne hned příklady. Profesor si dá záležet na detailech (např. u stratifikace se jednotlivé vrstvy píší jako P1, P2, ..., Pn, tedy čárky místo sjednocení, protože sjednocení by znamenalo, že nám nezáleží na pořadí). Ale kvůli takovým detailům zas nevyhazuje.
* '''Datalog s negaci (Pokorny)''' - Co to je ten datalog s negaci, kde se muze negace vyskytovat. (Otazka.. a co kdyby byla negace v hlave pravidla?) Vylozil jsem kde je problem (vic minimalnich modelu), zadefinoval stratifikaci, algoritmus na vypocet datalogickeho programu s negaci, porovnal (bez dk) s Ar. 
* '''DMJ - Stratifikovany Datalog s negaci (Pokorny)''' - Popsal jsem co je stratifikace. Program je stratifikovatelny, kdyz neexistuje v zavislostnim grafu cyklus s negativni hranou. Kdyz je program stratifikovatelny, tak ma MPB (minimalni pevny bod). Vyhodnoceni - pravidla se rozdeli do vrstev a postupne se od prvni vrstvy program vyhodnocuje algoritmem pro Datalog bez negace, tj. naivnim ci semi-naivnim pristupem. 
}}
<math>A_{RP} \{(), [ ], \cup, \times, rename \}</math> (pozitivní RA)
=== Datalog s negací ===
*	Datalog je silnější než <math>A_{RP}</math>, ale existují dotazy v <math>A_R</math>, které v Datalogu nelze vytvořit, 
: např. PŘEKLÁDÁ[JMÉNO] – (KVALIFIKACE(JAZYK=‘ANGL’)[JMÉNO])
*	k vyjádření takovýchto dotazů (obsahujících v relační algebře rozdíl) potřebuje Datalog negaci – je označován Datalog s negací, ovšem způsoby vyhodnocení programů v tomto jazyce obecně nevedou k jednoznačně definovaným virtuálním relacím – proto je identifikována podmnožina Datalogu s negací, která tuto jednoznačnost zajišťuje – tzv. stratifikovaný Datalog (viz dále)
=== stratifikace ===
*	jedná se o rozvrstvení pravidel do vrstev tak, aby byla zajištěna jednoznačnost vyhodnocování programů
*	definujeme pojem definice virtuální relace S, což je množina všech pravidel, kde se S vyskytuje v hlavě
*	Program P je stratifikovatelný, jestliže existuje disjunktní dělení P = P1 \union P2 .... \union Pn takové, že plati:
**	vyskytuje-li se predikátový symbol S pozitivně (je-li obsažen v pozitivním literálu v těle pravidla) v nějakém pravidle Pi, pak je jeho definice obsažena v sjednocení Pk pro 1 <= k <= i
**	vyskytuje-li se predikátový symbol S negativně (je-li obsažen v negativním literálu v těle pravidla) v nějakém pravidle Pi, pak je jeho definice obsažena v sjednocení Pk pro 1 <= k < i
*	zjišťování, zda je program stratifikovatelný (a nalezení konkrétního dělení) se provádí pomocí závislostních grafů s ohodnocenými hranami (negativní, pozitivní), '''jestliže se v grafu vyskytuje cyklus s negativní hranou, není program stratifikovatelný'''
* Př.: Program 
  P(x) :- ¬ Q(x)       (1)
  R(1)                 (2)
  Q(x) :- Q(x), ¬ R(x) (3)
: je stratifikovatelný. Stratifikace: {(2)} ∪ {(3)} ∪ {(1)}
: Program 
 P(x) :- ¬ Q(x)
 Q(x) :- ¬ P(x)
: není stratifikovatelný.
*Stratifikovatelný program má obecně více stratifikací. Ty jsou ekvivalentní, tj. vyhodnocení vede ke stejnému MPB
:takze at provedu jakoukoliv stratifikaci daneho programu, ziskam MPB, ale nemusi to byt NPB. Viz priklad, kde existuje vice MPB:
 %EDB
 dil(trojkolka, kolo, 3).
 dil(trojkolka, rám, 1).
 dil(rám, sedadlo, 1).
 dil(rám, pedál, 2).
 dil(kolo, ráfek, 1).
 dil(kolo, pneumatika, 1).
 dil(pneumatika, ventilek, 1).
 dil(pneumatika, duse, 1).
 
 %IDB
 velky(P) :- dil(P,S,Q), Q > 2.
 maly(P) :- dil(P,S,Q), not velky(P).
::Stratifikace a výsledný MPB
:::Stratum 0: Díl
:::Stratum 1: Velký = {trojkolka }
:::Stratum 2: Malý = {rám, kolo, pneumatika}
::Ale: Relace Malý={trojkolka, rám, kolo, duše}, Velký={} tvoří další minimální bod tohoto programu, ačkoliv není výsledkem stratifikovaného vyhodnocení.
*vyhodnocení stratifikovaného programu pak probíhá obdobně jako u Datalogu bez negace, s tím, že pokud se literál Q vyskytuje v pravidle negativně, použije se místo Q: adom^n – Q (adom je aktuální doména programu, tj. sjednocení všech konstant z EDB a IDB, n je počet atributů v Q)
* Stratifikovaný DATALOG¬ Předpoklady: pravidla jsou bezpečná, rektifikovaná.
[[Soubor:Img73.jpg|right|thumb|640px|'''vyjadřovací síla relačních dotazovacích jazyků''']]
'''Tvrzení:''' Nerekurzivní programy DATALOG¬u vyjadřují právě ty dotazy, které jsou vyjádřitelné v AR.

=== <strike>předpoklad uzavřeného světa</strike> (možná už není ve státnicích)===
*	předpoklad uzavřeného světa (CWA) je metapravidlo k odvozování negativní informace
**	jestliže tvrzení R(a1,...,an) není odvoditelné z pravidel (bez použití negace), pak platí not R(a1,...,an) (neboli co není známo, není pravda)
*	předpoklady pro použití CWA
**	různé konstanty neoznačují tentýž objekt
**	doména je uzavřená (konstanty z EDB+IDB) – neexistují relevantní konstanty mimo EDB a IDB
*	Datalog s negací nelze vybudovat na základě CWA
**	program s jediným pravidlem: NUDNÝ(EMIL) :- NOT ZAJÍMAVÝ(EMIL)
**	bylo by odvozeno NOT ZAJÍMAVÝ(EMIL) a NOT NUDNÝ(EMIL), což je ale v rozporu s uvedeným pravidlem – na druhou stranu stratifikace to řeší přirozeně (vezme se prázdná EDB, ZAJÍMAVÝ pak bude mít prázdnou množinu – jelikož nelze odvodit žádný prvek jako ZAJÍMAVÝ a následně se odvozuje NUDNÝ a tam bude {EMIL})
*	příklad z SQL (které používá CWA):
**	SELECT count(*) FROM employees WHERE secondname != „Iljič“
**	spočítej, kolik zaměstnanců má druhé jméno jiné než Iljič – problém nastává u zaměstnanců, kteří mají secondname = NULL, v takovém případě je podmínka ve WHERE vyhodnocena jako UNKNOWN a dle CWA následně jako FALSE, tedy zaměstnanci bez uvedeného druhého jména se do výsledku nezapočtou

=== další zdroje ===
* http://forum.matfyz.info/viewtopic.php?p=25929#p25929

[[Soubor:Cse670235x.png|right|thumb|374px|'''kořeny SQL''' [http://web.cse.ohio-state.edu/~gurari/course/cse670/html/cse670Ch15.html zdroj]]]

== Sémantika SQL ==
''viz [[Databázové_modely_a_jazyky#SQL_a_jeho_standardy|to samé v jiném okruhu]]''

== Rekurze v SQL. ==
{{Zkazky|
* '''Rekurzivní SQL (Pokorny?)''' - Hned se v tom zacal hrabat a padala slova jako Minimalni pevny bod, Tranzitivni uzaver a jine sproste vyrazy. Docela jsem si zaplaval, ptz hledat Min PB v SQL vyrazech neni zrovna moje kazdodenni hobby. Neco jsem tam nakonec vzdy vymyslel, zkousejici byl hodny a trpelivy. Nakonec se tvaril v pohode. Ne horsi nez 2, vypadal spokojene 
}}
{{TODO| doplnit teorii}}
[http://www.ksi.mff.cuni.cz/~pokorny/dj-new/DJ2-3-rekurze.pdf http://www.ksi.mff.cuni.cz/~pokorny/dj-new/DJ2-3-rekurze.pdf]

;Příklad z přednášky:
Tabulka: Zaměstnanci(č_zam, jméno, funkce, č_nad)

Najdi všechny nadřízené Nového (včetně něho sama)
<pre>
WITH RECURSIVE Nadřízení(jméno, č_nad, č_zam) AS
    (SELECT jméno, č_nad, č_zam
        FROM Zaměstnanci
        WHERE jméno = 'Nový'
        UNION ALL
    SELECT Z.jméno, Z.č_nad, Z.č_zam
        FROM Zaměstnanci AS Z
            INNER JOIN
            Nadřízení AS N
            ON N.č_nad = Z.č_zam)
SELECT * FROM Nadřízení
</pre>

;Příklad:
Mame tabulku Zamestnanci(jmeno, plat, vedouci). Najdete pomoci rekurzivniho dotazu vsechny zamestnance s platem nad 100 000, kteri jsou (i neprimi) podrizeni Ryby. 

<pre>
WITH RECURSIVE PodRybou(jméno) AS 
    (SELECT jméno
        FROM Zamestnanci
        WHERE vedouci = “Ryba”
        UNION ALL
    SELECT jméno
        FROM Zaměstnanci Z, PodRybou P
        WHERE Z.vedouci = P.jmeno
)
SELECT * FROM PodRybou
WHERE plat > 100 000
</pre>

== Tablo dotazy - statická analýza a optimalizace relačních dotazovacích jazyků. ==
{{Zkazky|
* '''SQL + vyhodnocovanie a optimalizácia dotazov (Richta)''' - bol super, dokonca mu nevadilo, že som zabudol popísať optimalizáciu, stačilo len 3 vetami vysvetliť, o čo ide
}}
{{TODO|projit a doplnit}}
* Statická analýza (relačních dotazovacích jazyků RDJ) chápeme ve smyslu statické analýzy programovacích jazyků PJ (viz Static code analysis) - analýza (kódu) dotazů bez vykonávání programů z nich vytvořených (bez dynamické analýzy). Lze ji vykonat automatizovaným nástrojem ale také formálními metodami které dokazují vlastnosti dotazů.
* Obvyklé cíle statické analýzy PJ (a tedy i RDJ):
** odhalení chyb
** Optimalizace jako součást kompilace
** Odhad složitosti úloh
** Bezpečnost, …

'''Veta:''' Pro každý omezený relační výraz E (selekce, projekce, přirozené spojení s disjunktními proměnnými) existuje T-dotaz q = (T; u) tak, že pro každou instanci I platí E(I) = q(I).

===Lokální optimalizace dotazů===
===Globální optimalizace===
====Homomorfismus tableau dotazů====
Nechť q1 = (T1, u1) a q2 = (T2, u2) jsou dva tablo dotazy. '''Homomorfismus''' z q2 na q1 je substituce θ taková, že θ(T2) ⊆ T1 a θ(u2) ⊆ u1.

'''Věta:''' q1 ⊆ q2 ⇔ existuje homomorfismus z q2 na q1.

Řekneme, že tablo dotaz (T, u) je '''minimální''', když neexistuje dotaz (S, v) ekvivalentní s (T, u) a |S|<|T| (tedy ostře méně spojení).

===Složitosti===
:co-r.e. ... co-rekursivne spocetne
:¬r. ... neni rekurzivni
[[File:DJ2-5-StatAnalOpt 1112.jpg]]

'''Veta''': Necht <math>q</math> a <math>q'</math> jsou T-dotazy. Pak nasledujici jsou NP-uplne problemy:
:(a) <math>q ⊆ q'</math> (problém existence homomorfismu)
:(b) <math>q ≡ q'</math>

'''Veta (Datalog)''': Splnitelnost idb relace r programem P je rozhodnutelna.

== Modelování preferencí, dotazování s preferencemi. ==
{{TODO|projit}}
* Modely preferencí a jejich učení - Model založený na atributech, kolaborativní filtrování, preferenční relace, hybridní modely
* Vyjádření preference - preferenční relace (porovnání x je lepší než y) vs. hodnotící funkce (x je dobrý na 5 hvězdiček, palec nahoru...).
* Implicitní vyjádření (vědomá akce) vs Explicitní vyjádření (chování se např. v eshopu - otevření detailů, prohlížení fotek, ...)
* Model preferencí umožňuje zjistit, jak je některý objekt preferovaný. Vytváří se z chování uživatele
* ''Model založený na atributech''
** Využívá atributů hodnocených položek
** Učení se sestává ze dvou kroků - lokální preference (normalizace hodnot atributů), globální preference (agregace ohodnocení a projekce vektorů do [0, 1])
* ''Kolaborativní filtrování''
** Najdu si množinu V uživatelů podobných uživateli U, kterým se líbí stejné věci
** „Zákazníci, kteří si koupili x si také koupili y“
** K výpočtu vzdáleností se používáji váhy sousedů, počítá se kosinova míra, pearsonova korelace ....
** Implementace - inmemory, bayesovy sítě, predikční modely...
* ''Preferenční relace''
** Užívané v ekonomii
** Porovnání objektů – x je lepší než y
** Neumožňuje jednoduché setřídění objektů podle aktuální vhodnosti
** Vytvořeno podle lidského uvažování - Přirozené pro uživatele, ale možná moc složité
** P(x,y) - mám radši y než x, R(x,y) - y je alespoň tak dobrá jako x, I(x,y) - mezi x a y nedokážu rozlišit, jsou stejně dobré
** CP-sítě Conditional probability networks

{{Statnice_I2}}