Fuzzy SQL Jaroslav Tykal, Jiří Dokulil
Proč Fuzzy Přesné vs. „nepřesné“ hodnoty Kdo má nejvyšší plat Kdo má vysoký plat Výhody přesnosti Jednoznačná odpověď na zadanou otázku Nevýhody přesnosti Odpověď právě na to, na co jsme se ptali
Příklad Máme Databáze studentů a jejich studijní průměry Hledáme Dobré studenty (studenti s průměrem >= 3.5) Dotaz SELECT * FROM STUDENTS WHERE GPA >= 3.5;
Příklad – modifikace Máme Databáze studentů a jejich studijní průměry Záznamy o absenci studentů Hledáme Dobré studenty („dobrý student“ je student, který má GPA >= 3.5 a počet zameškaných dnů < 10) Dotaz SELECT * FROM STUDENTS WHERE GPA >= 3.5 AND ABSENCES < 10;
Výsledek dotazu
Příklad Dále požadujeme Setřídit tyto studenty od nejlepšího k nejhoršímu. Zvolíme třízení podle průměru sestupně a podle absencí vzestupně. Dotaz SELECT * FROM STUDENTS WHERE (GPA >= 3.5) AND (ABSENCES < 10) ORDER BY GPA DESC, ABSENCES ASC;
Výsledek dotazu
Nevýhody řešení Ne zcela vyhovující řazení studentů. Student Barry Allen má o málo horší průměr než Billy Kidd. Billy Kidd má však o mnoho horší docházku než Barry Allen. Který z nich je však lepší student? Ne zcela vyhovující seznam studentů Seznam neobsahuje studenty, kteří mají studijní průměr 3.49, ale žádnou absenci. Seznam neobsahuje studenta, který má studijní průměr 4.00 a má 10 absencí.
Cíl Definovat způsob který využije atributy GPA a ABSENCES s jejich pomocí vytvořit hodnotu, která bude vyjadřovat „dobrého studenta“ hodnota „dobrý student“ lépe vyjadřuje naší představu o dobrém studentovi
Fuzzy množiny Základní pojmy Množina – výraz (např. „dobrý prospěch“), který určuje nějakou vlastnost. Stupeň náležení – do množiny může daný prvek patřit do dané množiny. Nabývá hodnot. Funkce příslušnosti – pro daný prvek vrací hodnotu stupeň náležení. Příklad Studenti s průměrem 4.0 budou patřit do skupiny výborný prospěch se stupněm 1. Studenti s průměrem 3.01 budou patřit do skupiny výborný prospěch se stupněm blízkým k nule.
Upravený dotaz Definujeme množiny Dobrý prospěch Minimální hodnota pro náležení do množiny: 3.0 Maximální hodnota pro náležení do množiny: 4.0 Tvar křivky: klasické S Dobrá absence Minimální hodnota: 0 Maximální hodnota: 13 Alpha Cut: 0.1 Tvar křivky: směr klesajícího S
Funkce příslušnosti Pro „dobrý prospěch“
Funkce příslušnosti Pro „dobrou absenci“
Dotaz pomocí Fuzzy množin Dotaz SELECT * FROM STUDENTS WHERE (GPA is „Dobrý prospěch“) and (ABSENCES is „Dobrá absence“) Výsledek studenti, kteří patří do množiny „dobrý student“ ve výsledku je sloupec, jehož hodnoty označují stupeň náležení do „dobrý student“
Dotaz pomocí Fuzzy množin
Poznámky Řazení podle náležení do skupiny „dobrý student“ více odpovídá naší představě o výsledku dotazu. Studenti, kteří jsou si bližší ve smyslu být „dobrý student“, jsou vedle sebe. Ve výsledku jsou i studenti, kteří mají horší průměr i velkou absenci. Tito studenti však mají nízkou hodnotu náležení do skupiny a proto nemá smysl je považovat za „dobré studenty“.
Aplikace v e-business Problém prohledávání elektronických katalogů zboží Tradiční relační databáze podporují vyhledávání na základě přesných podmínek Jsou vráceny právě výrobky přesně odpovídající zadané podmínce Zákazník se většinou zeptá „špatně“ Příliš nepřesná podmínka vracející obrovský počet záznamů Příliš detailní specifikace (ovespecification), která nic nevrátí Nejasná představa zákazníka Neví, jak přesně popsat, co chce Má o tom jen nejasnou představu „Mělo by to stát něco pod 1500“ Má to být celkem malé
„Lepší“ přístupy Nearest-Neighbour Metriky pro jednotlivé atributy, sloučeny váženým způsobem do výsledné podobnosti k-NN algoritmus vrátí k nejpodobnějších Fuzzy Místo vzdálenosti používá přijatelnost (acceptance) Přijatelnost má obvykle tvar nějaké fuzzy distribuce Kombinace lokálních přijatelností probíhá pomocí fuzzy operátorů, tedy má bohatší možnosti než NN. Výsledná hodnota přijatelnosti určí, jestli má být výrobek zobrazen zákazníkovi Umožňuje přiřadit výrobkům fuzzy atributy
Jeden konkrétní systém Cíle Využití existujících relačních databází Data už v nich bývají uložena Jsou již dobře zažité, odladěné a vyspělé Umožní mimo jiné efektivní práci nad velmi rozsáhlými daty Při použití rozšíření jazyka SQL bude možné dotazy v něm zapsané převést na běžné SQL, které tak bude efektivně vyhodnoceno Jazyk fSQL
Architektura systému
Reprezentace dat Atributy výrobků jsou uloženy v relační databázi, takže jsou „normální“, tedy ne fuzzy množiny Nad nimi jsou definovány fuzzy predikáty Fuzzy predikát nad spojitou doménou Fuzzy predikát nad diskrétní doménou Spojitá distribuce nad uspořádanou doménou Diskrétní distribuce nad neuspořádanou množinou Nad těmito predikáty můžou být definovány fuzzy operátory Spojité fuzzy operátory Spojitá fuzzy distribuce nad funkcí operandů (např. jejich rozdílem) Diskrétní fuzzy operátory Podobnost definovaná pomocí matice podobnosti
Dotazy Z fuzzy predikátů a operátorů je pomocí logických spojek vytvořena podmínka WHERE. Je používána fuzzy implementace logických spojek Výsledný dotaz vypadá takto: SELECT A FROM R WHERE fc
Spojky Negace Realizováno jako doplněk do jedné μ not A (x)=1-μ A (x) Konjunkce Minimum z obou ohodnocení μ A۸B (x)=min(μ A (x), μ B (x)) Disjunkce Maximum z obou ohodnocení μ A٧B (x)=max(μ A (x), μ B (x))
Výsledek dotazu SELECT A FROM R WHERE fc Výsledkem dotazu je fuzzy relace Rf, ke které je přiřazena funkce příslušnosti (membership function) určující, jak jednotlivé řádky výsledku odpovídají podmínce fc. μ Rf (a)=sup (xєR)۸(x.A=a) μ fc (x) Význam: Projekce na sloupce A může způsobit, že jeden řádek výsledku vznikne z více řádků R. Takovému řádku je přidělena největší hodnota členství ze všech odpovídajících řádků R
Vyhodnocení dotazu Dotazy chceme vyhodnocovat pomocí relační databáze, je tedy nutné převést fuzzy relaci na běžnou relaci Provedeme λ-řez, tedy vezmeme ty n- tice z Rf, pro které je μ Rf (a)≥ λ SELECT (λ)A FROM R WHERE fc
λ-řez Aplikace λ-řezu na různé fuzzy distribuce (a) definice predikátu ‘vysoký’ nad cenou produktu (b) definice predikátu ‘mnohem menší’ nad rozdílem dvou atributů
λ-řez v číslech Vezměme fuzzy podmínku C a D(C) její fuzzy stupeň Pak lze provádět úpravy výrazu D(cena=vysoká ۸ délka « 100)≥0,8 min(D(cena=vysoká),D(délka « 100)) ≥0,8 D(cena=vysoká)≥0,8 ۸ D(délka « 100) ≥0,8 (110≤cena≤180) ۸ (délka – 100) ≤ -18 Tuto podmínku lze již snadno přeložit do SQL
Konkrétní příklad Obchod s vínem REGION (jméno_regionu, země) PRODUCENT (jméno_prod, adresa_prod, _prod, web_prod, jméno_regionu) TYP_VÍNA (jméno_typu, typ, barva) VÍNO (jméno_vína, jméno_prod, jméno_typu, jméno_regionu, kategorie, cru) LÁHEV (jméno_vína, jméno_prod, rok, dostupnost, cena) Cizí klíče jsou PRODUCENT: foreign key (jméno_regionu) references REGION(jméno_regionu) VÍNO: foreign key (jméno_prod) references PRODUCENT(jméno_prod) VÍNO: foreign key (jméno_typu) references TYP_VÍNA(jméno_typu) VÍNO: foreign key (jméno_regionu) references REGION(jméno_regionu) LÁHEV: foreign key (jméno_vína,jméno_prod) references VÍNO(jméno_vína, jméno_prod)
Konkrétní příklad – pokračování Tyto tabulky jsou strukturované tak, jak to odpovídá relačním databázím Zvolená implementace fuzzy dotazů si však lépe poradí, když je to vše pohromadě CREATE VIEW PRODUKT (jméno_vína, rok, jméno_prod, cena, jméno_typu, barva, kategorie, jméno_regionu, věk) AS SELECT L.jméno_vína, L.rok, L.jméno_prod, L.cena, TV.jméno_typu, TV.typ, TV.barva, V.kategorie, V.jméno_regionu, ($CURRENT_YEAR-L.rok) FROM LÁHEV L, VÍNO V, TYP_VÍNA TV WHERE V.jméno_typu=TV.jméno_typu AND L.jméno_vína=V.jméno_vína
Konkrétní příklad - fuzzy Dále definujeme fuzzy operátor podobnosti nad REGION.jméno_regionu a TYP_VÍNA.jméno_typu, které elegantně reprezentují to, že některé druhy vín a oblasti jsou si podobné Definujeme také některé fuzzy predikáty Položka tabulkyFuzzy hodnoty PRODUCENT.jméno_prodnorm_důležitost, vyská_důležitost TYP_VÍNA.jméno_typunorm_důležitost, vyská_důležitost REGION.jméno_regionunorm_důležitost, vyská_důležitost LÁHEV.věkmladé, střední, staré LÁHEV.cenavelmi levné, levné, střední, drahé, velmi drahé Nakonec ještě definujeme z dřívějška známý operátor mnohem menší než «p nad LÁHEV.cena
Konkrétní příklad – zadání dotazu Dejme tomu, že zákazník hledá mladé červené víno od významného výrobce za středí cenu, která je mnohem menší než €40 a má podobné charakteristiky jako víno z Bordeaux. Zákazník v nějakém formuláři určí tyto požadavky. Dále je potřeba určit hodnotu λ.
Konkrétní příklad – vytvoření fSQL dotazu Vezmeme-li, že byla zvolena hodnota λ=0.8 dostaneme tento dotaz: SELECT (0.8) * FROM PRODUKT, REGION WHERE (PRODUKT.jméno_regionu=REGION.jméno_regionu) AND (PRODUKT.jméno_regionu |sim| ‘Bordeaux’) AND (PRODUKT.jméno_prod={vyská_důležitost}) AND (PRODUKT.cena=[střední]) AND (PRODUKT.cena «p 40) AND (PRODUKT.věk=[mladé]) AND (PRODUKT.barva=‘červené’)
Konkrétní příklad – převod na SQL Máme určenou hodnotu λ=0.8, takže si můžeme znázornit distribuce pro cenu a věk
Konkrétní příklad – převod na SQL - pokračování Dostáváme SQL dotaz SELECT * FROM PRODUKT, REGION WHERE (PRODUKT.jméno_regionu=REGION.jméno_regionu) AND (PRODUKT.jméno_regionu IN (‘Bordeaux’, ‘Jihozápad’)) AND (PRODUKT.jméno_prod IN (‘prod1’, ‘prod2’,… ‘prodN’) AND (PRODUKT.cena BETWEEN 19 AND 31.5) AND (PRODUKT.CENA – 40 <= -18) AND (PRODUKT.věk BETWEEN 0 and 2) AND (PRODUKT.barva=‘červené’) prod1, prod2, … prodN jsou právě jména producentů, kteří mají míru příslušnosti do množiny vyská_důležitost větší než 0.8 Bordeaux a Jihozápad jsou jediné regiony, jejichž míra podobnosti s Bordeaux je větší než 0.8
Jiné implementace fuzzy SQL Samozřejmě existují i jiné možnosti, jak přidat fuzzy logiku do SQL Základ bývá stejný, ale pokročilejší funkce různé Podívejme se na některé zajímavější rozšíření
Úvodem pár drobností Protože každému řádku výsledku je přiřazena míra splnění podmínky, lze snadno místo λ- řezu vracet n nejlepších kandidátů Nad fuzzy podmínkami lze užívat další modifikátory (alteration) very podmínka (x)=(μ podmínka (x)) 2 not podmínka (x)=1-μ podmínka (x) Agregační funkce – protože fuzzy relace je nakonec převedena na běžnou relaci, není problém na ní pak pustit normální agregační funkce
Množinové operace nad fuzzy relacemi union μ AυB (x)=max(μ A (x), μ B (x)) intesect μ A B (x)=min(μ A (x), μ B (x)) except μ A-B (x)= μ A B (x)=min(μ A (x),(1-μ B (x))) υ υ
group by a having V jedné z implementací bylo umožněno i použití group by a fuzzy podmínky having, ovšem pak podmínka za where musela být klasická. SELECT 10 číslo_oddělení FROM zaměstnanci WHERE zařazení=‘účetní’ GROUP BY číslo_oddělení HAVING around(avg(plat+bonus),1000) oddělení, ve kterých účetní berou plat kolem 1000
Řešní „kolizí“ při projekci Už dříve jsme narazili na problém, že jeden řádek výsledné fuzzy relace může vzniknout díky projekci na vybrané atributy z více řádků, které mají různou míru splnění fuzzy podmínky. Situaci lze řešit různě neřešit a vrátit více řádků (SELECT …) vrátit největší míru splnění (SELECT unique …) vrátit nejmenší míru splnění (SELECT unimin …) vrátit průměr měr (SELECT uniavg …)
Neúplná informace Mějme doménu atributu D, pak definujeme Unknown={1/d : dєD} Undefined={0/d : dєD} NULL={1/Unknown, 1/Undefined} Poznámka ke značení: a/b znamená, že b náleží do množiny se stupněm a
Fuzzy operátory porovnání Mimo klasických operátorů porovnání jako =,>,≥,… lze definovat i fuzzy verze Navíc je možné uvažovat dvě možnosti porovnání na možnost porovnání na nutnost Porovnání na možnost je volnější (porovnání na nutnost vrací méně n-tic) Příklad pro rovnost; U je doména, nad kterou je postavena fuzzy doména D, což je doména atributů A a B možná rovnost je definována jako μ A FEQ B (x)=sup min(μ d (x[A]), μ d (x[B])) nutná rovnost jako μ A NFEQ B (x)=inf max(1 – μ d (x[A]), μ d (x[B])) dєUdєU dєUdєU
Efektivní zpracování vnořených Fuzzy SQL dotazů
Fuzzy spojení Značení = zkoumá podobnost predikátů a vrací hodnotu z zkoumá identitu a vrací hodnoty 0 nebo 1 Spojení R R.X=S.X S R, S relace X atribut, který může být hodnota nebo výraz pro fuzzy množinu Pro libovolné r z R a s z S může být stupeň R.X = S.X, tj. d(r.X = s.X), mezi 0 a 1. Dvojice je generována pokud d(…) > 0.
Fuzzy spojení Příklad r.X = „kolem 30 let“, s.X „mladý“ Osoby reprezentované r a s tedy mohou mít stejný věk pokud se provádí spojení pouze s touto podmínkou, pak stupeň náležení bude min( R (r), S (s), d(r.X = s.X))
Klasické metody pro spojení Spojení hašováním využívá rozdělení menší tabulky na skupiny (pomocí hašovací funkce) bere záznamy z větší tabulky a pomocí hašovací funkce se snaží najít záznam z menší tabulky efektivní metoda u klasického SQL, příliš se však nehodí pro Fuzzy SQL Spojení sléváním spojení tabulek podle sloupce, podle kterého jsou obě tabulky řazeny modifikovaný algoritmus použijeme i pro spojení Fuzzy SQL
Částečné uspořádání fuzzy množina v reprezentuje interval [b(v), e(v)] b(v) – začátek intervalu, e(v) – konec intervalu jedna hodnota je definována b(v)=e(v)=v pro n-tice r z R, s z S a X použijeme r.X a s.X k určení jejich fuzzy hodnoty. r.X s.X reprezentuje obvyklý množinový průnik
Částečné uspořádání Definice pro dvě hodnoty v1 a v2 definujeme v1 < v2 jestliže (b(v1) < b(v2)) || ((b(v1)=b(v2)) && (e(v1)<e(v2))) v1 v2 jestliže v1 < v2 && v1 v2 pro n-tice r1 a r2 definujeme r1 < r2 jestliže (r1.X < r2.X) r1 r2 jestliže r1.X r2.X
Spojení sléváním - Fuzzy SQL pomocí definovaného uspořádání můžeme získat setřízené záznamy definice pomocných funkcí pro n-tici r z R e sml(r) nejmenší hodnota v taková, která je v S.X a r.X v a lrg(r) je největší hodnota v, která je v S.X a r.X v rozsah n-tice Rng(r) = {s:s S a sml(r) s.X lrg(r)}, Rng(r) = jestliže r.X v pro všechna v v S.X pokud nebude s v Rng(r), pak je d(r.X = s.X) = 0
Spojení sléváním - Fuzzy SQL Průběh načte se jedna stránka s n-ticemi r do paměti pro každé r se berou všechna s z S, na které lze provést spojení s R (tj. s je v Rng(r)) s jsou také seřazeny a načítány postupně Časová složitost záznamy jsou načítány a slévány postupně časová složitost je lineární vzhledem k většímu počtu záznamů (stránek pro uložení záznamů)
Implementace dotazů Vybrané typy SQL dotazů Typ [A]gregate Typ [J]oin Typ [N]ot join Typ [JA] – Join, Agregate Rozdělení na typy převzato z W.Kim, On Optimizing an SQL-Like Nested Query
Typ A - Agregate Jak vypadá vnitřní dotaz neobsahuje podmínku na spojení tabulek a obsahuje agregační funkci na sloupečky z vnějšího dotazu vnitřní dotaz může být vyhodnocen samostatně, do vnějšího se dosadí vypočítaná hodnota SELECT SNO FROM SHIPMENT WHERE PNO = (SELECT MAX(PNO) FROM PART WHERE PRICE > 25)
Typ N – Not Join Jak vypadá vnitřní dotaz neobsahuje podmínku na spojení tabulek a neobsahuje agregační funkci na sloupečky z vnějšího dotazu výsledkem vnitřního dotazu je množina konstant vnitřní dotaz může být vyhodnocen samostatně SELECT SNO FROM SHIPMENT WHERE PNO IS IN ( SELECT PNO FROM PART WHERE PRICE > 25 )
Typ J - Join Jak vypadá vnitřní dotaz obsahuje podmínku na spojení tabulek a neobsahuje agregační funkci na sloupečky z vnějšího dotazu vnitřní dotaz nemůže být vyhodnocen samostatně SELECT SNO FROM SHIPMENT WHERE PNO IS IN ( SELECT PNO FROM PROJECT WHERE SHIPMENT SNO = PROJECT.SNO AND LOCATION = „New York“)
Typ JA – Join, Agregate Jak vypadá vnitřní dotaz může obsahovat podmínku na spojení tabulek a obsahuje agregační funkci na sloupečky z vnějšího dotazu
Typ N – implementace Fuzzy Dotaz SELECT R.X FROM R WHERE p1 AND R.Y is in (SELECT S.Z FROM S where p2) Zpracování vnitřní dotaz může být zpracován nezávisle stupeň náležení každé nalezené hodnoty vnitřního dotazu je roven min( S (s), d(p2)) pokud jsou ve výsledku duplicity, pak jsou zrušeny a u hodnoty je ponechána vždy nejvyšší hodnota náležení
Typ N – implementace Fuzzy Dotaz SELECT R.X FROM R WHERE p1 AND R.Y is in (SELECT S.Z FROM S where p2) Jiné zpracování převede se na ekvivalentní dotaz: SELECT R.X FROM R, S WHERE p1 AND R.Y = S.Z AND p2 R se setřídí podle R.Y a S podle S.Z a provede se modifikované spojení sléváním stupeň náležení je pak min( S (s), R (r), d(p1), d(p2), d(r.Y=s.Z))
Typ J – implementace Fuzzy Dotaz SELECT R.X FROM R WHERE p1 AND R.Y is in (SELECT S.Z FROM S where p2 AND S.V=R.U) Zpracování převede se na ekvivalentní dotaz: SELECT R.X FROM R, S WHERE p1 AND p2 AND R.Y = S.Z AND S.V = R.U setřídí se R a S a provede se modifikované spojení sléváním stupeň náležení je pak min( S (s), R (r), d(p1), d(p2), d(r.Y=s.Z), d(s.V=r.U))
Typ JX – implementace Fuzzy Dotaz SELECT R.X FROM R WHERE R.Y is not in (SELECT S.Z FROM S where S.V=R.U) Zpracování převede se na ekvivalentní dotaz: SELECT R.X, MIN(D) FROM R, S WHERE R (r) AND ( S (s) AND R.Y = S.Z AND S.V = R.U) WITH D 0 GROUP BY R.K R.K je klíč R, D je spočtená hodnota náležení ve výsledku mohou být duplicity při odstranění duplicit pomocí distinct se bere max MIN(D)
Typ JA – implementace Fuzzy Dotaz SELECT R.X FROM R WHERE p1 AND R.Y op1 (SELECT AGG(S.Z) FROM S WHERE p2 AND S.V op2 R.U) Značení AGG – agregační funkce op1 a op2 operátory (, >=, <=, =)
Typ JA – implementace Přepíšeme pomocí dvou temporálních relací T1 = SELECT R.U from R WHERE p1 T2 = SELECT T1.U, AGG(S.Z) FROM T1, S WHERE p2 AND S.V op2 T1.U GROUBY T1.U Výsledek SELECT R.X FROM R, T2 WHERE p1 AND R.U T2.U AND R.Y op1 T2.A Pokud je agregační funkce COUNT, pak je výsledek: SELECT R.X FROM R, T2 WHERE p1 AND R.U + T2.U
Zdroje P. Bosc, M. Galibourg, G. Hamon: Fuzzy querying with SQL: Extensions and implementation aspects Luigi Portinale, Stefania Montani: A fuzzy case retrieval approach based on SQL for implementing electronic catalogs José Galindo, Juan M. Medina, Olga Pons, Juan C. Cubero: A server for fuzzy SQL Queries Qi Yang, Chengwen Liu, Jing Wu, Clement Yu, Son Dao, Hiroshi Nakajima: Efficient processing of nested fuzzy SQL queries