2021-10-04 17:31:55 +02:00
|
|
|
|
> Strona automatycznie zmigrowana z systemu Eduwiki z wykorzystaniem Pandoc
|
2021-10-04 16:58:37 +02:00
|
|
|
|
|
|
|
|
|
## 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
|