XDEVICE deduktvny dotazovac jazyk Marin Kamenik Pravidl sa

  • Slides: 15
Download presentation
X-DEVICE deduktívny dotazovací jazyk Marián Kamenišťák

X-DEVICE deduktívny dotazovací jazyk Marián Kamenišťák

 • Pravidlá sa skladajú z podmienky a záveru, kde podmienka definuje vzory objektov

• 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

• 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

• 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)) •

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

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

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

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ý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(I 1, I 2)’ sekvenciu prvkov medzi elementami I 1 a I 2.

Výrazy usporiadania if R@report(paragraph 2. section 3. chapter 2 : P) then result(paragraph :

Výrazy usporiadania if R@report(paragraph 2. section 3. chapter 2 : P) then result(paragraph : P) Nájde druhý paragraf tretej sekcie druhej kapitoly reportu. Je to skratka za: if R@report(chapter 2 XX 1) and XX 1@chapter(section 3 XX 2) and XX 2@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’,

Exportovanie výsledkov • Výsledok dotazu ako XML dokument • if B@book(title: T, publisher=‘John Woods’, year: Y>1991) then xml_result(book 1(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 book 1 je odpoveďou na dotaz podľa DTD: <!DOCTYPE book 1 [ <!ELEMENT book 1 (title, year)> ]>

Exportovanie výsledkov • Na vytvorenie stromu : • if B@book(title: T, publisher=‘John Woods’, year:

Exportovanie výsledkov • Na vytvorenie stromu : • if B@book(title: T, publisher=‘John Woods’, year: Y>1991) then xml_result(bib 1(book 1(title: T, year: Y))) Vytvorí výsledok s DTD: <!DOCTYPE bib 1 [ <!ELEMENT bib 1 (book 1)*> <!ELEMENT book 1 (title, year)> ]>

Exportovanie výsledkov <!ELEMENT partlist (part)*> <!ELEMENT part EMPTY> <!ATTLIST partid CDATA #REQUIRED partof CDATA

Exportovanie výsledkov <!ELEMENT partlist (part)*> <!ELEMENT part EMPTY> <!ATTLIST partid CDATA #REQUIRED partof CDATA #IMPLIED name CDATA #REQUIRED > plochá relácia <!ELEMENT parttree (part)*> <!ELEMENT part (part)*> <!ATTLIST partid CDATA #REQUIRED name CDATA #REQUIRED > reperezentovaná stromom

Exportovanie výsledkov Z plochých štruktúr rekurzívne vytvoríme hierarchickú štruktúru: if P@part(^partid: ID, ^name: Name)

Exportovanie výsledkov Z plochých štruktúr rekurzívne vytvoríme hierarchickú štruktúru: if P@part(^partid: ID, ^name: Name) then part 1(^partid: ID, ^name: Name) if PP 1@part 1(^partid: ID) and P 1@part(^partid: ID, ^parent: Parent) and PP 2@part 1(^partid: Parent) then PP 2@part 1(part: list(PP 1)) if P 1@part 1 and not P 2@part 1(part P 1) then xml_result(parttree(part 1: list(P 1)))

Exportovanie výsledkov • Direktíva xml_sorted sa používa na zoradenie prvkov výsledku podľa hodnoty v

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], bib 1(book 1(title: T, year: Y)))