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>