background image

1

Obiektowe systemy baz danych

R. 6-1 Obiektowy

 

Model zapytań

background image

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. 

background image

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ę. 

background image

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). 

background image

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 

background image

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. 

background image

Model zapytań - przykład

     

Rys. Gałęzie cykliczne 

background image

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.

background image

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

background image

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ę.

background image

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. 

background image

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 

 

background image

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 

background image

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. 

background image

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. 

background image

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).

background image

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.

background image

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.

background image

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.

background image

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.

background image

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. 

background image

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. 

background image

Język zapytań w OBD – 
przykłady cd..

     

Rys. Graf schematu definiujący klasę Pojazd 

background image

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"; 

background image

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"). 

background image

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 * 

background image

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". 

background image

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.

background image

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.

background image

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" 

background image

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 

background image

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 


Document Outline