3
1
dydaktyka/chris/MIN_2017/Zajecia_5.md

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:

  1. 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:

  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):
<!-- -->
 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:
<!-- -->
 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:

  1. 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:

  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:

Zaproponuj i zrealizuj mechanizm umożliwiający nieprecyzyjne formułowanie zapytań o gatunki filmowe