XML - Technologie Przetwarzania Danych

Transkrypt

XML - Technologie Przetwarzania Danych
Bazy
dokumentów XML
Język XML
eXtensible Markup Language
Klasy strukturalizacji danych
• Dane niestrukturalne – sposób składowania danych nie
zawiera informacji o ich wewnętrznej logicznej strukturze,
dane zawierają zrozumiałe przez użytkowników jednostki
semantyczne, niewyspecyfikowane jako odrębne jednostki
leksykalne.
• Dane strukturalne – sposób składowania danych zawiera
pełną informację o ich logicznej strukturze; każdej jednostce
semantycznej odpowiada jedna jednostka leksykalna;
przykładem są schematy relacji w relacyjnych bazach danych
w 1NF.
• Dane semistrukturalne – specyfikacja struktur danych zawiera
informacje o ich logicznej strukturze, jednak fragmenty
danych pozostają niestrukturalne.
Dane niestrukturalne - przykłady
• Brak specyfikacji wewnętrznej struktury danych
"Jan Kowalski, prog. BD, 27 lat, kawaler, tel. 123 456 789"
"Burza
Zdarto żagle, ster prysnął, ryk wód, szum zawiei,
Głosy trwożnej gromady, pomp złowieszcze jęki,
Ostatnie liny majtkom wyrwały się z ręki,
Słońce krwawo zachodzi, z nim reszta nadziei."
<!DOCTYPE html>
<html>
Korea Północna zrywa wszystkie układy o nieagresji z <br />
Koreą Południową, wyłącza "gorącą linię" telefoniczną i zamyka <br />
przejście w Panmundżonie między obu krajami w strefie <br />
zdemilitaryzowanej. Jak poważne jest zagrożenie i dla kogo?
</html>
Dane strukturalne - przykłady
• Kompletna specyfikacja wewnętrznych struktur danych, która
obejmuje: konstruktory typów, typy danych i więzy
integralności.
idPrac Imię
Nazwisko
Etat
Płaca
Premia
Zespół
100
Jan
Tarzan
Prezes
25 000 zł
15 000 zł
Zarząd
110
Joanna
Jane
Sekretarka
2500 zł
250 zł
Zarząd
120
Henryk
Nowak
Kierownik
5600 zł
1000 zł
Ochrona
Dane semistrukturalne - przykład
• Specyfikacja struktury danych nie jest kompletna; pewne
elementy danych nie są wyspecyfikowane.
<antologia>
<sonet><tytuł>Burza</tytuł>
<strofa>
<wiersz> Zdarto żagle, ster prysnął, ryk wód, szum zawiei, </wiersz>
<wiersz> Głosy trwożnej gromady, pomp złowieszcze jęki, </wiersz>
<wiersz> Ostatnie liny majtkom wyrwały się z ręki, </wiersz>
<wiersz> Słońce krwawo zachodzi, z nim reszta nadziei. </wiersz>
</strofa>
</sonet>
</antologia>
Języki znaczników
Języki służące do definiowania struktury danych w postaci
tekstowej. Znaczenie wybranych fragmentów dokumentów
tekstowych jest określone przez objęcie tych fragmentów
elementami leksykalnymi nazywanymi znacznikami.
•
•
•
•
•
GenCode
Tex
GML, SGML
HTML
XML
Język znaczników HTML
Zbiór predefiniowanych znaczników określających strukturę i
formaty tekstu, np. paragrafy, nagłówki, złamanie linii, typ i
rozmiar czcionki, hyperlinki, itp. :
<!DOCTYPE html>
<html>
<body>
<h1><b> Burza </b></h1>
<p>Zdarto żagle, ster prysnął, ryk wód, szum zawiei, <br />
Głosy trwożnej gromady, pomp złowieszcze jęki, <br />
Ostatnie liny majtkom wyrwały się z ręki, <br />
Słońce krwawo zachodzi, z nim reszta nadziei. <br /></p>
</html>
Język XML
• Rozszerzalny język znaczników XML (Extensible Markup
Language) – uniwersalny język znaczników przeznaczony do
reprezentowania danych w sposób strukturalny.
• W przeciwieństwie do języka HTML nie ma żadnych
predefiniowanych znaczników, jest otwarty na definiowanie
przez użytkowników dowolnych własnych znaczników.
• Tylko metodyczną sugestią jest, żeby nie definiować
znaczników odkreślających elementy prezentacji danych.
• Język XML, tak jak HTML jest interpretowalny zarówno przez
użytkowników, jak i przez komputery.
• Język XML pojawił się jako propozycja modelu danych
pośredniczącego między innymi modelami danych.
Struktury danych XML
• Dokument XML jest dokumentem tekstowym. Elementy
składające się na dokument XML dzielą się na znaczniki i
zawartość. Tekst, który nie tworzy znaczników jest zawartością.
• Wyróżnia się trzy rodzaje znaczników:
– znacznik początkowy, np.: <paragraf>
– znacznik końcowy, np.: </paragraf>
– znacznik pusty, np.: <nowa linia/>
• Para znaczników początkowego i odpowiadającego mu
znacznika końcowego oraz wypełniająca je treść (albo znacznik
pusty) tworzą element dokumentu XML.
Na przykład: <Tytuł>To jest tytuł</Tytuł>
Struktury danych XML
• Definicja znaczników może obejmować definicję jednego lub
większej liczby atrybutów elementu. Na przykład:
<Krok numer="1" ważność="duża">
Włącz komputer
</Krok>
• Zawartość elementów może być złożona, przez zagnieżdżenie w
niej innych elementów. Na przykład:
<Krok numer="1" ważność="duża">
Włącz komputer
<Krok_składowy numer="1.1">
Podłącz komputer do prądu
</Krok_składowy>
</Krok>
Przykład XML – dane strukturalne
<Student>
<Indeks>11111</Indeks>
<Nazwisko>Tarzan</Nazwisko>
<Płeć>M</Płeć>
<Średnia_ocen>3.12</Średnia_ocen>
<Adres>
<Kod_pocztowy>60123</Kod_pocztowy>
<Miasto>Poznań</Miasto>
<Ulica>Browarna</Ulica>
<Numer_domu>13</Numer_domu>
</Adres>
</Student>
Przykład XML – dane semistrukturalne
<News>
Wczoraj <data> 21 stycznia 2013 r. </data> w <gdzie> Poznaniu
</gdzie> na <uczelnia> Politechnice Poznańskiej </uczelnia> miał
miejsce niezwykły wypadek. Studenci Studium Podyplomowego z
Systemów Baz Danych z entuzjazmem uczestniczyli w wykładzie z
<przedmiot> Zaawansowanych Baz Danych </przedmiot> . …
</News>
Specyfika modelu danych XML,
w opozycji do modelu relacyjnego
• Otwarta fizyczna reprezentacja danych, brak typów danych –
tylko tekst. Celem jest czytelność danych i niezależność od
sformatowanych źródeł danych, efektem ubocznym mniejsza
odporność na błędy i mniejsza wydajność.
• Brak wymagań co do wspólnej struktury danych w jednym
dokumencie XML. Można (DTD), ale nie trzeba definiować
wspólnej struktury danych dla podobnych elementów
dokumentów XML. Utrudnia to semantyczną interpretacje
zawartości i obniża odporność na błędy, ale za to zwiększa
elastyczność.
• Otwartość na dane niestrukturalne i semistrukturalne
• Brak determinizmu zapytań dla danych niestrukturalnych
DTD – opis struktury dokumentów XML
Struktura dokumentów XML może być wyspecyfikowana w
odrębnym dokumencie DTD. Na przykład:
<!DOCTYPE osoba [
<!ELEMENT osoba (imie, drugieImie, nazwisko)>
<!ELEMENT imie (#PCDATA)>
<!ELEMENT drugieImie (#PCDATA)>
<!ELEMENT nazwisko (#PCDATA)>
]>
Można narzucić dokumentom XML zgodność ze zdefiniowaną
strukturą, dla poprawnego przetwarzania kolekcji dokumentów:
<osoba>
<imie>Jan</imie>
<drugieImie>Mateusz</drugieImie>
<nazwisko>Nowak</nazwisko>
</osoba>
Typy dokumentów a typy baz danych
• Bazy danych pozwalające na przechowywanie
dokumentów XML (ang. XML-enabled database
systems)
Niezorientowane na przetwarzanie dokumentów XML.
Z reguły pozwalają na przechowywanie określonego
typu dokumentów XML
– Plikowe i tekstowe bazy danych
– Obiektowe i relacyjne bazy danych
• Bazy danych dokumentów XML (ang. native XML
database systems)
Zorientowane na przetwarzanie dokumentów XML
Przechowywanie dokumentów XML
(1/3)
• Przechowywanie dokumentów XML
– w systemie plików
– w bazach danych w strukturach typu CLOB lub
BLOB
– w bazach danych w postaci zdekomponowanej
• Mapowanie schematów XML na schematy baz danych
• Generacja schematów XML ze schematów baz danych i
odwrotnie
• Przechowywanie dokumentów w bazach
danych dokumentów XML
Przechowywanie dokumentów XML
(2/3)
– w bazach danych w postaci zdekomponowanej
• Mapowanie schematów XML na schematy baz danych
• Generacja schematów XML ze schematów baz danych
<ROW>
<EMPNO>7369</EMPNO>
<ENAME>SMITH</ENAME>
<JOB>CLERK</JOB>
<MGR>7902</MGR>
<HIREDATE>17.12.1980</HIREDATE>
<SAL>800</SAL>
<DEPTNO>10</DEPTNO>
</ROW>
EMPNO
ENAME
JOB
MGR
HIREDATE
SAL
7369
SMITH
CLERK
7902
17.12.1980 800
COMM
DEPTNO
20
Przechowywanie dokumentów XML
(3/3)
• Przechowywanie dokumentów XML
– w systemie plików
– w bazach danych w strukturach typu CLOB lub
BLOB
– w bazach danych w postaci zdekomponowanej
• Mapowanie schematów XML na schematy baz danych
• Generacja schematów XML ze schematów baz danych i
odwrotnie
• Przechowywanie dokumentów w bazach
danych dokumentów XML
Języki zapytań (1/5)
• Języki zapytań w obiektowo-relacyjnych
bazach danych
– oparte na konwersji zgodnej z przyjętym
mapowaniem
– oparte na szablonach XML
– oparte na funkcjach SQL
Ich podstawowym zadaniem jest
konstruowanie dokumentów XML w oparciu o
zawartość bazy danych
Języki zapytań (2/5)
przykład zapytania opartego o szablon
SELECT XMLGen (
'<PRACOWNIK id="{$ID_PRAC}">
<NAZWISKO>{$NAZWISKO}</NAZWISKO>
<ZAROBKI>
<PODSTAWA>{$PLACA_POD}</PODSTAWA>
<DODATEK>{$PLACA_DOD}</DODATEK>
</ZAROBKI>
</PRACOWNIK>',
p.ID_PRAC, p.NAZWISKO, p.PLACA_POD, p.PLACA_DOD) AS
"wynik"
FROM pracownicy p
Języki zapytań (3/5)
przykład dokumentu pełniącego rolę szablonu
<?xml version="1.0"?>
<EmpInfo>
<Emps>
<Query><SelectStmt>
SELECT ENAME, SAL FROM EMP</SelectStmt>
<Emp>
<Nr>$ENAME</Nr>
<Name>$SAL</Name>
</Emp>
</Query>
</Emps>
</EmpInfo>
Języki zapytań (4/5)
przykład zapytania opartego o funkcje SQL
SELECT XMLElement (
"PRACOWNIK",
XMLAttributes(id_prac as "id"),
XMLForest(
nazwisko as "NAZWISKO",
XMLForest(
placa_pod as "PODSTAWA",
placa_dod as "DODATEK")
as "ZAROBKI"
)) AS "wynik"
wynik
FROM pracownicy
--------------------------------<PRACOWNIK id="100">
<NAZWISKO>WEGLARZ</NAZWISKO>
<ZAROBKI>
<PODSTAWA>1730</PODSTAWA>
<DODATEK>420.5</DODATEK>
</ZAROBKI>
</PRACOWNIK>
. . .
Języki zapytań (5/5)
• Języki zapytań w bazach danych dokumentów
XML
Są to języki zorientowane na przetwarzanie
dokumentów XML. Działają na zbiorach
dokumentów XML i konstruują dokumenty
XML
Definicja bazy danych dokumentów XML
(ang. native XML database system)
• Baza danych dokumentów XML
– Definiuje model dla dokumentów XML-owych
– Dokumenty XML są jej podstawową jednostką
składowania
– Wykorzystuje dowolny sposób fizycznego
składowania
Funkcjonalność bazy danych dokumentów XML
• Składowanie dokumentów XML
• Definiowanie i przechowywanie schematów (DTD,
XML Schema)
• Obsługa zapytań (XPath, XQuery, XML-QL, Quilt)
• Obsługa modyfikacji, wstawiania i usuwania
dokumentów
• Obsługa interfejsów programistycznych (XML:DB
API, XQuery API for Java – XQJ, SAX, DOM, JDOM)
• Funkcjonalność tradycyjnych SZBD
Składowanie dokumentów XML
w bazach danych dokumentów XML (1/2)
• Architektura baz danych dokumentów XML
ściśle zależy od modelu bazy danych
– oparte na obiektach tekstowych
– oparte na strukturach (relacyjnych, obiektowych,
oryginalnych)
Kolekcje dokumentów
w bazach danych dokumentów XML
• Bazy danych dokumentów XML, z punktu widzenia użytkownika,
przechowują dokumenty zebrane w postaci tzw. kolekcji
• Kolekcje dokumentów
– zawierają podobne lub powiązane ze sobą dokumenty
– podobne są do katalogów w systemie plików
• dokumenty mogą mieć dowolny schemat
• mogą być zagnieżdżone
– lub, podobne są do tabel w systemie relacyjnym
• dokumenty muszą spełniać reguły określonego schematu
• umożliwiają zaawansowane indeksowanie i optymalizację zapytań
Schematy i indeksy
w bazach danych dokumentów XML
• W bazach danych dokumentów XML oprócz samych dokumentów
składowane są także:
– schematy dokumentów XML
– indeksy
• Typy indeksów
– strukturalne – indeksowanie nazw elementów i atrybutów
– oparte na wartościach – indeksowanie wartości elementów i
atrybutów
– indeksy pełnotekstowe – indeksowanie leksemów występujących w
wartościach elementów i atrybutów
Charakterystyka indeksów
w bazach danych dokumentów XML
• Indeksy strukturalne
– zawierają informacje o wszystkich ścieżkach, które występują w
dowolnej instancji dokumentów XML
– wspomaga przeszukiwanie dokumentów bez określonego schematu
– może być wykorzystywany do walidacji zmian bez dostępu do
schematu dokumentu
• Indeksy oparte na wartościach
– wspomagają wyszukiwanie elementów (atrybutów) posiadających
określone wartości
– uwzględniają typy wartości
• Indeksy tekstowe
– warunkują efektywne wyszukiwanie wartości tekstowych
– indeksowane są słowa występujące w elementach lub atrybutach
Języki zapytań
w bazach danych dokumentów XML
• Oryginalne
• XPath – powszechnie wykorzystywany
• XQuery – obecny standard języka zapytań dla
baz danych dokumentów XML
Sposoby modyfikacji
w bazach danych dokumentów XML
• Większość baz danych umożliwia tylko usuwanie i
wstawianie kompletnych dokumentów XML
• Modyfikacja zawartości jest możliwa za pomocą:
– operacji DOM
– wyrażeń XPath, które wskazują węzły, na których można
przeprowadzić operację:
• wstawienie węzła przed lub po
• modyfikacja węzła
• usunięcie węzła
– rozszerzeń języka XQuery
Przykład polecenia modyfikacji
zdefiniowanego za pomocą wyrażeń XPath
<xupdate:append select="/bib" child="last()">
<xupdate:element name="book">
<title>System zarzadzania bazą danych Oracle 7</title>
</xupdate:element>
</xupdate:append>
Interfejsy programistyczne
w bazach danych dokumentów XML
• Zazwyczaj podobne do ODBC
– Języki zapytań oddzielone są od API
– Podstawowe polecenia: connect, execute query, get
results, commit/rollback
– Rezultat zapytań w postaci: ciągu znaków, drzewa
DOM, zdarzeń SAX.
• Zazwyczaj dostępne przez HTTP
• Wiele baz danych wykorzystuje swoje oryginalne
API
• XML:DB API i XQuery API for Java (XQJ) to
rozwiązania niezależne od bazy danych
Cechy języka XQuery
• Język deklaratywny – podobnie jak SQL
• Wykorzystuje wyrażenia ścieżkowe XPath 2.0
• Operuje na pojedynczych dokumentach lub
ich kolekcjach
• Konstruuje dokumenty XML lub ich fragmenty
• Oparty na wyrażeniach FLWOR, składających
się z pięciu klauzul: FOR, LET, WHERE, ORDER
BY, RETURN
XQuery "w całości" (1/2)
for $d in doc("zespoly.xml")//id_zesp
let $e := doc("pracownicy.xml")//pracownik[id_zesp = $d]
where count($e) >= 5
order by avg($e/placa_pod) descending
return
<duzy-zespol>
{
$d,
<liczba-pracownikow>{count($e)}</liczba-pracownikow>,
<srednia-placa>{avg($e/placa_pod)}</srednia-placa> }
</duzy-zespol>
XQuery "w całości" (2/2)
<duzy-zespol>
<id_zesp>20</id_zesp>
<liczba-pracownikow>7</liczba-pracownikow>
<srednia-placa>690,59</srednia-placa>
</duzy-zespol>
pracownicy.xml:
<?xml version="1.0"?>
<rowset>
<pracownik>
<id_prac>130</id_prac>
<nazwisko>brzezinski</nazwisko>
<etat>profesor</etat>
<id_szefa>100</id_szefa>
<placa_pod>1075.2</placa_pod>
<placa_dod>611.16</placa_dod>
<id_zesp>20</id_zesp>
</pracownik>
. . .
zespoly.xml:
<?xml version="1.0"?>
<rowset>
<zespol>
<id_zesp>10</id_zesp>
<nazwa>administracja</nazwa>
</zespol>
<zespol>
<id_zesp>20</id_zesp>
<nazwa>syst.rozpr.</nazwa>
<adres>piotrowo 3a</adres>
</zespol>
. . .
Klauzule FOR i LET
• Klauzule FOR i LET wykorzystywane są do
tworzenia strumienia krotek. Każda krotka
składa się z jednej lub wielu zmiennych.
for $s in (<one/>, <two/>, <three/>)
for $d in document("zespoly.xml")//id_zesp
Klauzula FOR
• Klauzula FOR może zawierać wiele zmiennych
• Klauzula FOR iteruje po każdej wartości uzyskanej w wyniku ewaluacji
wyrażenia przypisanego do zmiennej.
• Użycie wielu zmiennych w w klauzuli FOR powoduje, że dla każdej wartości
zmiennej nadrzędnej wykonywana jest iteracja za pomocą zmiennej
podrzędnej.
• Wynikowa kolejność krotek tworzonych za
pomocą klauzuli FOR jest znacząca
for $i in (1, 2), $j in (3, 4)
($i
($i
($i
($i
=
=
=
=
1,
1,
2,
2,
$j
$j
$j
$j
=
=
=
=
3)
4)
3)
4)
for $z in document("zespoly.xml")//id_zesp,
$p in document("pracownicy.xml")//pracownicy[id_zesp = $z]
Klauzula LET
• Klauzula LET może zawierać jedną lub wiele zmiennych.
• Wiązanie zmiennych odbywa się bez iteracji.
• Wartością zmiennej użytej w klauzuli LET są wszystkie węzły (las węzłów)
wskazywane przez wyrażenie przypisane do zmiennej
• Zmienne z klauzuli LET są dodawane do krotek wygenerowanych przez
klauzulę FOR.
• Jeśli klauzuli FOR nie ma, wówczas LET generuje tylko jedną krotkę
let $i := (1, 2), $j := (3, 4)
return <wynik>i={$i}, j={$j} </wynik>
<wynik>i=1 2, j=3 4</wynik>
for $e in distinct-values(doc('pracownicy.xml')//etat/text())
let $l := doc('pracownicy.xml')//pracownik[etat = $e]
return <etat nazwa="{$e}">{count($l)}</etat>
<etat nazwa="adiunkt">2</etat>
<etat nazwa="asystent">3</etat>
FOR vs LET
• Mimo iż obie klauzule FOR i LET służą do
wiązania zmiennych, sposób w jaki to robią
jest zupełnie różny.
for $s in (<one/>, <two/>, <three/>)
return <out>{$s}</out>
<out><one/> </out>
<out><two/> </out>
<out><three/> </out>
let $s := (<one/>, <two/>, <three/>)
return <out>{$s}</out>
<out><one/><two/><three/></out>
Klauzula FOR i zmienne pozycji
• Zmienna pozycji (positional variable) może
wystąpić w klauzuli FOR i musi być poprzedzona
słowem kluczowym AT.
• Kolejne iteracje przypisują zmiennym pozycji
kolejne numery porządkowe.
• Wartości zmiennych pozycji rozpoczynają się od 1,
a ich typem jest xs:integer
for $car at $i in ("Ford", "Chevy"),
$pet at $j in ("Cat", "Dog")
return <wynik>{$car} at {$i}, {$pet} at {$j} </wynik>
<wynik>Ford at 1, Cat at 1</wynik>
<wynik>Ford at 1, Dog at 2</wynik>
<wynik>Chevy at 2, Cat at 1</wynik>
<wynik>Chevy at 2, Dog at 2</wynik>
Klauzula WHERE
• Opcjonalna klauzula WHERE służy do filtrowania krotek
• Wyrażenie zdefiniowane w klauzuli WHERE jest
obliczane dla każdej z krotek.
• Jeśli wyrażenie jest prawdziwe, to krotka jest
poddawana dalszemu przetwarzaniu, np. w klauzuli
RETURN. W przeciwnym wypadku krotka jest odrzucana.
avg(for $x at $i in (1,2,3,4,5,6,7,8,9,10)
where $i mod 2 = 0
return $x)
for $e in distinct-values(doc('pracownicy.xml')//etat/text())
let $l := doc('pracownicy.xml')//pracownik[etat = $e]
where count ($l) > 2
return <etat nazwa="{$e}">{count($l)}</etat>
Klauzula RETURN i ORDER BY
• Klauzula RETURN jest ewaluowana raz dla każdej
krotki uzyskanej w wyniku działania
wcześniejszych klauzul. Wyniki tej ewaluacji są
składają się na rezultat wyrażenia FLWOR.
• Jeśli w zapytaniu nie ma klauzuli ORDER BY
wówczas kolejność krotek dostarczanych do
klauzuli RETURN jest determinowana przez
sposób przetwarzania klauzul FOR i LET.
• Jeśli klauzula ORDER BY istnieje wówczas to ona
decyduje o kolejności krotek w strumieniu
dostarczanym do klauzuli RETURN.
Klauzula ORDER BY
• Zadaniem klauzuli ORDER BY jest uszeregowanie strumienia krotek
• Klauzula ORDER BY definiuje porządek w oparciu o jedno lub wiele wyrażeń.
• Słowa kluczowe występujące w wyrażeniach klauzuli ORDER BY:
– descending – porządek sortowania malejący
– empty least – wartości puste traktowane są jako najmniejsze
– empty greatest – wartości puste traktowane są jako największe
for $p in doc("pracownicy.xml")//pracownik
order by number($p/placa_pod) descending
return <w>{$p/nazwisko} {$p/placa_pod}</w>
for $z in doc("zespoly.xml")//zespol
order by $z/adres empty greatest
return $z
Uporządkowanie wyników
• Wyrażenia XQuery zwracają wynik w ściśle
określonym porządku
– wyznaczonym przez klauzulę ORDER BY
– wyznaczonym przez kolejność węzłów w dokumencie
odczytywanych za pomocą klauzuli FOR
• Deklaracja pozwalająca na zignorowanie
porządku poszczególnych elementów ma postać
funkcji unordered
unordered(for $z in doc("zespoly.xml")//id_zesp,
$p in doc("pracownicy.xml")//pracownik
where $p/id_zesp = $z
return <pracownik>{$p/nazwisko},{$z/../nazwa}</pracownik>
)
Podzapytania
• W zapytaniach XQuery można zagnieżdżać wyrażenia FLWOR
• Najczęściej zagnieżdżenia występują
– w klauzuli RETURN
– jako argumenty funkcji
– w klauzuli WHERE pod postacią np. wyrażeń ilościowych
• Zagnieżdżenia mogą wykorzystywać wcześniej przypisane zmienne
for $z in doc("zespoly.xml")//id_zesp
return <zespol> {$z/../nazwa}
{for $p in doc("pracownicy.xml")//pracownik
where $p/id_zesp = $z
return $p/nazwisko}
<wynik>
</zespol>
{ for $z in doc("zespoly.xml")//nazwa
return $z }
</wynik>
Wyrażenia warunkowe
• XQuery wspiera wyrażenia warunkowe oparte na
konstrukcji IF, THEN, ELSE
• W przypadku, gdy wyrażenie testowane w
warunku występującym po IF jest spełnione,
wynikiem wyrażenia warunkowego jest wyrażenie
występujące po THEN. W przeciwnym przypadku,
wynikiem jest wyrażenie występujące po ELSE.
for $z in doc("zespoly.xml")//id_zesp
return <zespol> {$z/../nazwa}
{ if ($z = 10) then
for $p at $i in doc("pracownicy.xml")//pracownik
where $p/id_zesp = $z
return $p/nazwisko
else () }
</zespol>
Wyrażenia ilościowe (1/2)
• Wyrażenia ilościowe wspierają weryfikację
warunków dla zbioru elementów.
• Wyrażenia ilościowe są spełnione gdy warunek
testujący jest spełniony dla
– wszystkich elementów w zbiorze
– chociaż jednego elementu w zbiorze
• Format wyrażenia ilościowego jest następujący:
(some|every) var in expr (, var2 in expr2)* satisfies WarunekTestujacy
for $z in doc("zespoly.xml")//id_zesp
where some $p in doc("pracownicy.xml")//pracownik
satisfies $p/id_zesp = $z
return $z/../nazwa
Wyrażenia ilościowe (2/2)
for $z in doc("zespoly.xml")//id_zesp
where every $p in doc("pracownicy.xml")//pracownik[id_zesp = $z]
satisfies $p/placa_pod > 500
return $z/../nazwa
<frequent_bidder>
{ for $u in doc("users.xml")//user_tuple
where
every $item in doc("items.xml")//item_tuple satisfies
some $b in doc("bids.xml")//bid_tuple satisfies
($item/itemno = $b/itemno and $u/userid = $b/userid)
return
$u/name }
</frequent_bidder>