150 likes | 264 Views
X-DEVICE dedukt ívny dotazovací jazyk. Marián Kamenišťák. Pravidlá sa skladajú z podmienky a záveru, kde podmienka definuje vzory objektov databáze a záver je z nich odvodená trieda, ktorá definuje objekty DB, ak je podmienka splenená. if A@arc(s tart=1, end:Y) then path_from_one(end:Y)
E N D
X-DEVICEdeduktívny dotazovací jazyk Marián Kamenišťák
Pravidlá sa skladajú z podmienky a záveru, kde podmienka definuje vzory objektov databáze a záver je z nich odvodená trieda, ktorá definuje objekty DB, ak je podmienka splenená .
if A@arc(start=1, end:Y) then path_from_one(end:Y) Objekt s atribútom end=Y triedy path_from_one existuje, ak existuje objekt s OID A triedy arc s atribútmi start=1 a end=Y. Path_from_one je odvodená trieda, tj. trieda, ktorej inštancie sú odvodené z deduktívnych pravidiel.
V hlave pravidla (thenčasť) je povolená len jedna odvodená trieda. Avšak s rovnakou odvodenou triedou v hlave môže existovať viac pravidiel. Potom je výsledkom zjednotenie týchto pravidiel. • Mna uzlov dosiahnuteľných z uzlu 1: if P@path_from_one(end:Y) and A@arc(start:Y, end:Z /=1) then path_from_one(end:Z)
Path expressions • if C@chapter(intro /= I, paragraph.section P) then result(paragraph:list(P)) • Nájde všetky paragrafy sekcie, ktorých kapitola nemá intro( kapitola má intro a sekcie, kt. obsahujú paragrafy). • Premenné sú inštancované cez ‘:’ operátor, ak sú odpovedajúce atribúty jednohodnotové, inak sa používa operátor ‘’. Získame odvodenú triedu result s atribútom paragraph ako agerg. fciu list (utriedená sekvencia).
Path expressions • if S@section(title=‘Procedure’, instrument.X.content I) then result(instrument:list(I)) Ktoré inštrumenty sme použili v sekcii Procedura? Ak vieme počet krokov v ceste, ale nie konkretne meno kroku, stačí ho nahradiť premennou. Ak sú časti cesty neznáme (mená a počet krokov), použijeme operátor ‘*’. sekcia -> obsah-> akcie -> inštrumenty
Path expressions • If R@report (paragraph.* P) then result(paragraph:list(P)) Chceme všetky paragrafy vyskytujúce sa kdekolvek v elemente správy • Ak potrebujeme riešenie s najkratšou cestou, používame ‘+’ operátor.
Flatting operator • if S@section(title $ ‘keyword’) then result(section:list(S)) Nájde všetky sekcie s nadpisom obsahujúci kľúčové slovo. Operátor zploštenia ‘’ je daný hneď za meno elementu, kt. chceme zploštiť. Tým sa vráti reťazec pozostávajúci zo všetkých jeho podelementov, v kt. sa dá napr. vyhľadávať text. Operátor‘$’ slúži na vyhľadávanie v reťazci. DTD: <!ELEMENT section(title)> <!ELEMENT title (#PCDATA)*>
Výrazy usporiadania • Implementácia operátorov zotriedenia je založená na implementácii viachodnotových atribútov cez list, v kt. je dané poradie elementov. • if S@section(title=‘Procedure’, instrument.*.content <=2 I) then result(instrument:list(I)) vráti prvé dva elementy z listu. Podobne operátor ‘n’ vráti n-tý prvok listu, operátor ‘between(I1, I2)’ sekvenciu prvkov medzi elementami I1 a I2.
Výrazy usporiadania if R@report(paragraph2.section3.chapter2 :P) then result(paragraph :P) Nájde druhý paragraf tretej sekcie druhej kapitoly reportu. Je to skratka za: if R@report(chapter 2 XX1) and XX1@chapter(section 3 XX2) and XX2@section(paragraph 2 P) then result(paragraph :P)
Exportovanie výsledkov • Výsledok dotazu ako XML dokument • if B@book(title:T, publisher=‘John Woods’, year:Y>1991) then xml_result(book1(title:T, year:Y)) vráti názov a rok vydania kníh od Johna Woodsa publikované po roku 1991. xml_result je direktíva, kt. oznamuje dotazovaciemu procesoru, že odvodená trieda book1 je odpoveďou na dotaz podľa DTD: <!DOCTYPE book1 [ <!ELEMENT book1 (title, year)> ] >
Exportovanie výsledkov • Na vytvorenie stromu : • if B@book(title:T, publisher=‘John Woods’, year:Y>1991) then xml_result(bib1(book1(title:T, year:Y))) Vytvorí výsledok s DTD: <!DOCTYPE bib1 [ <!ELEMENT bib1 (book1)*> <!ELEMENT book1 (title, year)> ] >
Exportovanie výsledkov <!ELEMENT partlist (part)*> plochá relácia <!ELEMENT part EMPTY> <!ATTLIST part partid CDATA #REQUIRED partof CDATA #IMPLIED name CDATA #REQUIRED > <!ELEMENT parttree (part)*> reperezentovaná stromom <!ELEMENT part (part)*> <!ATTLIST part partid CDATA #REQUIRED name CDATA #REQUIRED >
Exportovanie výsledkov Z plochých štruktúr rekurzívne vytvoríme hierarchickú štruktúru: if P@part(^partid:ID, ^name:Name) then part1(^partid:ID, ^name:Name) if PP1@part1(^partid:ID) and P1@part(^partid:ID, ^parent:Parent) and PP2@part1(^partid:Parent) then PP2@part1(part:list(PP1)) if P1@part1 and not P2@part1(part P1) then xml_result(parttree(part1:list(P1)))
Exportovanie výsledkov • Direktíva xml_sorted sa používa na zoradenie prvkov výsledku podľa hodnoty v hlave pravidla: • if B@book(title:T, publisher=‘John Woods’, year:Y>1991) then xml_sorted([T], bib1(book1(title:T, year:Y)))