6.6 KiB
Nieprecyzyjne zapytania do bazy danych
Podstawa teoretyczna
Pojęcie zmiennej lingwistycznej
Zmienna lingwistyczna - zmienna przyjmujaca wartości lingwistyczne, opisana czwórką:
(nazwa, uniwersum, termy, interpretacje termów)
gdzie:
- nazwa - nazwa zmiennej lingwistycznej, np. temperatura (wody)
- uniwersum - zbiór dopuszczalnych wartości zmiennej lingwistycznej, np: od 0 do 100
- termy (zbiór wartości) - wartości lingwistyczne przyjmowane przez zmienną, np. okolo 30, zimna, gorąca
- interpretacje - zbiory rozmyte definiujące termy
Zadanie 1:
Zamodeluj zmienne lingwistyczne:
- prędkość samochodu
- czas oczekiwania w restauracji
- liczba znajomych na fejsbuku
Zadanie 2:
Dana jest następująca baza danych zawierająca informacje o filmach filmy_create_insert.sql]:
||id||tytul||rezyser||kraj||rok_produkcji||budzet||czas||gatunek|| ||1||Odlot||Peter Docter, Bob Peterson||USA||2009||175000000||96||animacja|| ||2||Bękarty wojny||Quentin Tarantino||USA/Niemcy||2009||70000000||153||akcja|| ||3||Gdzie Jest Nemo?||Andrew Stanton , Lee Unkrich||USA||2003||94000000||100||animacja|| ||4||Prosta historia||David Lynch||USA||1999||10000000||112||obyczajowy|| ||5||Życie jest piękne||Roberto Benigni||Włochy||1997||57000000||116||dramat, komedia|| ||6||Kill Bill||Quentin Tarantino||USA||2003||41000000||111||akcja|| ||7||Chłopaki nie płaczą||Olaf Lubaszenko||Polska||2000||NULL||100||komedia sensacyjna||
Zaproponuj koncepcję rozwiązania, które umożliwi wyszukiwanie filmu w tej bazie według kryteriów nieprecyzyjnych.
Przeanalizuj m.in. następujące problemy:
- jak mogą wyglądać przykładowe zapytania nieprecyzyjne? (odpowiedz)
- czego może dotyczyć nieprecyzyjność? (odpowiedz)
- jak zamodelować nieprecyzyjność? (odpowiedz)
- jak wyznaczyć i zaprezentować odpowiedź na zapytanie nieprecyzyjne? (odpowiedz)
Zadanie 3:
Opracuj dokładną koncepcję realizacji zapytań typu:
- Podaj tytuły filmów niskobudżetowych.
2. Podaj informacje o filmach
nowych
.
Zaimplementuj rozwiązanie w postaci funkcji SQL.
(szkielet rozwiązania: rozmyte_zapytania_2.sql)
Odpowiedź bazy danych powinna być podobna do poniższych:
- Podaj tytuły filmów niskobudżetowych:
||id||tytul||rezyser||kraj||rok_produkcji||budzet (mln)||czas||gatunek||stopien_spelnienia|| ||4||Prosta historia||David Lynch||USA||1999||10||112||obyczajowy||0.8|| ||6||Kill Bill||Quentin Tarantino||USA||2003||41||111||akcja||0.18||
2. Podaj informacje o filmach
nowych
:
||id||tytul||rezyser||kraj||rok_produkcji||budzet (mln)||czas||gatunek||stopien_spelnienia|| ||1||Odlot||Peter Docter, Bob Peterson||USA||2009||175||96||animacja||0.9|| ||2||Bękarty wojny||Quentin Tarantino||USA/Niemcy||2009||70||153||akcja||0.9|| ||3||Gdzie Jest Nemo?||Andrew Stanton , Lee Unkrich||USA||2003||94||100||animacja||0.3|| ||6||Kill Bill||Quentin Tarantino||USA||2003||41||111||akcja||0.3||
Wskazówki
- Na potrzeby zamodelowania zbioru rozmytego należy wykorzystać wzór na prostą przechodzącą przez dwa punkty (xa, ya) i (xb, yb):
<!-- -->
y - ya = (yb - ya)/(xb-xa) * (x-xa)
- Procedura dodaj_term(@nazwa_zmiennej varchar(100), @term varchar(100), @a int, @b int, @c int)
Tworzy zmienną i dodaje do niej termy: Dodaje term - @term do zmiennej lingwistycznej - @nazwa_zmiennej
Kodowanie zbioru rozmytego realizującego term:
-
- jeżeli a=b to jest to funkcja typu z
- jeżeli b=c to jest to funkcja typu s
- w p.p. jest to funkcja trójkątna unimodalna
Przykład:
\
exec dodaj_term 'budzet', 'niski', 0,0, 50000000
exec dodaj_term 'budzet', 'sredni', 0, 50000000, 100000000
exec dodaj_term 'budzet', 'wysoki', 50000000, 100000000, 100000000
- Należy zaimplementować funkcję dbo.fuzzy(@x real, @nazwa varchar(100),@term varchar(100))
która będzie korzystać z definicji zmiennych lingwistycznych z tabeli zmienne_lingwistyczne (wypełnionej przy użyciu procedury dodaj_term). Ma ona zwracać wartość funkcji przynależności (@membership) dla zadanego x.
W podanym szkielecie zwraca 1 dla x<b oraz 0 w p.p.
- Do realizacji warunków w SQL służy dyrektywa case. Poniżej podano przykład jej użycia:
<!-- -->
select @zmienna = case
when pole_a=pole_b AND pole_b<>pole_c then
case
when @zmianna_x < pole_b then 1.0
when @zmianna_x > pole_b then 1.0
else 0.0
end
when pole_aa<>pole_b then
case
when @zmianna_x < a then 0.0
when @zmianna_x < b then (1.0/pole_b)
end
end
from tabela
gdzie "pole_a", "pole_b", "pole_c" za polami z rekordu tabeli "tabela" pobranymi przez to zapytanie, "zmianna_x" oraz "zmienna" są wcześniej zdefiniowanymi zmiennymi, a wartość "zmienna" zostanie zwrócone jako wynik zapytania dla każdego rekordu.
Należy`` ``zwrócić`` ``uwagę`` ``na`` ``sposób`` ``zapisu`` ``wartości`` ``po`` ``słowie`` ``"then"
Zadanie 4:
Zaimplementuj rozmyty operator "około".
Wykorzystaj go do odpowiedzi na zapytania:
- Znajdź filmy trwające około 100 min
2. Znajdź filmy powstałe
około
2000 roku
(szkielet rozwiązania: rozmyte_zapytania_1.sql)
Zadanie 5:
Korzystając z wyniku zadania 3 wyznacz stopień spełnienia nastepujących warunków:
- film jest niskobudżetowy i nowy
2. film jest niskobudżetowy lub nowy
3. film jest nowy ale nie jest niskobudżetowy
4. film nie jest nowy
Zadanie 6:
Zaproponuj i zrealizuj mechanizm umożliwiający nieprecyzyjne formułowanie zapytań o gatunki filmowe