190 lines
6.4 KiB
Markdown
190 lines
6.4 KiB
Markdown
|
||
## Nieprecyzyjne zapytania do bazy danych {#nieprecyzyjne_zapytania_do_bazy_danych}
|
||
|
||
### Podstawa teoretyczna {#podstawa_teoretyczna}
|
||
|
||
#### Pojęcie zmiennej lingwistycznej {#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: {#zadanie_1}
|
||
|
||
Zamodeluj zmienne lingwistyczne:
|
||
|
||
- prędkość samochodu
|
||
- czas oczekiwania w restauracji
|
||
- liczba znajomych na fejsbuku
|
||
|
||
### Zadanie 2: {#zadanie_2}
|
||
|
||
Dana jest następująca baza danych zawierająca informacje o filmach
|
||
<attachment: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](ania/TZN330/Zaj2BD/odp1 "wikilink"))
|
||
- czego może dotyczyć nieprecyzyjność?
|
||
([odpowiedz](ania/TZN330/Zaj2BD/odp2 "wikilink"))
|
||
- jak zamodelować nieprecyzyjność?
|
||
([odpowiedz](ania/TZN330/Zaj2BD/odp3 "wikilink"))
|
||
- jak wyznaczyć i zaprezentować odpowiedź na zapytanie nieprecyzyjne?
|
||
([odpowiedz](ania/TZN330/Zaj2BD/odp4 "wikilink"))
|
||
|
||
### Zadanie 3: {#zadanie_3}
|
||
|
||
Opracuj dokładną koncepcję realizacji zapytań typu:
|
||
|
||
1. Podaj tytuły filmów *niskobudżetowych*.
|
||
|
||
`2. Podaj informacje o filmach `*`nowych`*`.`
|
||
|
||
Zaimplementuj rozwiązanie w postaci funkcji SQL.
|
||
|
||
(szkielet rozwiązania: <attachment:rozmyte_zapytania_2.sql>)
|
||
|
||
Odpowiedź bazy danych powinna być podobna do poniższych:
|
||
|
||
1. 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
|
||
|
||
1. Na potrzeby zamodelowania zbioru rozmytego należy wykorzystać wzór
|
||
na prostą przechodzącą przez dwa punkty (xa, ya) i (xb, yb):
|
||
|
||
```{=html}
|
||
<!-- -->
|
||
```
|
||
y - ya = (yb - ya)/(xb-xa) * (x-xa)
|
||
|
||
|
||
1. 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
|
||
|
||
|
||
1. 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.`
|
||
|
||
1. Do realizacji warunków w SQL służy dyrektywa case. Poniżej podano
|
||
przykład jej użycia:
|
||
|
||
```{=html}
|
||
<!-- -->
|
||
```
|
||
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: {#zadanie_4}
|
||
|
||
Zaimplementuj rozmyty operator \"około\".
|
||
|
||
Wykorzystaj go do odpowiedzi na zapytania:
|
||
|
||
1. Znajdź filmy trwające *około* 100 min
|
||
|
||
`2. Znajdź filmy powstałe `*`około`*` 2000 roku`
|
||
|
||
(szkielet rozwiązania: <attachment:rozmyte_zapytania_1.sql>)
|
||
|
||
### Zadanie 5: {#zadanie_5}
|
||
|
||
Korzystając z wyniku zadania 3 wyznacz stopień spełnienia nastepujących
|
||
warunków:
|
||
|
||
1. 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: {#zadanie_6}
|
||
|
||
Zaproponuj i zrealizuj mechanizm umożliwiający nieprecyzyjne
|
||
formułowanie zapytań o gatunki filmowe
|