ZSBD-2st-1.2-lab12.tresc-1.1
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.
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
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
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.
<nazwisko>Abiteboul</nazwisko> <nazwisko>Buneman</nazwisko> <nazwisko>Suciu</nazwisko>
12. Dołącz do nazwisk tytuł książki, której tytuł posiada ciąg znaków „Data”.
<title>Data on the Web</title> <nazwisko>Abiteboul</nazwisko> <nazwisko>Buneman</nazwisko> <nazwisko>Suciu</nazwisko>
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
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>