Zaawansowane systemy baz danych/Laboratorium 12

From Studia Informatyczne

XML-owe bazy danych – ćwiczenia 2

Drugą część ćwiczeń poświęcimy językowi zapytań XQuery.

Wsparcie dla języka XQuery możemy zaobserwować zarówno w bazach danych dokumentów XML jak i w bazach danych obiektowo-relacyjnych otwartych na możliwość przechowywania i przetwarzania dokumentów XML. Przykładem bazy danych tego drugiego typu jest Oracle Database. SZBD Oracle 10g r2 nie tylko pozwala na przechowywanie dokumentów XML, ale także na ich zaawansowane przetwarzanie i przepytywanie przy wykorzystaniu języka XQuery.


Zapytania na dokumentach umieszczonych w repozytorium XML

1. Wejdź na stronę http://devel.cs.put.poznan.pl:5560/isqlplus i zaloguj się do programu isqlplus jako użytkownik scott z hasłem tiger, identyfikator połączenia to devel.

Grafika:ZSBD-2st-1.2-lab12.tresc-1.1-Slajd1.png


2. Aby móc wykonywać swobodnie polecenia XQuery wybierz Preferences, a następnie System Configuration? Script Execution. Na samym dole strony ustaw wartość opcji XQuery Base URI na /public/. Wybierz przycisk Apply i powróć do edytora poleceń za pomocą zakładki Workspace.


3. Zmień długość wyświetlanych wyników za pomocą polecenia: set long 20000. Każde polecenie wykonujemy wybierając przycisk Execute

Grafika:ZSBD-2st-1.2-lab12.tresc-1.1-Slajd3.png


4. W bazie danych (repozytorium dokumentów XML) znajduje się dokument: bib.xml. Aby poznać jego zawartość napiszemy dwa zapytania XQuery. W programie isqlplus 10g r2 zapytania XQuery pisze się poprzedzając je słowem kluczowym XQuery.

Nasze pierwsze zapytanie będzie miało postać:

 for $b in doc("bib.xml")
 return $b

Grafika:ZSBD-2st-1.2-lab12.tresc-1.1-Slajd5.png

Wynik zapytania nie jest sformatowanym dokumentem XML

Dokument bib.xml ma następujący schemat:

 <!ELEMENT bib          (book* )>
 <!ELEMENT book         (title,  (author+ | editor+ ), publisher, price )>
 <!ATTLIST book         year CDATA  #REQUIRED >  
 <!ELEMENT author       (last, first )>
 <!ELEMENT editor       (last, first, affiliation )>
 <!ELEMENT title        (#PCDATA )>
 <!ELEMENT last         (#PCDATA )>
 <!ELEMENT first        (#PCDATA )>
 <!ELEMENT affiliation  (#PCDATA )>
 <!ELEMENT publisher    (#PCDATA )>
 <!ELEMENT price        (#PCDATA )>  

Wykorzystując język XQuery oraz zawartość dokumentu bib.xml wykonaj następujące polecenia.


5. Pobierz nazwiska wszystkich autorów książek.

 <last>Stevens</last> 
 <last>Stevens</last> 
 <last>Abiteboul</last> 
 <last>Buneman</last> 
 <last>Suciu</last>  


6. Dla każdej pary elementów title, autor, znajdującej się w jednym elemencie book, stwórz element ksiazka posiadający w sobie dwa podelementy title, author.

 <ksiazka>
 	<author>
 		<last>Stevens</last>
 		<first>W.</first>
 	</author>
 	<title>TCP/IP Illustrated</title>
 </ksiazka>
 <ksiazka>
 	<author>
 		<last>Stevens</last>
 		<first> W.</first>
 	</author>
 	<title>Advanced Programming in the Unix environment</title>
 </ksiazka>
 <ksiazka>
 	<author>
 		<last>Abiteboul</last>
 		<first>Serge</first>
 	</author>
 	<title>Data on the Web</title>
 </ksiazka>
 <ksiazka>
 	<author> 
 		<last>Buneman</last>
 		<first>Peter</first>
 	</author>
 	<title>Data on the Web </title>
 </ksiazka>
 <ksiazka>
 	<author>
 		<last>Suciu</last>
 		<first>Dan</first>
 	</author>
 	<title>Data on the Web</title>
 </ksiazka>


7. Dla każdej pary title, author, znajdującej się w jednym elemencie book, stwórz element ksiazka posiadający w sobie dwa podelementy tytuł, autor.

 <ksiazka>
 	<autor>StevensW.</autor>
 	<tytul>TCP/IP Illustrated</tytul>
 </ksiazka>
 <ksiazka>
 	<autor>StevensW.</autor>
 	<tytul>Advanced Programming in the Unix e nvironment</tytul>
 </ksiazka>
 <ksiazka>
 	<autor>AbiteboulSerge</autor>
 	<tytul>Data on the Web</tytul>
 </ksiazka>
 <ksiazka>
 	<autor>BunemanPeter</autor>
 	<tytul>D ata on the Web</tytul>
 </ksiazka>
 <ksiazka>
 	<autor>SuciuDan</autor>
 	<tytul>Data on the Web</tytul>
 </ksiazka>


8. W powyższym zapytaniu utwórz znacznik obejmujący rezultat zapytania <wynik>. W przypadku zastosowania podzapytania pamiętaj o objęciu podzapytania klamrami { }.

 <wynik>
 	<ksiazka>
 		<autor>StevensW.</autor>
 		<tytul>TCP/IP Illustrated</tytul>
 	</ksiazka>
 	<ksiazka>
 		<autor>StevensW.</autor>
 		<tytul>Advanced Programming in the Unix e nvironment</tytul>
 . . .
 </wynik>


9. Wyświetl imiona autorów książki o tytule "Data on the Web".

 <imiona>
 	<imie>Serge</imie>
 	<imie>Peter</imie>
 	<imie>Dan</imie>
 </imiona>


10. Uzyskaj informację o całym elemencie – książce, posiadającej tytuł "Data on the Web". Uzyskaj ten wynik na dwa sposoby: za pomocą odpowiedniego wyrażenia ścieżkowego oraz za pomocą klauzuli WHERE.

 <DataOnTheWeb>
 	<book year="2000">
 		<title>Data on the Web</title>
 		<author>
 			<last>Abiteboul</last>
 			<first>Serge</first>
 		</author>
 		<author>
 			<last>Buneman</last>
 			<first>Peter</first>
 		</author>
 		<author>
 			<last>Suciu</last>
 			<first>Dan</first>
 		</author>
 		<publisher>Morg an Kaufmann Publishers</publisher>
 		<price>39.95</price>
 	</book>
 </DataOnTheWeb>


11. Pobierz elementy nazwiska autorów książek, które w tytule posiadają ciąg znaków „Data”. Zastosuj funkcję contains.

 <Data>
 	<nazwisko>Abiteboul</nazwisko>
 	<nazwisko>Buneman</nazwisko>
 	<nazwisko>Suciu</nazwisko>
 </Data>


12. Dołącz do nazwisk tytuł książki, której tytuł posiada ciąg znaków „Data”.

 <Data>
 	<title>Data on the Web</title>
 	<nazwisko>Abiteboul</nazwisko>
 	<nazwisko>Buneman</nazwisko>
 	<nazwisko>Suciu</nazwisko>
 </Data>


13. Wyświetl te tytuły książek, które mają nie więcej niż dwóch autorów (<=2)

 <title>TCP/IP Illustrated</title>
 <title>Advanced Programming in the Unix environment</title>
 <title>The Economics of Technology and Content for Digital TV</title>


14. Podaj tytuły książek i liczbę ich autorów

 <ksiazka>
 	<title>TCP/IP Illustrated</title>
 	<autorow>1</autorow>
 </ksiazka>
 <ksiazka>
 	<title>Advanced Programming in the Unix environment</title>
 	<autorow>1 </autorow>
 </ksiazka>
 <ksiazka>
 	<title>Data on the Web</title>
 	<autorow>3</autorow>
 </ksiazka>
 <ksiazka>
 	<title>The Economics of Technology and Content for Digital TV</title>
 	<autorow>0</autorow>
 </ksiazka>


15. Znajdź tytuły i autorów (jeśli istnieją) najdroższych książek

 <najdroższe>
   <najdroższa>
     <title>The Economics of Technology and Content for Digital TV</title>
   </najdroższa>
 </najdroższe>


16. Dla każdego autora wyświetl tytuły jego książek. Wykorzystaj odpowiednie funkcje aby wyeliminować duplikaty autorów.

 <autor>
 	<last>Abiteboul</last>
 	<title>Data a on the Web</title>
 </autor>
 <autor>
 	<last>Buneman</last>
 	<title>Data on the Web</title>
 </autor>
 <autor>
 	<last>Stevens </last>
 	<title>TCP/IP Illustrated</title>
 	<title>Advanced Programming in the Unix environment</title>
 </autor>
 <autor>
 	<last>Suciu</last>
 	<title>Data on the Web</title>
 </autor>


Zapytania na zawartości tabel relacyjnych

Funkcjonalność języka zapytań XQuery pozwala na daleko idącą integrację. Przykładowo w SZBD Oracle oprócz funkcji doc udostępniającej pojedynczy dokument umieszczony w repozytorium można przetwarzać także zawartość tabel relacyjnych wykorzystując funkcję ora:view.

Przykładowo zapytanie:

 XQuery
 for $z in ora:view("ZESPOLY")
 return $z

da w wyniku zbiór dokumentów utworzonych dla każdego wiersza tabeli ZESPOLY

Grafika:ZSBD-2st-1.2-lab12.tresc-1.1-Slajd7.png


Wykorzystując funkcję ora:view oraz tabele PRACOWNICY i ZESPOLY wykonaj poniższe ćwiczenia.


17. Wyświetl to, co daje w wyniku funkcja ora:view(„ZESPOLY”)

 <ROW>
 	<ID_ZESP>10</ID_ZESP>
 	<NAZWA>ADMINISTRACJA</NAZWA>
 	<ADRES>PIOTROWO 3A</ADRES>
 </ROW>
 <ROW>
 	<ID_ZESP>20</ID_ZESP>
 	<NAZWA>SYSTEMY ROZPROSZONE</NAZWA>
 	<ADRES>PIOTROWO 3A</ADRES>
 </ROW>
 . . .


18. Wyświetl nazwy zespołów oraz liczbę ich pracowników. Wyniki posortuj wg liczby pracowników.

 <ZESPOL>
 	<NAZWA>BADANIA OPERACYJNE</NAZWA>
 	<LICZBA>0</LICZBA>
 </ZESPOL>
 <ZESPOL>
 	<NAZWA>ALGORYTMY</NAZWA>
 	<LICZBA>1</LICZBA>
 </ZESPOL>
 <ZESPOL>
 	<NAZWA>ADMINISTRACJA</NAZWA>
 	<LICZBA>2</LICZBA>
 </ZESPOL>
 <ZESPOL>
 	<NAZWA>SYSTEMY EKSPERCKIE</NAZWA>
 	<LICZBA>4</LICZBA>
 </ZESPOL>
 <ZESPOL>
 	<NAZWA>SYSTEMY ROZPROSZONE</NAZWA>
 	<LICZBA>7</LICZBA>
 </ZESPOL>


19. Wyświetl pracowników i ich podwładnych. Pomiń pracowników bez podwładnych.

 <SZEFOWIE>
 	<SZEF ID_PRAC="100">
 		<NAZWISKO>WEGLARZ</NAZWISKO>
 		<PODWLADNI>
 			<NAZWISKO>BLAZEWICZ</NAZWISKO>
 			<NAZWISKO>SLOWINSKI</NAZWISKO>
 			<NAZWISKO>BRZEZINSKI</NAZWISKO>
 			<NAZWISKO>MAREK</NAZWISKO>
 		</PODWLADNI>
 	</SZEF>
 	<SZEF ID_PRAC="110">
 		<NAZWISKO>BLAZEWICZ</NAZWISKO>
 		<PODWLADNI>
 			<NAZWISKO>KONOPKA</NAZWISKO>
 		</PODWLADNI>
 	</SZEF>
 . . .
 </SZEFOWIE>


20. Wyświetl nazwy zespołów oraz element zależny od liczby ich pracowników. Warianty to: 0, 1, n, max. Wyniki posortuj wg liczby pracowników.

 <ZESPOL>
 	<NAZWA>BADANIA OPERACYJNE</NAZWA>
 	<BRAK_PRACOWNIKOW></BRAK_PRACOWNIKOW>
 </ZESPOL>
 <ZESPOL>
 	<NAZWA>ALGORYTMY</NAZWA>
 	<PRACOWNIK>BLAZEWICZ</PRACOWNIK>
 </ZESPOL>
 <ZESPOL>
 	<NAZWA>ADMINISTRACJA</NAZWA>
 	<LICZBA>2</LICZBA>
 </ZESPOL>
 <ZESPOL>
 	<NAZWA>SYSTEMY EKSPERCKIE</NAZWA>
 	<LICZBA>4</LICZBA>
 </ZESPOL>
 <ZESPOL>
 	<NAZWA>SYSTEMY ROZPROSZONE</NAZWA>
 	<NAJWIECEJ></NAJWIECEJ>
 </ZESPOL>