R 6 1 Obiektowy model zapytan

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


Wyszukiwarka

Podobne podstrony:
SyntezaRegulatoraCyfrowego-ModelWeWyObiektu., Synteza regulatora cyfrowego - model we/wy obiektu
Jezyk zapyta dla obiektowego mo Nieznany
model obiektywnego przypisania - wersja dla prowadzacych zajecia, Studia na KA w Krakowie
Modelowanie obiektów architektonicznych Model kościoła św Witalisa we Włocławku
model obiektywnego przypisania skutku przy przestepstwach materialnych z dzi alania moj, Studia na K
UML i wzorce projektowe Analiza i projektowanie obiektowe oraz iteracyjny model wytwarzania aplikacj
UML i wzorce projektowe Analiza i projektowanie obiektowe oraz iteracyjny model wytwarzania aplikacj
Model współczesnego obiektu hotelarskiego
UML i wzorce projektowe Analiza i projektowanie obiektowe oraz iteracyjny model wytwarzania aplikacj
UML i wzorce projektowe Analiza i projektowanie obiektowe oraz iteracyjny model wytwarzania aplikacj
UML i wzorce projektowe Analiza i projektowanie obiektowe oraz iteracyjny model wytwarzania aplikacj
Obiekty martyrologii polskiej
Wykład 6 2009 Użytkowanie obiektu
model relacyjny

więcej podobnych podstron