530 likes | 685 Views
Język zapytań dla XML. Rafał Hryniów Tomasz Pieciukiewicz. Plan prezentacji. Wprowadzenie Przedstawienie podstawowych założeń języka Porównanie z innymi rozwiązaniami Omówienie implementacji Potencjalne kierunki rozwoju. Wprowadzenie. Co to jest XML? Do czego XML bywa używany?
E N D
Język zapytań dla XML Rafał Hryniów Tomasz Pieciukiewicz
Plan prezentacji • Wprowadzenie • Przedstawienie podstawowych założeń języka • Porównanie z innymi rozwiązaniami • Omówienie implementacji • Potencjalne kierunki rozwoju
Wprowadzenie • Co to jest XML? • Do czego XML bywa używany? • XML jako standard do przenoszenia danych • XML jako lekka baza danych • Czy da się to zrobić bez języka zapytań? • Dlaczego dla XML potrzebny jest nowy język zapytań? • Co ma na ten temat do powiedzenia W3C?
Obszary zastosowań języka zapytań wg W3C • Wykonywania zapytań na dokumentach XML oraz kolekcjach dokumentów takich jak np. instrukcje obsługi, w celu znalezienia dokumentu, lub fragmentu dokumentu. • Wykonywanie zapytań na dokumentach zawierających dane w celu przekształcenia ich do nowej postaci, lub zintegrowania danych z wielu źródeł. • Wykonywanie zapytań na dokumentach zawierających zarówno dane jak i opisy tekstowe, takich jak katalogi, dane chorobowe pacjenta itp. • Wykonywanie zapytań na danych administracyjnych (pliki konfiguracyjne, logi, profile użytkowników)
Obszary zastosowań języka zapytań wg W3C • Filtrowania danych napływających w formie dokumentów XML przysyłanych strumieniowo. • Wykonywanie zapytań na drzewach DOM • Wykonywanie zapytań na repozytoriach dokumentów w XML oraz serwerach WWW. • „Wykonywanie zapytań na katalogach zawierających serwery dokumentów, typy dokumentów, pliki XML Schema, lub dokumenty.
Wymagania W3C dla języków zapytań do XML • Języki zapytań zbudowane na podstawie dokumentu W3C mogą mieć różne syntaktyki, Język zapytań musi być wygodny i czytelny dla użytkownika i wyrażony w XML. • Język zapytań musi być deklaratywny, oraz nie może wymuszać konkretnej strategii ewaluacji • Język musi być niezależny od protokołu komunikacyjnego. • Język zapytań musi określać standardowe błędy mogące powstać podczas ewaluacji zapytania. • Język zapytań dla XML nie może ograniczać możliwości rozbudowy samego standardu XML. • „Język zapytań dla XML musi być zdefiniowany dla skończonych instancji modelu danych. Może być zdefiniowany dla nieskończonych instancji.”
Wymagania W3C dla modelu danych • Model danych dla zapytań musi opierać się na informacjach otrzymanych od procesorów XML oraz XML Schema i nie może wymagać informacji nie dostarczanych przez te procesory. Model danych musi pokazywać odwzorowanie konstrukcji XML w odpowiednie konstrukcje modelu danych. Model danych powinien mieć reprezentację dla wszystkich elementów niosących informację lub zawierać wyjaśnienie, dlaczego konkretna konstrukcja została pominięta. Model musi być opracowany we współpracy z XML Schema Working Group w celu zapewnienia zgodności między modelem danych a danymi dostarczonymi przez procesory XML Schema. • Model danych musi reprezentować zarówno prosty typ znakowy jak i typy proste i złożone zdefiniowane w XML Schema
Wymagania W3C dla modelu danych • Model danych musi umożliwiać reprezentację kolekcji dokumentów i kolekcji wartości prostych i złożonych. • Model danych musi zawierać wsparcie dla referencji, włączając referencje wewnętrzne oraz do zewnętrznych dokumentów XML. • Model danych musi uwzględniać elementy wprowadzane do dokumentu XML przez XML Schema, takie jak np. wartości domyślne. • Model danych musi uwzględniać przestrzenie nazw.
Funkcjonalność wymagana przez W3C • Język zapytań musi wspierać operację na wszystkich typach danych reprezentowanych w modelu danych. • Zapytania muszą umożliwiać wyrażanie prostych warunków na tekst, włączając warunki na tekst przekraczający granice elementu. • Język zapytań musi wspierać kwantyfikatory ogólne i egzystencjalne. • Język zapytań musi wspierać operacje na hierarchii i sekwencji struktur dokumentu. • Język musi być zdolny do łączenia informacji z wielu części dokumentu, lub wielu dokumentów. • Język zapytań musi zawierać operacje agregujące. • Język zapytań musi zawierać operacje sortujące.
Funkcjonalność wymagana przez W3C • Język zapytań musi umożliwiać zagnieżdżanie zapytań. • Język zapytań musi wspierać wartości NULL. • Język zapytań musi przenosić hierarchię i kolejność elementów z dokumentu źródłowego do dokumentu stanowiącego wynik zapytania. • Język zapytań musi umożliwiać transformację struktury XML i tworzenie nowych struktur. • Język zapytań musi umożliwiać przechodzenie po referencjach zarówno wewnątrz jak i na zewnątrz dokumentu. • Język zapytań musi zachowywać tożsamość elementów. • Język zapytań musi umożliwiać operację na literałach (dowolne dane zdefiniowane wewnątrz zapytania).
Funkcjonalność wymagana przez W3C • Język zapytań musi umożliwiać wykonywanie prostych operacji na nazwach, takich jak porównywanie nazw elementów, atrybutów, instrukcji przetwarzania. Musi pozwalać także na operacje na kombinacji nazw i danych. Zapytania mogą wykonywać bardziej złożone operacja na nazwach. • Język zapytań powinien umożliwiać dostęp do XML Schema lub DTD dla danego dokumentu. Jeżeli schemat jest reprezentowany w postaci DTD, mapowanie do XML Schema może być wymagane. • Język zapytań musi operować na informacjach post-walidacyjnych otrzymanych od procesora XML Schema.
Funkcjonalność wymagana przez W3C • Język zapytań powinien wspierać wykorzystanie zewnętrznie zdefiniowanych funkcji na wszystkich typach danych istniejących w modelu danych. Powinien definiować interfejs dla takich funkcji oraz powinien rozróżniać takie funkcje od funkcji zdefiniowanych w języku zapytań. Implementacja funkcji zewnętrznych nie jest częścią języka zapytań. • Język zapytań musi udostępniać informacje środowiskowe, właściwe dla środowiska, w którym zapytanie jest wykonywane.
Funkcjonalność wymagana przez W3C • Zapytanie muszą być domknięte względem modelu danych dla zapytań XML. Zarówno wejście jak i wyjście zapytania muszą być zdefiniowane wyłącznie przy pomocy modelu danych dla zapytań XML. Źródła nie będące dokumentami XML mogą być odpytywane tylko i wyłącznie w przypadku, gdy zostanie dla nich zdefiniowana reprezentacja w modelu danych. Podobnie wyniki zapytań zdefiniowane są wyłącznie przy pomocy modelu danych dla zapytań XML. W oprogramowaniu wyniki te mogą być utworzone przy pomocy dowolnej, wygodnej reprezentacji, takiej jak: DOM, węzły, hiperlinki, tekst XML, lub różne inne formaty danych.”
Istniejące języki zapytań dla XML – co jest nie tak? • Oparte (z jednym wyjątkiem) na XML Query Requirements, • Semantyka tych języków nie jest absolutnie określona (definicja „by example”), • Składnia jest mało wygodna i trudna do przyswojenia
Nasze rozwiązanie Czyli jak można zrobić to lepiej
Założenia języka • Naturalny dla użytkownika, • Prosty w użyciu, • Oparty na solidnych podstawach teoretycznych (podejście stosowe), • Duże możliwości rozwoju, • Obsługa danych półstrukturalnych (XML) • Ortogonalność zapytań
Przydatna definicja • Ortogonalność: każda kombinacja cech języka, która ma sens, powinna być dozwolona. • Ortogonalność pozwala na zredukowanie do minimum definicji języka oraz znaczne podwyższenie jego mocy. Ma ona ogromne znaczenie dla przypadku, gdy wyrażenia języka nie są pisane przez ludzi, a są automatycznie generowane z innych interfejsów.
Podejście stosowe – o co w tym chodzi? • Idea znana z języków programowania takich jak Pascal i C • Środowisko, w jakim działają zapytania znajduje się na tzw. stosie środowiskowym (w językach programowania zwykle nazywanym call stack). • Stos ten może być podnoszony/opuszczany w wyniku niektórych operacji (np. wołania funkcji lub tzw. operatorów nie-algebraicznych), tworzone są w ten sposób środowiska lokalne • Środowisko lokalne (segment na szczycie stosu środowiskowego) ma priorytet względem środowiska globalnego.
Podejście stosowe – o co w tym chodzi? • Na stosie środowisk znajdują się tzw. bindery • Binder jest parą <n, x>, gdzie n jest zewnętrzną nazwą (nazwą zmiennej, stałej, obiektu, funkcji, perspektywy, procedury, metody, itd.), zaś x jest bytem czasu wykonania (zwykle referencją do obiektu) • Operatory nie-algebraiczne • Operatory nie dające sprowadzić się w prosty sposób do algebry • Where – operator selekcji • „.” – operator kropki jest to operator projekcji, nawigacji • Operator zależnego złączenia • Operator sortowania • Kwantyfikatory
Podejście stosowe – o co w tym chodzi? • Stos wyników • Stos, na którym przechowywane są wyniki zapytań • Wyniki zapytań mogą być „konsumowane” przez operatory • Zasady kompozycji zapytań • Każde wyrażenie jest zapytaniem • Zapytania można dowolnie kombinować przy użyciu operatorów, kombinacja zapytanie operator zapytanie też jest zapytaniem • Zapytanie interpretowane jest tak, jak wyrażenie algebraiczne, z zachowaniem reguł dotyczących priorytetów operatorów i nawiasowania
Rezultat zwracany przez zapytanie Prac (wiązanie Prac) Iteracja po elementach e poprzedniego rezultatu: na ENVS wkłada się nested(e) Rezultat zwracany przez zapytanie Zar (wiązanie Zar) Rezultat dereferencji wymuszanej przez operator > Rezultat zwracany przez zapytanie 1000 Rezultat zwracany przez zapytanie Zar>1000 Końcowy rezultat zapytania i1 i5 i9 i1 i5 1000 prawda i3 2500 prawda i7 2000 1000 Stan stosu ENVS przed ewaluacją i11 900 1000 fałsz Prac(i1) Prac(i5) Prac(i9) Dział(i17) Dział(i22) Nazwisko(i2) Zar(i3) PracujeW(i4) Nazwisko(i6) Zar(i7) PracujeW(i8) Nazwisko(i10) Zar(i11) Adres(i12) PracujeW(i16) Pracwhere ( Zar > 1000 ) Prac(i1) Prac(i5) Prac(i9) Dział(i17) Dział(i22) Prac(i1) Prac(i5) Prac(i9) Dział(i17) Dział(i22) Prac(i1) Prac(i5) Prac(i9) Dział(i17) Dział(i22)
Porównanie z istniejącymi językami zapytań Porównanie zostanie przeprowadzone przy pomocy przykładów.
Porównanie (1) – zapytanie w XML Query • Tytuły i rok wydania książek opublikowanych przez „Addison-Wesley” wydanych po roku 1991 <bib> { for $b in document("http://www.bn.com")/bib/book where $b/publisher = "Addison-Wesley" and $b/@year > 1991 return <book year="{ $b/@year }"> { $b/title } </book> } </bib>
Porównanie (1) – zapytanie w YATL make bib [ *book [ @year [ $y ], title [ $t ] ] ] match "www.bn.com/bib.xml" with bib [ *book [ @year [ $y ], title [ $t ] ], publisher [ name [ $n ] ] ] where $n = "Addison-Wesley" and $y > 1991
Porównanie (1) – Zapytanie w Lorel select xml(bib:{ (select xml(book:{@year:y, title:t}) from bib.book b, b.title t, b.year y where b.publisher = "Addison-Wesley" and y > 1991)})
Porównanie (1) – Zapytanie w XQL document("http://www.bn.com")/bib { book[publisher/name="Addison-Wesley" and @year>1991] { @year | title } }
Porównanie (1) – Zapytanie w XML-QL CONSTRUCT <bib> { WHERE <bib> <book year=$y> <title>$t</title> <publisher><name>Addison-Wesley</name></publisher> </book> </bib> IN "www.bn.com/bib.xml", $y > 1991 CONSTRUCT <book year=$y><title>$t</title></book> } </bib>
Porównanie (1) – zapytanie u nas • Wersja skrócona (bib.book where (year>1991 AND publisher.TextValue='Addison-Wesley')).(year , title) • Wersja dająca prawie identyczny wynik jak XML Query(bib.book where (year>1991 AND publisher.TextValue='Addison-Wesley')).(year as Year, title) as Book
Porównanie (2) – zapytanie w XML Query • Lista par autor-tytuł, każda para zamknięta w elemencie „result” <results> { for $b in document("http://www.bn.com")/bib/book, $t in $b/title, $a in $b/author return <result> { $t } { $a } </result> } </results>
Porównanie (2) – zapytanie w YATL make results [ *result [ title [ $t ] author [ $a ] ] ] match "www.bn.com/bib.xml" with bib [ *book [ title [ $t ], *author [ $a ] ] ]
Porównanie (2) – zapytanie w Lorel select xml(results:{ (select xml(result:{title: t,author: a}) from bib.book b, b.title t, b.author a)})
Porównanie (2) – zapytanie w XQL • Zadanie tego zapytania nie jest możliwe
Porównanie (2) – zapytanie w XML-QL CONSTRUCT <results> { WHERE <bib> <book> <title>$t</title> <author>$a</author> </book> </bib> IN "www.bn.com/bib.xml" CONSTRUCT <result> <title>$t</title> <author>$a</author> </result> } </results>
Porównanie (2) – zapytanie u nas bib.book.(author, title) as Result
Porównanie (3) – zapytanie w XML Query • Dla każdej książki wyświetla tytuł i listę autorów <results> { for $b in document("http://www.bn.com")/bib/book return <result> { $b/title } { $b/author } </result> } </results>
Porównanie (3) – zapytanie w YATL make results [ *result [ title [ $t ], $as ] ] match "www.bn.com/bib.xml" with bib [ *book [ title [ $t ], *($as) author ]
Porównanie (3) – zapytanie w Lorel select xml(results:{ select xml(result{b.title, b.author}) from bib.book b})
Porównanie (3) – zapytanie w XQL document("http://www.bn.com")/bib->results { book->result { title | author } }
Porównanie (3) – zapytanie w XML-QL CONSTRUCT <results> { WHERE <bib> <book> <title>$t</title> </book> CONTENT_AS $b </bib> IN "www.bn.com/bib.xml" CONSTRUCT <result> <title>$t</title> { WHERE <author>$a</author> IN $b CONSTRUCT <author>$a</> } </result> } </results>
Porównanie (3) – zapytanie u nas • (bib.book as x, bib.book as y where x=y).(x.title, y.author group as autorzy) • Ze względu na brak operatora pozwalającego stworzyć strukturę bez opakowanie jej w węzeł wynik różni się nieco od wyniku XML Query. Oczywiście operator ten można doimplementować.
Obsługa linków - przykład <bib> <person id="A1"><last>Stevens</last><first>W.</first></person> <person id="A2"><last>Abiteboul</last><first>Serge</first></person> <person id="A3"><last>Buneman</last><first>Peter</first></person> <person id="A4"><last>Suciu</last><first>Dan</first></person> <book year="1994"> <title>TCP/IP Illustrated</title> <author pointer="true">A1</author> <publisher>Addison-Wesley</publisher> <price> 65.95</price> </book> <book year="2000"> <title>Data on the Web</title> <author pointer="true">A2</author> <author pointer="true">A3</author> <author pointer="true">A4</author> <publisher>Morgan Kaufmann Publishers</publisher> <price>39.95</price> </book> </bib>
Obsługa linków - przykład • bib.book.(author.person, title) as Result • Uzyskujemy wynik postaci<Result><author pointer="true">A1</author><title>TCP/IP Illustrated</title></Result> • bib.book.(author.person, title) as Result • Uzyskujemy wynik postaci<Result><person id="A1"><last>Stevens</last><first>W.</first></person><title>TCP/IP Illustrated</title></Result>
Implementacja Co i jak
Cechy obecnej implementacji języka • Jednoczesna obsługa wielu plików XML, • Obsługa linków • Operatory algebraiczne: • Arytmetyczne • Logiczne • Porównania • Operacje na łańcuchach tekstowych • Operacje na kolekcjach • Złączenia • Operator zmiany nazwy
Cechy obecnej implementacji języka • Operatory nie-algebraiczne • Kwantyfikatory • Selekcja • Zależne złączenie • Rozróżnianie pomiędzy węzłem XML, a tekstem zawartym w tym węźle (atrybut o nazwie TextValue) • Brak operatorów imperatywnych – programista może dokonywać operacji zmieniających stan składu poprzez interfejs DOM, korzystając z referencji do węzłów XML uzyskanych poprzez zapytania.
Implementacja - narzędzia • Java SE 1.4, • Xerces 1.4.3, • JFlex, • CUP.
Implementacja - decyzje • Wykorzystanie drzewa DOM jako składu obiektów, • Przechowywanie całości danych w pamięci, • Wyniki udostępniane użytkownikowi w formie referencji do węzła XML (ResultNode),
Implementacja - problemy • Użycie drzewa DOM jako składu spowodowało problemy implementacyjne, • Wartości tekstowe w DOM • Brak typów danych w XML
Kierunki rozwoju • Uzupełnienie systemu o perspektywy, • Wykorzystanie DTD lub XML Schema, • Wprowadzenie cech obiektowych, • Optymalizacja zapytań, • Zmiana modelu składu, • Indeksowanie itp., • …