## 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 : \|\|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: ) 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 ``` 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: ) ### 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