1
Obiektowe systemy baz danych
R. 6-1 Obiektowy
Model zapytań
Model zapytań cd..
Definicję niepierwotnej klasy możemy przedstawić w postaci
skierowanego dwuwymiarowego, grafu (poprzedni rys.)
nazywanego grafem schematu klasy.
Definicja grafu schematu
(SG) dla pewnej klasy C jest następująca:
SG jest zakorzenionym skierowanym grafem składającym się ze
zbioru klas N oraz ze zbioru łuków klas E wiążących pary klas.
Klasa C jest korzeniem SG i jest klasą niepierwotną;
E składa się z dwóch typów łuków:
łuk między klasami C1 i C2, przy czym C2 stanowi dziedzinę
jednego z atrybutów klasy C1, skierowany od atrybutu do
dziedziny;
łuk między klasami C1 i S1, przy czym S1 jest specjalizacją klasy
C1, łuk kierowany jest od klasy do jej podklasy;
łuk łączący atrybut klasy z jego dziedziną może być
jednowartościowy lub wielowartościowy w przypadku, gdy
wartością atrybutu może być zbiór instancji jego dziedziny;
zbiór łuków z dowolnej klasy Ci w SG do bezpośrednich i
pośrednich podklas Ci tworzy skierowany acykliczny graf
(hierarchię klas zakorzenioną w Ci);
zbiór łuków od korzenia C do bezpośrednich i pośrednich dziedzin
atrybutów stanowi skierowany graf zakorzeniony w C, czyli
hierarchia kompozycji klas SG jest skierowanym, zakorzenionym
grafem, który może być cykliczny.
Model zapytań
jednoargumentowe
Dotyczą jednej klasy lub hierarchii klas zakorzenionej w jednej
klasie, są analogiczne do relacyjnych operacji selekcji i projekcji.
Operacja selekcji na klasie C wybiera takie instancje klasy C,
które spełniają boolowskie kombinacje predykatów zapytania na
podgrafie grafu schematu C. Graf taki nazywamy grafem
zapytania. Graf zapytania zawiera wyłącznie klasy dla których
określono predykaty w zapytaniu.
Predykat
może wystąpić w jednej z dwóch postaci:
predykat prosty, gdzie wartość może być instancją klasy
pierwotnej lub identyfikatorem obiektu dowolnej klasy (dzięki
czemu możliwe jest sprawdzenie równości odwołań do obiektów);
predykat złożony odwołujący się do ciągłej sekwencji atrybutów
wzdłuż gałęzi hierarchii kompozycji klas
Operatorem w predykacie zapytania
może być dowolny
operator skalarny, operator porównania zbiorów. Każda metoda
może być użyta w dowolnej części predykatu (jako nazwa
atrybutu, operator lub wartość). Zapytanie formułować można
specyfikując dowolną podklasę dziedziny atrybutu jako jego
dziedzinę.
Model zapytań
jednoargumentowe cd..
Szczegółowa definicja grafu zapytania QG
jest następująca:
QG jest spójnym podgrafem grafu schematu SG dla klasy C.
Klasa C jest korzeniem grafu QG, tzn. graf QG dla C i SG dla C
mają ten sam korzeń. C jest klasą niepierwotną;
graf QG zawiera tylko te węzły odpowiadającego grafu SG, dla
których jest określony predykat zapytania;
łuk prowadzący od atrybutu klasy do dziedziny SG można
zmienić na grafie QG na taki, który prowadzi od atrybutu do
podklasy jej dziedziny. Wówczas do grafu QG jest dołączana
jedynie hierarchia klas zakorzenionych w nowej dziedzinie;
zbiór łuków prowadzących z klasy korzenia C do bezpośrednich i
pośrednich dziedzin atrybutów C, zawartych w grafie QG, tworzy
skierowany graf zakorzeniony w klasie C. Stąd też, hierarchia
kompozycji klas dla QG tworzy skierowany zakorzeniony w klasie
C graf. Dzięki temu hierarchia kompozycji klas dla QG tworzy
skierowany graf zakorzeniony w klasie C. Niektóre gałęzie
zawierają liście inne nie (istota cykli zostanie opisana poniżej);
węzeł-liść w acyklicznej gałęzi ma tylko pojedynczy predykat.
Dla węzłów wewnętrznych dowolnej gałęzi (cyklicznej bądź nie)
mogą być określone predykaty (proste lub złożone).
Model zapytań - przykład
Przyjmując graf z poprzedniego rys. za przykładowy graf
schematu zadajmy zapytanie: "
Podaj wszystkie niebieskie
samochody, wyprodukowane przez firmę z siedzibą w Detroit, ,
której prezes nie przekroczył 50 lat
:":
(select Pojazd (Kolor = "niebieski"
and Firma Lokalizacja = "Detroit"
and Firma Prezes Wiek < 50))
Kolor = "niebieski" jest predykatem prostym, pozostałe dwa
predykaty są złożone. Graf zapytania przedstawiony jest na rys.
Rys.Graf
zapytania
Model zapytań - przykład
Hierarchia kompozycji klas może zawierać gałęzie cykliczne.
Przypadek taki występuje, jeżeli gałąź hierarchii kompozycji
klas zawiera takie klasy Ci oraz Cj, że Cj jest (pośrednią)
dziedziną atrybutu klasy Ci, a Ci (lub jej podklasa albo
nadklasa) jest dziedziną atrybutu Cj. Mogą wystąpić cztery
rodzaje takich powiązań:
cykl typu n jest złożony z n>1 węzłów na gałęzi;
cykl typu n-s jest quasi-cyklem odpowiadającym cyklowi typu
n, składa się z n>0 węzłów i nadklasy lub podklasy dla jednego
z n węzłów;
cykl typu s jest złożony z jednego węzła;
cykl typu s-s jest quasi-cyklem odpowiadającym cyklowi typu
s, składa się z jednej klasy oraz jej nadklasy lub podklasy.
Następny Rys. obrazuje te zależności.
Model zapytań - przykład
Rys. Gałęzie cykliczne
Model zapytań - przykład
Przedstawione zostaną przykłady zapytań, których grafy
zawierają gałęzie cykliczne:
dla grafu schematu z poprzedniego przykładu dokładamy
założenie, że klasa Pracownik ma dodatkowy atrybut
WłasnyPojazd, którego dziedziną jest klasa Pojazd.
Zapytanie
: "
Wymień wszystkie niebieskie samochody posiadane
przez prezesów firm, w których zostały wykonane
" jest
przykładem zapytania, którego graf zawiera cykl typu n:
(select (Pojazd: V) (Kolor = "niebieski"
and Producent Prezes WłasnyPojazd = V))
Zmienna
V
przyjmuje wartości wszystkich instancji klasy pojazd.
Model zapytań - przykład
Zakładamy, że w grafie schematu, klasa Pracownik zawiera
dodatkowy atrybut: Kierownik, którego dziedziną jest klasa
Pracownik (gałąź cykliczna typu s). Dodatkowo zawiera klasę
PracownikKobieta będącą podklasą klasy Pracownik. Graf
zapytania: "
Wymień wszystkich kierowników kobiety pracownika
o nazwisku Johnson
: zawiera gałąź cykliczną typu s-s:
(select Pracownik (recurse Kierownik: M.
(:M. is-a PracownikKobieta))
(Nazwisko = "Johnson"))
Wyrażenie: (recurse Kierownik: M.) mówi o tym, iż po znalezieniu
instancji klasy Pracownik spełniającej predykat (Nazwisko =
"Johnson"), w sposób rekurencyjny mają zostać wyszukane
wartości atrybutu Kierownik względem znalezionej instancji.
Wyrażenie (:M. is-a PracownikKobieta) ogranicza wynik tych
poszukiwań do instancji klasy PracownikKobieta.
Model zapytań - przykład
Wynik zapytania
jest zależny od interpretacji dziedziny
zapytania. Dziedzinę zapytania można rozumieć jako zbiór
instancji klasy C będącej przedmiotem zapytania lub zbiór
instancji hierarchii klas zakorzenionej w C. Zależnie od tego,
w wyniku zapytania jednoargumentowego na klasie C,
otrzyma się zbiór instancji klasy C lub zbiór niejednorodnych
(bo należących do różnych klas) instancji całej hierarchii klas
zakorzenionej w C. W wyniku operacji selekcji na hierarchii
klas zakorzenionej w C otrzymujemy zbiór tych instancji,
które spełniają predykat zapytania. Operacja projekcji
polega na wybraniu tylko niektórych atrybutów z instancji
spełniających warunek zapytania. W przypadku zmiany
nazwy atrybutu odziedziczonego, atrybut ten jest
traktowany identycznie jak oryginalny atrybut. Atrybuty
równoważne (odziedziczone, z przedefiniowaniem nazwy lub
dziedziny) muszą również znaleźć się w wyniku zapytania.
Podczas realizacji operacji projekcji eliminuje się duplikaty
wg dwóch kryteriów:
równości obiektów - testuje się równość identyfikatorów
obiektów;
równości wartości - testuje się równość zdefiniowanych przez
użytkownika atrybutów instancji, jeżeli porównywane obiekty
charakteryzowane prze zbiór takich samych atrybutów. Atrybuty
systemowe (numer wersji, data modyfikacji, itp.) nie są brane
pod uwagę.
Model zapytań -
zapamiętywanie
wyniku
Otrzymany w wyniku wykonania zapytania zbiór obiektów,
należących do danej klasy lub hierarchii klas w niej
zakorzenionych, powinien zostać zapamiętany, czyli
dołączony do systemowej hierarchii obiektów. Rzeczą
oczywistą jest, że obiekty te muszą otrzymać nowe
identyfikatory, aby mogły być jednoznacznie identyfikowane
w ramach całej bazy danych. Nową hierarchię klas można
umieścić w hierarchii klas całej bazy danych na jeden z dwóch
sposobów:
(W1) nadklasą korzenia nowej hierarchii klas (powstałej w
wyniku zapytania) jest nadklasa korzenia hierarchii klas
stanowiącej dziedzinę zapytania (szczegóły na następnym
slajdzie). Nie jest to do końca poprawne.
(W2) umieszczenie korzenia nowej hierarchii klas jako
podklasy klasy CLASS będącej korzeniem hierarchii klas
całej bazy danych (szczegóły na kolejnym slajdzie). Takie
podejście zwiększa nieco zajętość pamięci, z uwagi na
konieczność skopiowania atrybutów i metod z nadklas
korzenia nowej hierarchii do tego właśnie korzenia.
Model zapytań -
zapamiętywanie (W1)
nadklasą korzenia nowej hierarchii klas (powstałej w wyniku
zapytania) jest nadklasa korzenia hierarchii klas stanowiącej
dziedzinę zapytania - Rys. poniżej.
Nie jest to do końca poprawne w przypadku operacji projekcji.
Może się zdarzyć bowiem, że w jej wyniku uzyskamy klasę o
mniejszej liczbie atrybutów niż jej nadklasa. Inny problem
stwarzany jest przez możliwość ewolucji schematu bazy danych.
Usunięcie dowolnego atrybutu z jednej z nadklas dla klas z
podhierarchii powstałej w wyniku zapytania musi być
propagowane w dół, zmieniając wynik zapytania.
Rys. Umieszczenie klasy wyniku zapytania w hierarchii klas
Model zapytań -
zapamiętywanie (W2)
umieszczenie korzenia nowej hierarchii klas jako podklasy
klasy CLASS będącej korzeniem hierarchii klas całej bazy
danych - rys. poniżej.
Takie podejście zwiększa nieco zajętość pamięci, z uwagi na
konieczność skopiowania atrybutów i metod z nadklas korzenia
nowej hierarchii do tego właśnie korzenia. Nie jest to jednak
poważna wada. Rozwiązanie to przyjęto w modelu zapytań
systemu ORION.
Rys. Umieszczenie klasy wyniku zapytania w hierarchii klas
Model zapytań
wieloargumentowych
Zapytania wieloargumentowe zawierają złączenia i operacje
na zbiorach. Złączenia w obiektowym modelu zapytań dzielą
się na: złączenie niejawne i złączenie jawne
.
Złączenie niejawne
w hierarchii kompozycji klas. Zapytanie
jednoargumentowe jest niejawnym złączeniem klas z
hierarchii kompozycji klas o korzeniu w docelowej klasie
zapytania. Złączenie zachodzi między klasą Ci zawierającą
atrybut A, a klasą Cj, która jest dziedziną tego atrybutu.
Atrybut A oraz identyfikator obiektowy klasy Cj stanowią
atrybuty złączenia. Wadą jest ograniczenie złączenia
niejawnego do wyspecyfikowanego związku atrybut-
dziedzina.
Złączenie jawne
- złączenie klas wg dowolnego,
określonego przez użytkownika atrybutu. Złączenie może
być wykonane, jeżeli atrybuty złączenia należące do dwóch
różnych klas są zgodne. Mówimy, że atrybuty Ai i Aj są
zgodne, jeżeli ich dziedziny są identyczne lub dziedzina
jednego z nich jest nadklasą/podklasą drugiego. To
złączenie w obiektowym modelu zapytań jest faktycznie
zapytaniem
wieloargumentowym.
Dziedziną
tego
zapytania są instancje klas ulegających złączeniu lub
instancje hierarchii klas w nich zakorzenionych.
Model zapytań
wieloargumentowych
Składnia zapytania musi umożliwiać określenie dziedziny zapytania
dla każdej ze złączanych klas. Wynikiem złączenia jest zbiór instancji
powstały z konkatenacji instancji różnych klas. Przechowywanie
wyniku złączenia musi się odbywać, podobnie jak w przypadku
zapytań jednoargumentowych, przy użyciu nowej klasy, będącej
bezpośrednią podklasą klasy CLASS (korzenia hierarchii klas całej
bazy). Definicja grafu zapytania dla złączenia pary klas jest
następująca (Si oznacza dziedzinę atrybutu złączenia w Ci, Sj
dziedzinę atrybutu złączenia w Sj):
każda z klas Ci oraz Cj jest korzeniem grafu zapytania
odpowiadającego zapytaniu jednoargumentowemu odpowiednio na
Ci i Cj. Oznacza to, że każdy z dwóch grafów zapytania jest
korzeniem hierarchii klas i hierarchii kompozycji klas zakorzenionych
w złączanej klasie;
grafy zapytania dla Ci oraz Cj częściowo pokrywają się na skutek
zgodności atrybutów złączenia. Klasy Si i Sj są korzeniami hierarchii
kompozycji klas, w których węzły stanowią z kolei korzenie hierarchii
klas. Jeśli Si=Sj, to cała hierarchia kompozycji klas jest wspólnie
wykorzystywana przez odpowiednie atrybuty złączenia klas Ci oraz
Cj. Jeśli Si jest nadklasą dla Sj, to hierarchia kompozycji klas
zakorzeniona w Si jest dziedziną atrybutu złączenia klasy Ci, a
dziedziną atrybutu złączenia z Cj jest hierarchia kompozycji klas
zakorzeniona w Sj.
Model zapytań
wieloargumentowych
Rys. Graf zapytania, złączenia dwóch dowolnych zapytań.
Dziedziną operacji na zbiorach może być zbiór instancji klasy
zdefiniowanej w bazie danych lub zbiór instancji otrzymanych w
wyniku zapytania. Argument i wynik mogą tworzyć
heterogeniczny zbiór obiektów. Operacje teoriomnogościowe
wykorzystuje się głównie do dalszego przetwarzania wyników
zapytań (argumentami są zapytania).
Język zapytań w OBD
Notacja języka jest podobna do języka zapytań relacyjnych baz
danych SQL. Struktura zapytania prostego wygląda
następująco:
ProsteZapytanie ::=
select KlauzulaCelu |
select KlauzulaCelu from KlauzulaZakresu |
select KlauzulaCelu where KlauzulaKwalifikacji |
select KlauzulaCelu from KlauzulaZakresu where
KlauzulaKwalifikacji
W zapytaniu prostym mogą wystąpić trzy klauzule:
celu
- określająca atrybuty wyjściowe;
zakresu
- zawierająca deklaracje zmiennych obiektowych w
postaci par: zakres zmienna, zakresem może być klasa.
Klauzula ta może zostać pominięta, wówczas domyślnie
przyjmuje się zmienną obiektową o tej samej nazwie co klasa,
dla każdej klasy do której są odwołania w klauzuli celu;
kwalifikacji
- służy do specyfikacji warunków zapytania przy
pomocy boolowskich kombinacji predykatów.
Zapytania bardziej skomplikowane można tworzyć łącząc
zapytania proste przy pomocy operacji na zbiorach.
Język zapytań w OBD -
przykłady
W oparciu o schemat klasy Pojazd (przytaczany
powyżej) postawione zostanie zapytanie o treści:
"
Wyszukaj wszystkie niebieskie pojazdy,
wyprodukowane przez firmę zlokalizowaną w
Detroit, której prezes ma mniej niż 50 lat
". Pytanie
to może być sformułowane w następujący sposób:
select :V from Pojazd :V
where :V = "niebieski"
and :V producent lokalizacja = "Detroit"
and :V producent prezes wiek < 50.
gdzie V jest zmienną obiektową. Można pominąć
zmienną obiektową w klauzuli zakresu, jeżeli
jednoznacznie wiadomo do których atrybutów
stosowany jest predykat:
select Pojazd
where kolor = "niebieski"
and producent lokalizacja = "Detroit"
and producent prezes wiek < 50
.
Równość dwóch obiektów
(
tożsamość obiektową) wyraża się
jednym z dwóch operatorów:
= (znak równości) - równość
obiektów - stwierdzenie czy
identyfikatory obiektów są równe;
== (podwójny znak równości) -
równość wartości - kontrola czy
odpowiadające sobie atrybuty
(porównywanych obiektów)
zdefiniowane przez użytkownika
mają te same wartości.
Język zapytań w OBD -
zapytania acykliczne
Zapytania acykliczne związane z hierarchią kompozycji klas.
Zagnieżdżenie definicji obiektów związane z hierarchią
kompozycji klas wymusza włączenie do języka zapytań
konstrukcji pozwalających w łatwy sposób specyfikować
predykaty na zagnieżdżonym ciągu atrybutów. Taki zagnieżdżony
ciąg atrybutów nazywany jest ścieżką. Zmienna obiektowa może
zostać użyta do określenia ścieżki zawierającej ciąg nazw
atrybutów w obiekcie złożonym, taka ścieżka nazywana jest
zmienną ścieżkową. Zmienna ścieżkowa przyjmuje postać:
zmiennej skalarnej
- jeżeli wszystkie, zawarte w niej
atrybuty są atrybutami skalarnymi oraz gdy każdy
występujący w niej atrybut zbiorowy poprzedzony jest
jednym z kwantyfikatorów: each, exists (ich znaczenie
przedstawione zostanie w dalszej części);
zmiennej zbiorowej
- gdy zawiera przynajmniej jeden
atrybut zbiorowy dla którego nie podano żadnego ze słów
kluczowych (each, exists) lub określono dla niego
kwantyfikator set-of.
Język zapytań w OBD - notacje
Poniższa notacja przedstawia definicję zmiennej skalarnej(zmienną
zbiorową definiuje się analogicznie, z wyjątkiem tego, że
przynajmniej jeden atrybut zbiorowy musi wystąpić bez
kwantyfikatora lub z kwantyfikatorem: set-of):
ZmiennaSkalarna
::= ZmiennaObiektowa ŚcieżkaSkalarna |
ŚcieżkaSkalarna
Zmienna obiektowa może być pominięta, jeżeli występuje
jednoznaczność odwołań.
ŚcieżkaSkalarna
::= ElementŚcieżkiSkalarnej |
ElementŚcieżkiSkalarnej
ŚcieżkaSkalarna
ElementŚcieżkiSkalarnej
::= NazwaAtrybutuSkalarnego |
Kwantyfikator NazwaAtrybutuZbiorowego
Zmienne ścieżkowe dzielą się ponadto na:
nieterminalne
- zmienna ścieżkowa kończy się na
niepierwotnej klasie;
terminalne
- dziedziną ostatniego atrybutu jest klasa
pierwotna.
Do nałożenia warunków na atrybuty zbiorowe używa się
kwantyfikatorów:
each - oznacza, że predykat musi być spełniony dla każdego
obiektu należącego do atrybutu zbiorowego;
exists - wymusza spełnienie predykatu przynajmniej dla
jednego obiektu ze zbioru atrybutu;
set-of - określa, że dany atrybut jest atrybutem zbiorowym.
Język zapytań w OBD - notacje
cd..
Związki między skalarnymi zmiennymi ścieżkowymi lub między
skalarną zmienną ścieżkową, a stałą skalarną określa się przy
pomocy skalarnych operatorów porównań:
=, equal, string-equal,
string=, itp
. Do określania związków między dwiema zbiorowymi
zmiennymi ścieżkowymi lub zbiorową zmienną ścieżkową, a stałą
zbiorową uzywa się zbiorowych operatorów porównań:
has-subset,
is-subset, is-equal, itp
. Zbiorową zmienną ścieżkową można
porównać ze stałą skalarną operatorami:
has-element, -:has-
element
, a także w przeciwnym kierunku:
is-in, -:is-in
.
W zapytaniach można korzystać ze zmiennych zakresu. Stosuje się je
jako skrót, by uniknąć powtarzania zapisu długiej zmiennej
ścieżkowej. Można również związać zmienną ze zbiorem obiektów
będących wartościami atrybutu innego obiektu, stosując predykat
przynależności w klauzuli zakresu. Rozszerzone definicja klauzuli
zakresu jest następująca:
KlauzulaZakresu :: ElementZakresu |ElementZakresu,
KlauzulaZakresu
ElementZakresu ::= WyrażenieKlasowe ZmiennaObiektowa |
ZmiennaObiektowa is-in ZbiórZakresów |ZmiennaReferencyjna
ZmiennaObiektowa ::= NazwaZmiennej
ZbiórZakresów ::= ZmiennaObiektowa ProstaŚcieżkaZbiorowa
ZmiennaReferencyjna ::= ZmiennaObiektowa is ZmiennaObiektowa
ŚcieżkaSkalarna |ZmiennaObiektowa is ZmiennaObiektowa
ŚcieżkaZbiorowa
Wyrażenie klasowe w najprostszym przypadku składa się z nazwy
klasy.
Język zapytań w OBD –
przykłady cd..
Q-a1: "
Podaj firmy, których wszystkie oddziały zlokalizowane są
w tym samym miejscu co zarząd firmy
"
select Firma
where each oddziały lokalizacja string-equal lokalizacja
Użyta została skalarna zmienna ścieżkowa "each oddziały
lokalizacja". Pierwszy atrybut zawiera kwantyfikator each,
ponieważ jest wielowartościowy.
Q-a2: "
Podaj wszystkie firmy, posiadające co najmniej jeden
oddział zlokalizowany w tym samym miejscu co zarząd firmy
"
select Firma
where exists oddziały lokalizacja string-equal lokalizacja
Q-a3: "
Wybierz wszystkie firmy, których oddziałami są fabryki
samochodów lub ciężarówek
". Przykład formułuje zapytanie na
dwa sposoby:
select Firma
where oddziały funkcja
is-subset ("Fabryka Samochodów" "Fabryka Ciężarówek")
Porównuje się tu zbiorową zmienną ścieżkową "oddziały
funkcja" do zbiorowej stałej.
Język zapytań w OBD –
przykłady cd..
Rys. Graf schematu definiujący klasę Pojazd
Język zapytań w OBD –
przykłady cd..
select Firma
where each oddziały funkcja
is-in ("Fabryka Samochodów" "Fabryka Ciężarówek")
Kwantyfikator each sprawia, że zmienna ścieżkowa staje się
skalarem testowanym względem przynależności do danego zbioru
wartości.
Q-a4: Zapytanie "Wybierz wszystkie firmy posiadające
przynajmniej jeden oddział, zatrudniający co najmniej jednego
pracownika mieszkającego we Wrocławiu i jeżdżącego
samochodem Ferrari" przedstawia przykład związania zmiennej ze
zbiorem obiektów będących wartościami atrybutu innego obiektu:
select :C from Firma :C, Oddział :D, Pracownik :E
where :D is-in :C oddziały and :E is-in :D
personel
and :E jeździ producent nazwa = "Ferrari"
and :E miejscezamieszkania = "Wrocław";
Z wykorzystaniem tylko zmiennych referencyjnych. Uwalniają one
od kilkukrotnej specyfikacji długiej zmiennej ścieżkowej
powtarzającej się w zapytaniu.
select :C from Firma :C, :E is-in :C oddziały
personel
where :E jeździ producent nazwa = "Ferrari"
and :E miejscezamieszkania = "Wrocław";
Język zapytań w OBD –
przykłady cd..
Z zastosowaniem predykatu przynależności do zbioru (is-in).
Każdorazowo, przy przypisaniu zmiennej :C instancji klasy Firma
określony zostaje zbiór zakresu dla zmiennej :E. Jest to suma
zbiorów obiektów klasy Pracownik będących wartościami atrybutu
personel po wszystkich oddziałach dla danej instancji klasy Firma.
Instancja klasy Firma spełnia warunki zapytania, gdy istnieje co
najmniej jeden element w tym zbiorze spełniający predykaty
zawarte w klauzuli kwalifikacji zapytania.
Q-a5 "
Wybierz wszystkie firmy, w których wszyscy pracownicy
jeżdżą samochodami ze zbioru (Fiat, Ferrari) lub (Ford,
Chevrolet, Nissan
)".
select :C from Firma :C, :S is :C oddziały personel jeździ
where :S is-subset ("Fiat", "Ferrari")
or :S is-subset ("Ford", "Chevrolet", "Nissan").
Język zapytań w OBD –
zapytania acykliczne z
hierarchią klas
Omawiany język zapytań pozwala określić, czy celem danego
zapytania jest pojedyncza klasa, hierarchia klas, czy też
podzbiór hierarchii klas. Operator * (operator hierarchii)
umieszczony w podzapytaniu po nazwie klasy kieruje to
zapytanie do całej hierarchii klas zakorzenionej w
wymienionej klasie. Podzbiór hierarchii klas, będący celem
zapytania, może zostać utworzony może zostać utworzony
poprzez związanie zmiennej obiektowej z sumą klas (lub
hierarchii) albo różnicą między hierarchią klas i klasą (lub
hierarchią). Wyrażenie klasowe pozwalające określić cel
zapytania w opisany sposób ma postać:
WyrażenieKlasowe
::= WyrażenieKlasowe |
WyrażenieKlasowe union
WyrażenieKlasowe|
HierarchiaKlas difference
WyrażenieKlasowe |
Klasa |HierarchiaKlas
Klasa
::= NazwaKlasy
HierarchiaKlas
::= NazwaKlasy *
Język zapytań w OBD –
przykłady cd..
Q-h1: "
Znajdź wszystkie instancje klasy firma lub wszystkie jej
podklasy, posiadające co najmniej jeden oddział w Rzymie
".
select Firma * where exists oddziały lokalizacja = "Rzym"
Q-h2:
Zapytania jak powyższe z wykluczeniem firm
produkujących ciężarówki:
select Firma * difference FirmaCiężarówek
where exists oddziały lokalizacja = "Rzym"
Q-h3: "
Znajdź firmy produkujące samochody krajowe lub firmy
japońskie posiadające przynajmniej jeden oddział w Rzymie
(dotyczy firm krajowych i japońskich
)"
select Firma *
KrajowaFirmaSamochodowa union JapońskaFirmaSamochodowa
where exists oddziały lokalizacja = "Rzym".
Język zapytań w OBD –
przykłady cd..
Przykład użycia kwantyfikatora union.
Q-h4: "
Wybierz wszystkich pracowników posiadających samochód z
silnikiem turbo o mocy większej niż 100 KM
".
select :P from Pracownik * :P, Samochód * :A, SilnikTurbo * :T
where :A
is-in
:P właścicielpojazdu
and :A układnapędzający silnik = :T
and :T moc > 100
W powyższym zapytaniu wyrażenie ścieżkowe występujące po
kwantyfikatorze
is-in
zwraca zbiór wszystkich silników
(dowolnego typu) będących częścią pojazdu (dowolnego
typu), których właścicielem jest dana osoba. Można
ograniczyć dziedzinę wartości atrybutu w wyrażeniu
ścieżkowym, umieszczając w nim wyrażenie klasowe:
select :P from Pracownik :P
where :P exists właścicielpojazdu class Samochód * silnik
class SilnikTurbo moc > 100
Klauzula class Samochód * określa obiekty będące
wartościami atrybutu właścicielpojazdu i należące do klasy
Samochód.
Język zapytań w OBD –
zapytania cykliczne
Dotyczą hierarchii kompozycji klas zakorzenionej w danej klasie,
zawierającej jeden lub więcej cykli. Składnia zapytań zostanie
omówiona dla cykli przedstawionch poprzednio.
Q-c1: "
Wybierz wszystkie pojazdy, którymi jeżdżą prezesi, w
których zostały one wyprodukowane
". Zapytanie z cyklem typu
n.
select :V from Pojazd :V
where kolor = "niebieski" and producent prezes jeździ = :V
select :V from Pojazd :V, JapońskiSamochód :J
where :V kolor = "niebieski" and producent prezes
jeździ = :V
Q-c2: "
Wybierz wszystkie niebieskie samochody,
wyprodukowane przez firmę, której prezes jeździ japońskim
samochodem
". Przykład zapytania z cyklem typu n-s.
Zmienna :V służy do przeglądania wszystkich instancji klasy
Pojazd.
Język zapytań w OBD –
zapytania cykliczne
W celu przedstawienia kolejnych dwóch przykładów, do klasy
Pracownik dodano atrybut Kierownik, którego dziedziną jest
klasa Pracownik.
Q-c3: "
Wybierz wszystkich kierowników pracownika o nazwisku
Johnson
". Zapytanie z cyklem typu s.
select Pracownik (recurse kierownik) where nazwisko =
"Johnson"
Wyrażenie recurse kierownik pozwala w sposób rekurencyjny
pobrać z instancji klasy Pracownik wartość atrybutu
kierownik, w przypadku znalezienia obiektu klasy Pracownik
spełniającego zadany predykat (nazwisko = "Johnson").
Q-c4: Dodatkowo do klasy Pracownik dodana została podklasa
PracownikKobieta. "
Znajdź wszystkich kierowników-kobiety
pracownika o nazwisku Johnson
".
select :F from PracownikKobieta :F, Pracownik :E
where :F is-in :E (recurse kierownik) and :E nazwisko =
"Johnson"
Język zapytań w OBD –
zapytania z wykorzystaniem
metod
Metody ze względu na pełnioną w zapytaniu rolę dzielimy na:
metody atrybutu wyliczanego
- pełni rolę podobną do
atrybutu, przekazując jako swój wynik atrybut;
metody predykatowe
- przekazuje wartość TRUE lub
FALSE, wartość zwrócona przez taką metodę może być
użyta w obliczaniu wyrażenia boolowskiego w zapytaniu
Przykłady.
Q-m1: Przykładowe zastosowanie metody atrybutu
wyliczanego. Założenie: metoda Wartość, zdefiniowana w
klasie Samochód, oblicza wartość samochodu z jego
składowych (np. korpus, silnik). "Wybierz wszystkich
pracowników posiadających co najmniej jeden samochód o
wartości przekraczającej 10000".
select Pracownik
where exists właścicielpojazdu class Samochód wartość >
10000
Język zapytań w OBD –
zapytania z wykorzystaniem
metod - przykłady
Q-m2: Przykład ilustrujący użycie metody predykatowej.
Założenie: w klasie Firma została zdefiniowana metoda
DochódFirmy, zwracająca TRUE, gdy dochód firmy jest rosnący.
"
Znajdź firmy mieszczące się w Teksasie, których wszystkie
oddziały zlokalizowane są również w Teksasie o rosnącym
dochodzie
".
select Firma
where lokalizacja = "Teksas"
and each oddziały lokalizacja = "Teksas"
and DochódFirmy