Język XML Query - Instytut Automatyki i Informatyki Stosowanej
Transkrypt
Język XML Query - Instytut Automatyki i Informatyki Stosowanej
Język XML Query Czym jest XML Query? Wprowadzenie do składni języka Język XML Query Użycie XML Query Podsumowanie Tomasz Traczyk [email protected] http://www.ia.pw.edu.pl/~ttraczyk/ Politechnika Warszawska Wydział Elektroniki i Technik Informacyjnych Instytut Automatyki i Informatyki Stosowanej 2 T.Traczyk: Język XML Query Po co XML Query? Po co język zapytań do XML? • Czego oczekujemy od języka zapytań? Wyszukiwanie w XML Query (XQuery) • Jest deklaratywnym językiem zapytań 1. Powinien umożliwiać zapisanie złożonych – dokumentach XML – innych źródłach dostępnych w XML-u (serwisy WWW, bazy danych itp.) • Czym jest XML Query? Przetwarzanie danych z wyż. wym. źródeł – obliczenia – przeznaczonym do wyszukiwania w źródłach XML-owych warunków wyszukiwania 2. Powinien być deklaratywny – bazującym na XPath 2.0 3. Powinien zwracać wyniki w tej samej formie, – umożliwiającym konstruowanie dokumentów XML w jakiej istnieją dane źródłowe – o możliwościach porównywalnych z językami zapytań dla baz danych 4. Powinien umożliwiać wykonywanie – łączenie danych • Jest to język funkcyjny przekształceń wyszukanej informacji, – przetwarzanie w stylu bliższym w tym agregacji programistom (w porównaniu do XSLT) – wolny od efektów ubocznych Dlaczego nie wystarczy XPath? • Języki zapytań do baz danych (np. SQL, OQL) • XPath spełnia tylko 1. i 2. • Ale na bazie XPath można zbudować język – z możliwością silnego typowania • Składnia XQuery spełniają te oczekiwania – ma być czytelna dla człowieka ♦ zapytań mający pozostałe pożądane cechy ♦ 3 T.Traczyk: Język XML Query nie jest dialektem XML – wielkość liter ma znaczenie 4 słowa kluczowe języka pisze się małymi literami T.Traczyk: Język XML Query Przykład Przeszukiwany dokument: Przykład, c.d. Zapytanie XQuery: – wyszukiwanie publikacji z roku 1998 <?xml version = '1.0' encoding = 'windows-1250'?> <publikacje> <publikacja id="360" typ="REFERAT"> <tytul>Język XML w aplikacjach z bazami danych</tytul> <autorzy> <autor afiliacja="WEiTI"> <nazwisko>Traczyk</nazwisko><imiona>Tomasz</imiona> </autor> <autor afiliacja="WEiTI"> <nazwisko>Macewicz</nazwisko><imiona>Włodzimierz</imiona> </autor> </autorzy> <cechy> <cecha id="TYTUŁ_KONFER"> IV Konferencja użytkowników i developerów Oracle </cecha> <cecha id="MIEJSCE_KONF">Kościelisko</cecha> <cecha id="ORGANIZATOR">PLOUG</cecha> <cecha id="STRONY">133-146</cecha> </cechy> <rok>1998</rok> </publikacja> <publikacja> ... </publikacja> Uproszczony fragment danych wyjściowych z systemu informacji o ... publikacjach na Wydziale Elektroniki i Technik Informacyjnych </publikacje> Politechniki Warszawskiej 5 T.Traczyk: Język XML Query <odpowiedz> Zmienna $b przebiega sekwencję węzłów będącą wynikiem ścieżki XPath { for $b in doc("publik.xml")//publikacja where $b//rok="1998" return <referat rok="{$b/rok}" miejsce="{$b//cecha[@id='MIEJSCE_KONF']}"> {$b/tytul} </referat> } </odpowiedz> 6 T.Traczyk: Język XML Query Przykład, c.d. Zapytanie XQuery: Przykład, c.d. Zapytanie XQuery: – wyszukiwanie publikacji z roku 1998 – wyszukiwanie publikacji z roku 1998 <odpowiedz> Warunek where pozwala dodatkowo ograniczyć wynik { for $b in doc("publik.xml")//publikacja where $b//rok="1998" return <referat rok="{$b/rok}" miejsce="{$b//cecha[@id='MIEJSCE_KONF']}"> {$b/tytul} </referat> } </odpowiedz> <odpowiedz> w treści wyniku można użyć wyrażeń odwołujących się do zmiennych { for $b in doc("publik.xml")//publikacja where $b//rok="1998" return <referat rok="{$b/rok}" miejsce="{$b//cecha[@id='MIEJSCE_KONF']}"> {$b/tytul} </referat> } </odpowiedz> Klauzula return kształtuje postać wyniku; 7 T.Traczyk: Język XML Query 8 T.Traczyk: Język XML Query Przykład, c.d. Zapytanie XQuery: Przykład, c.d. Zapytanie XQuery: – wyszukiwanie publikacji z roku 1998 – wyszukiwanie publikacji z roku 1998 Cały wynik zapytania można „wmontować” w strukturę XML <odpowiedz> { for $b in doc("publik.xml")//publikacja where $b//rok="1998" return <referat rok="{$b/rok}" miejsce="{$b//cecha[@id='MIEJSCE_KONF']}"> {$b/tytul} </referat> } </odpowiedz> <odpowiedz> { for $b in doc("publik.xml")//publikacja where $b//rok="1998" return <referat rok="{$b/rok}" miejsce="{$b//cecha[@id='MIEJSCE_KONF']}"> {$b/tytul} </referat> } </odpowiedz> Wynik: <odpowiedz> <referat rok="1998" miejsce="Kościelisko"> <tytul> Język XML w aplikacjach z bazami danych </tytul> </referat> ... </odpowiedz> 9 T.Traczyk: Język XML Query 10 T.Traczyk: Język XML Query Standaryzacja XQuery Wymagania dla XQuery Stan standaryzacji • Język XQuery jest silnie zależny od XPath 2.0 – standaryzacją zajmuje się ta sama grupa • • • • • Dokumenty dotyczące standaryzacji XQuery mają status Working Draft • • Standaryzacja jest prowadzona przez XML Query Working Group w ramach W3C • Proces standaryzacyjny jest jest daleki od zakończenia, ale postępuje • Standard jest słabo ustabilizowany – w kolejnych wersjach dokumentów są dość duże zmiany – w szczególności zmieniają się szczegóły składni, nazwy funkcji itp. • • • • • • • 11 Czytelność składni języka dla człowieka Deklaratywność Niezależność od protokołów i środowisk użycia Uwzględnienie XML-owego modelu danych, przestrzeni nazw i schematów XML Działanie także bez dostępu do schematów dokumentów Silne typowanie (typy proste i złożone) Istnienie kwantyfikatorów Możliwość operowania na hierarchiach i sekwencjach Możliwość łączenia informacji z wielu źródeł Możliwość wykonywania agregacji Transformacje dokumentów XML i możliwość tworzenia wynikowych struktur XML Możliwość nawigowania po odwołaniach (referencjach) do identyfikatorów T.Traczyk: Język XML Query Czym jest XML Query? Wprowadzenie do składni języka Użycie XML Query Podsumowanie 12 T.Traczyk: Język XML Query Podstawowe elementy języka Sekwencje • Uporządkowany ciąg jednostek (items): – węzłów – wartości atomowych • Pojedyncza jednostka jest tożsama z jednoelementową sekwencją • Sekwencji nie można zagnieżdżać • Porządek w sekwencji – zgodny z tzw. porządkiem dokumentu – chyba że użyto klauzuli order by • Zapis: (jednostka1, jednostka2, ...) Wyrażenia • Wartości wszystkich wyrażeń są sekwencjami • Wyrażenia zawierają – stałe i jawnie zapisane sekwencje – odwołania do zmiennych – operatory – wywołania funkcji wbudowanych i użytkownika – ścieżki XPath – wyrażenia FLWOR – wyrażenia warunkowe 13 Zmienne • Oznacza się $nazwa • Mogą, ale nie muszą, być deklarowane Podstawowe elementy języka, c.d. • Wielka liczba funkcji wbudowanych XPath 2.0 • Obejmują m.in. – operacje na sekwencjach Operatory i porównania – operacje na węzłach i wartościach • Typowe operatory arytmetyczne i logiczne • Porównania prostych wartości: eq, ne, lt, le, gt, ge • Porównania ogólne: =, !=, <, <=, >, >= – operacje arytmetyczne Źródła danych XPath • Najprostszym zapytaniem XQuery jest sama ścieżka XPath • Ścieżka XPath użyta w XQuery musi zaczynać się od • Wszystkie zapytania bazują na – zmiennej ścieżkach XPath – funkcji – źródła danych – ścieżka pozwala „dostać się” • Funkcje wbudowane udostępniające do właściwych danych dane zewnętrzne: w strukturze hierarchicznej – doc(URI) – udostępnia zewnętrzny – można w niej umieścić złożone warunki • W XQuery można korzystać z nieco okrojonej w stosunku do XPath składni ścieżek dokument – collection(URI) – udostępnia zewnętrzną kolekcję (np. dane z bazy) pusta sekwencja pusty napis – prawda w przeciwnym wypadku – nie dotyczy to jawnych konwersji cast as – operacje na tekstach – operacje na datach i czasie – obsługę błędów i śledzenie Budowa zapytania XQuery • Efektywna wartość logiczna wyrażeń – fałsz jeśli: ♦ liczba 0 lub NaN ♦ – wyrażenia regularne 14 • Wartości true i false • Operatory or i and oraz funkcja not() ♦ – agregacje – połączenie porównania elementów sekwencji z kwantyfikatorem exists • Porównywanie tożsamości węzłów – identyczność: is – porządek: <<, >> • Porównywanie całych gałęzi (z węzłami podrzędnymi): deep-equal() T.Traczyk: Język XML Query Wartości logiczne Funkcje wbudowane Komentarze • Oznaczenie: (: ... :) • Komentarze można zagnieżdżać T.Traczyk: Język XML Query Wyrażenia FLWOR Klauzula for Wyrażenia FLWOR • Przykład: wypisanie w kolejności chronologicznej tytułów publikacji mających tylko jednego autora for $p in doc("publik.xml")//publikacja let $a := $p/autorzy/autor where count($a) = 1 order by $p/rok return $p/tytul • Wszystkie klauzule są opcjonalne, ale musi wystąpić przynajmniej raz for lub let • Wyrażenia FLWOR można zagnieżdżać • Służy do organizowania iteracji • Przypisuje do zmiennej kolejne elementy sekwencji – wyniku wyrażenia Klauzula let • Służy do wykonywania podstawień • Przypisuje do zmiennej całą wartość wyrażenia na raz Klauzula where • Określa warunki filtrowania sekwencji zwróconej przez klauzule for i let Klauzula order by • Określa sortowanie tej sekwencji – niektóre implementacje mogą nie mieć tego ograniczenia (Full Axis Feature) Klauzula return • Kształtuje postać wyniku 15 T.Traczyk: Język XML Query 16 T.Traczyk: Język XML Query Wyrażenia FLWOR, c.d. Zagnieżdżanie wyrażeń FLWOR <spis> { for $p in doc("publik.xml")//publikacja return <pozycja tytul="{$p/tytul}"> { for $a in $p//autor return <autor nazwisko="{$a/nazwisko/text()}"/> } </pozycja> } </spis> Budowa zapytania XQuery, c.d. Konstruowanie wynikowych struktur XML • Umieszczanie (literalnie) elementów wynikowej struktury („szablonu”) w treści zapytania – wartości wyrażeń XQuery wstawia się do „szablonu” przez ujęcie wyrażeń w { } ♦ element ♦ attribute ♦ text ♦ pi ♦ comment • XQuery dobrze nadaje się do łączenia danych z różnych źródeł Przykład: • Postać: – every $zmienna in sekwencja satisfies warunek – some $zmienna in sekwencja satisfies warunek • Badają elementy sekwencji • Stosowane np. w klauzuli where – umożliwiają wyliczanie ♦ nazw ♦ wartości wstawianych jednostek Unikalność • Funkcja distinct-values() – eliminuje powtórzenia z wyniku zapytania – używana np. w części in klauzuli for 18 Łączenie danych Łączenie danych z różnych źródeł Kwantyfikatory – konstruktory: <spis> <pozycja tytul="Język XML w aplikacjach z bazami danych"> <autor nazwisko="Traczyk"/> <autor nazwisko="Macewicz"/> </pozycja> ... </spis> T.Traczyk: Język XML Query • Postać: if warunek then wyrażenie1 else wyrażenie2 • Część else jest obowiązkowa • Stosowanie computed constructors Wynik: 17 Wyrażenia warunkowe T.Traczyk: Język XML Query Grupowanie i agregacje Grupowanie • Brak specyficznych konstrukcji językowych do grupowania • Efekt grupowania można uzyskać np. przez odpowiednie zagnieżdżanie wynikowych elementów XML • Dodatkowy dokument: <instytucje> <instytucja kod="WEiTI">Wydział Elektroniki</instytucja> ... </instytucje> • Zapytanie – „złączenie” danych publikacji i danych instytucji, w których afiliowani są autorzy for $p in doc("publik.xml")//publikacja, $i in doc("instyt.xml")//instytucja where $i/@kod = $p//autor/@afiliacja return <pozycja> {$p/tytul} {$i} </pozycja> 19 T.Traczyk: Język XML Query Funkcje agregujące • sum(), avg(), count(), max() i min() Przykład: • Zliczenie publikacji związanych z poszczególnymi instytucjami for $i in doc("instyt.xml")//instytucja let $p := doc("publik.xml")//publikacja[.//autor/@afiliacja = $i/@kod] return <instytucja> <nazwa>{$i/text()}</nazwa> <liczba>{count($p)}</liczba> </instytucja> 20 T.Traczyk: Język XML Query Modularyzacja Funkcje użytkownika Moduły • Możliwe jest – definiowanie funkcji użytkownika – wykorzystanie ich w zapytaniach • Nie można – przeciążać nazw funkcji użytkownika – definiować funkcji o zmiennej liczbie parametrów • W nowszych propozycjach standardu przewidziano mechanizmy modularyzacji kodu define function liczba-autorow($param) { count($param//autor) } for $p in doc("publik.xml")//publikacja let $c := liczba-autorow($p) return <pozycja autorow="{$c}"> {$p/tytul} </pozycja> 21 Typy • Typy predefiniowane XML Schema – sortowanie i porównywanie – operacje wymagające konwersji – zapytań – wykrywanie błędów w zapytaniach – biblioteczne • Prolog modułu • Typowanie w XQuery – w oparciu o schemat dokumentu • Moduły biblioteczne – zawierają deklarację module, definiującą m.in. nazwę modułu • Typy ze schematu powiązanego z danym dokumentem • Import schematów: import schema ♦ jawne deklaracje typu ♦ domyślne i jawne konwersje ♦ w ostateczności: przetwarzanie reprezentacji tekstowej 22 Typowanie c.d. • Typy predefiniowane XPath 2.0, np. xdt:untyped, xdt:untypedAtomic, xdt:anyAtomicType Deklaracje typów – gdy brak schematu – włączane do modułów zapytań deklaracją import module T.Traczyk: Język XML Query Typowanie dynamiczne Dostępne typy • Gdzie przydaje się typowanie • Kod może być podzielony na moduły – zawiera różne deklaracje Przykład: Typowanie • Jawne deklaracje typów – zmiennych – parametrów i wyników funkcji • Jawne określenie typu wyrażeń: treat as (statyczne, bez konwersji) T.Traczyk: Język XML Query XQuery a przestrzenie nazw Operacje na typach • Walidacja na podstawie schematu – wyrażenie validate ♦ • Konstrukcje XPath 2.0 pozwalające wyszukać elementy/atrybuty określonego typu, np. element(*, nazwa_typu) ♦ • Jawne konwersje typów: cast as działa na węźle sprawdza zgodność ze schematem ♦ przypisuje dynamicznie typy – tryby walidacji ♦ strict – elementy spoza schematu powodują błąd ♦ lax – elementy spoza schematu pozostają nieznanego typu • Sprawdzenia w czasie wykonania – wykonalności operacji – poprawności jawnych i domyślnych konwersji – zgodności typów z deklaracjami • Przetwarzanie XQuery wykorzystuje przestrzenie nazw • Predefiniowane przestrzenie i prefiksy: – xs – typy danych XML Schema – xdt – typy danych XPath 2.0 • Badanie czy element sekwencji jest danego typu: instance of • Przetwarzanie zależne od typu: typeswitch... case... default... • Wydobywanie wartości: – znakowej: fn:string() – daje konkatenację reprezentacji znakowych – typowanej: fn:data() – daje sekwencję wartości typowanych – fn – funkcje wbudowane – local – funkcje użytkownika zdefiniowane lokalnie w module zapytania • Deklaracje przestrzeni nazw – declare namespace – definiuje inne przestrzenie nazw (i prefiksy) – declare default element namespace – określa przestrzeń domyślną • W najnowszych wersjach propozycji standardu użycie przestrzeni nazw w definicjach funkcji użytkownika jest obowiązkowe Typowanie statyczne • Opcjonalne (Static Typing Feature) • Nie wszystkie problemy rozwiązano • Brak implementacji 23 T.Traczyk: Język XML Query 24 T.Traczyk: Język XML Query Konteksty użycia XQuery XQuery a Java Zapytania interaktywne • Mogą być składane za pomocą „konsol” XQuery Czym jest XML Query? • Służyć mogą do zapytań ad-hoc, nauki języka, Wprowadzenie do składni języka testowania zapytań itp. • W przyszłości dostępne zapewne przez Użycie XML Query serwisy WWW (server pages) • Niezbędna jest możliwość zanurzania języka zapytań w językach ogólnego przeznaczenia • Istniejące implementacje mają własne API • Dla języka Java opracowywany jest standard interfejsu programistycznego XQJ – zaangażowane Oracle, IBM, BEA, Sun, Sybase i in. Podsumowanie – „ideologia” zgodna z JDBC – „stylistyka” API zgodna z JDBC i JAXP – przewidziana jest obsługa transakcji – zapewniony ma być nawigacyjny mechanizm dostępu („kursory”) 25 T.Traczyk: Język XML Query 26 XQueryX Co to takiego? T.Traczyk: Język XML Query Implementacje XQuery XQuery w Oracle Najbardziej znane implementacje • Reprezentacja XQuery w składni XML • Nieczytelna dla człowieka, ale łatwa do przetwarzania za pomocą narzędzi XML-owych • Oracle XQuery Technology Preview • Saxon (open-source) – niepełna implementacja • Qizx/open (open-source) – uwzględnia bardzo starą wersja propozycji standardu (November 2002) • Qexo (GNU) Przykład: – zrealizowana w Javie for $t in doc("publik.xml")/publikacje/publikacja/tytul return $t <xq:query xmlns:xq="http://www.w3.org/2001/06/xqueryx"> <xq:flwr> <xq:forAssignment variable="$t"> <xq:step axis="CHILD"> <xq:function name="doc"> <xq:constant datatype="CHARSTRING">publik.xml</xq:constant> </xq:function> <xq:identifier>publikacje</xq:identifier> </xq:step> <xq:step axis="CHILD"> <xq:identifier>publikacja</xq:identifier> </xq:step> <xq:step axis="CHILD"> <xq:identifier>tytul</xq:identifier> </xq:step> </xq:forAssignment> <xq:return> <xq:variable>$t</xq:variable> </xq:return> </xq:flwr> </xq:query> 27 T.Traczyk: Język XML Query • Inne cechy BumbleBee – OJXQI – własne API do Javy • Testy implementacji XQuery ♦ • Rozbudowany zestaw zapytań testowych • Narzędzia automatyzujące testowanie XQuery uzupełniony o zmienne związane – dostęp do danych z bazy ♦ funkcja sqlquery jako źródło danych (wykorzystuje XSU z XDK) • Przydatność praktyczna: mierna 28 T.Traczyk: Język XML Query Podsumowanie Braki XQuery Czym jest XML Query? Wprowadzenie do składni języka • Brak integracji z bazami danych – jeśli źródłem danych jest baza danych, to zapytanie XQuery powinno korzystać z możliwości optymalizacji zapytań dostarczanych przez DBMS, np. ♦ przepisywanie zapytań (query rewrite) ♦ użycie indeksów ♦ wyszukiwanie pełnotekstowe – dostępne implementacje nie mają takich możliwości ♦ można co najwyżej jako źródło danych zastosować „ręcznie” przygotowane zapytanie SQL Użycie XML Query Podsumowanie 29 • Niestabilny standard – częste znaczne zmiany • Brak DML – nie ma instrukcji DML ani zarządzania transakcjami • Brak mechanizmu refleksji (np. funkcji typu eval()) T.Traczyk: Język XML Query 30 Podsumowanie T.Traczyk: Język XML Query Język XML Query Rozwój standardu XQuery • Wspierany przez wielkich producentów oprogramowania • Wymaga jeszcze sporo pracy Praktyczne znaczenie języka XQuery • Obecnie jeszcze niewielkie • Warunki wzrostu znaczenia – ustabilizowanie standardu – pojawienie się implementacji zintegrowanych z ♦ DBMS ♦ wyszukiwarkami internetowymi • Spodziewana rola XQuery – wygodny środek do jednolitego wyszukiwania informacji w ♦ Internecie ♦ bazach danych ♦ innych zasobach informacji – narzędzie do scalania i przekształcania informacji 31 T.Traczyk: Język XML Query Czym jest XML Query? Wprowadzenie do składni języka Użycie XML Query Podsumowanie 32 T.Traczyk: Język XML Query