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