Fuzzy SQL Emanuel Buzek, 2.12.2014
Motivace Příklad: Zákazník si v eshopu s notebooky vybírá produkt… Přeje si: Levný Kamarád mu doporučil výrobce, třeba Acer Velký HDD Aspoň 4GB RAM
Motivace
Problém Zákazník většinou neví přesně, co hledá Přesné (striktní) podmínky člověku nepřipadají intuitivní
Motivace Jedná se o dotaz typu “Levné notebooky od Aceru co mají aspoň 4GB RAM a velký disk” Co znamená “levný” Třeba méně než 14 000Kč… Co znamená “velký” Třeba více než 400GB
Motivace Jak funguje BACKEND? Co třeba… SELECT * FROM produkty WHERE cena < 14000 AND hdd > 400 AND ram > 4 AND vyrobce LIKE ‘ACER’
Motivace Produkt RAM HDD Výrobce Cena A 8 GB 450 GB Asus 12000 B 4 GB Acer 13500 C 500 GB 14099
Motivace Produkt RAM HDD Výrobce Cena A 8 GB 450 GB Asus 12 000 B 4 GB Acer 13 500 C 500 GB 14 099 Náš SQL dotaz samozřejmě nevrátí produkty A a C…
Motivace Klasické striktkní booleovské (crisp) podmínky jsou často neintuitivní pro koncové uživatele Uživatel musí příliš rozšiřovat požadavky Např. zvýšit cenu na 20 000,- nebo nefiltrovat podle výrobce… Pro klasické DBMS platí záznam do množiny buď náleží nebo nenáleží podmínka je buď splněna, nebo ne
Cíl Chceme systém, který bude nad daty hledat více lidsky/intuitivně Systém by měl pracovat jazykové termíny jako levný, dobrý, spolehlivý… Systém by měl umět porovnávat pomocí Mnohem větší než >> Mnohem menší než << Systém by měl být obecný a brát v potaz existující technologie (relační DBMS a SQL)
Cíl Přáli bychom si provádět dotazy typu SELECT * FROM produkty WHERE cena JE levný hdd JE velký ram > 4 AND vyrobce POKUD MOŽNO ‘ACER%’
Další aplikace… eshopy Hledání podobných dokumentů Moderní webové aplikace – More Like This… Facebook – více podobných příspěvků… A samozřejmě Pandora, Grooveshark… Fulltext search (musí být trochu “fuzzy” – překlepy…)
Možné přístupy Nearest Neighbour Search (k-NN) Z metrik jednotlivých atribut se vytvoří k-rozměrný prostor Hledá se nejbližších n vektorů v tomto prostoru Metody: Space Partitioning, LSH Nevýhody: Space partitioning přestává být efektivní ve vyšších dimenzích… Operátor ~= (approximately equal to) Starý koncept (Chang, 80. léta) Nedostatečně obecné Např. Atribut “hubený” záleží na hmotnosti a velikosti… Těžko kombinovatelné do složitějších aritmetických výrazů
Fuzzy SQL
Řešení: Fuzzy SQL Idea: Rozšířit klasické DB (SQL) o fuzzy logiku Implementace Fuzzy SQL jsou většinou nádstavbou / rozšířením stávajících DBMS Výhody: Data už v nich stejně jsou SQL je známé odladěné vyspělé
Základ: fuzzy logika a množiny
Fuzzy logika Místo {0, 1} máme hodnoty v intervalu [0, 1] Přínos: NOT(A) = 1 – A A AND B = min(A, B) A OR B = max(A, B) Přínos: můžeme definovat další spojité funkce Jedná se o “organičtější” přístup – využití v UI
Fuzzy množiny Příslušnost prvku do množiny je odstupňovaná Fuzzy množina: (U, m) U je množina Funkce náležení m: U [0, 1] Pro každé hodnota m(x) je “stupeň příslušnosti”
Fuzzy x normální množiny Klasická teorie množin je pouze zjednodušenou formou, kde stupeň příslušnosti má hodnoty {0, 1}
Fuzzy množiny x plně náleží do (U, m) když m(x) = 1 x nenáleží do (U, m) když m(x) = 0
Fuzzy množiny
Fuzzy relační algebra a SQL
Fuzzy Querying Koncept z roku 1986 (P. Bosc) Úprava SQL serveru Fuzzy podmínka: Booleovské výrazy Transformace Alterace Interakce
Transformace Atributy Vysoký: Hubený: Porovnávání “mnohem vyšší než”:
Aleterace Aplikuje se na fuzzy množinu a změní ji Very, very much, few, more, less… very: not:
Interakce Vyjadřuje spojitost dvou fuzzy množin AND OR
Příklad FUZZY podmínky very tall and age around 40
Jaké použít funkce…? Jaké použít funkce? Dobrá otázka
SELECT SELECT n <atributy> FROM … WHERE fuzzy- podmínka Vybere n nejvíce vyhovujících SELECT t <atributy> FROM… WHERE fuzzy- podmínka Vybere záznamy splňující práh t
SELECT – jak to funguje SELECT se pak přeloží na SELECT <atributy><fuzzy-sub-podmínka> FROM … WHERE <crisp-sub-podmínka> Pokud fuzzy podmínka nejde rozdělit, tak se vlastně ani WHERE-clause nemusí generovat Funkce stupně příslušnosti se tedy vyhodnocuje na kartézském součinu všech relací, což je náročné PROBLÉM
fSQL Nádstavba nad existujícím SQL serverem Výhody: Spolehlivost Výkon Známá platforma Pracovalo na tom více autorů: Medina: FIRST Fuzzy Interface for Relational Systems Napsáno v PL/SQL nad Oraclem
fSQL – architektura Obecná architektura FSQL serveru podle Medina
fSQL – jazyk Fuzzy atributy: mají definovány štítky (labels), uloženy v FMB, prefixovány znakem $ Lineární doména: štítky mají asociovanou distribuci Např $drahý Non-lineární doména: štítky mají pouze definovaný vztah mezi sebou (skalár) Např $vlasy = [černé, blond, kaštanové]
fSQL – jazyk Fuzzy operátory na porovnávání Možnost (vrátí více záznamů, podmínka nemusí být splněna) Nutnost komparátor význam FEQ nebo F= FDIF nebo F!= Fuzzy equal to… Fuzzy different to… FGT nebo F > FGEQ nebo F>= Fuzzy greater than… Fuzzy greater than or equal to… FLT nebo F< FLEQ nebo F<= Fuzzy less than.. Fuzzy less than or equal to… FMG nebo F>> FLT nebo F<< Fuzzy much greater than… Fuzzy much less then… FINCL Fuzzy included in…
fSQL – jazyk Funkce CDEG: Práh / threshold “compatibility degree” – vrátí stupeň náležení pro daný fuzzy atribut Práh / threshold <condition> THOLD t Podmínka musí být splněna alespoň stupněm t
fSQL – jazyk Fuzzy konstanty Fuzzy kvantifikátory Fuzzy trapezoid $[a, b, c, d] Fuzzy číslo #n $label Fuzzy interval $[n,m] UNKNOWN, UNDEFINED Fuzzy kvantifikátory Relativní, absolutní Umožňují výrazy typu “všechny”, “některé”, “skoro všechny”…
fSQL – jazyk Příklad: SELECT * FROM Person WHERE hair FEQ $blond THOLD 0.5 AND height F>> $tall THOLD $high
fSQL – jazyk μAυB(x)=max(μA(x), μB(x)) μA B(x)=min(μA(x), μB(x)) Množinové relace: 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)))
fSQL – jazyk Vyhodnocení dotazu: Výsledná relace obsahuje údaj “stupně náležení” Jak se vypořádat s duplikáty? Narozdíl od duplikátů v crisp DB, záznamy mohou mít jiný stupeň náležení Možnosti: vrátit více řádků s duplikáty (SELECT) vrátit největší stupeň náležení (SELECT UNIQUE) vrátit nejmenší stupeň náležení (SELECT UNIMIN) vrátit průměr stupně náležení (SELECT UNIAVG)
fSQL – implemetace Nástroj FSQL_TO_SQL nad Oracle 8i Implementace v C++, GUI DDL (create/update table): Rozdělí se na dvě části: Aktualizace FMB (vytvoření / úprava atributů) Aktualizace klasické databáze Rozšíření CREATE LABEL CREATE NEARNESS DML (select/update/insert/delete) Přeloží se do SQL a spustí se
GEFRED model Generalized model Fuzzy heart Relational DB Medina et al., 1994 Obecná abstrakce Fuzzy atributy: Fuzzy množiny jako Fuzzy hodnoty Crisp Crsip & Fuzzy s distribucí (lichoběžníkovou) Diskrétní množiny s definovanou blízkostí Diskrétní množiny bez blízkosti Fuzzy stupně jako Fuzzy hodnoty Doména [0,1] Významově v podstatě “stupeň náležení”
Efektivní vyhodnocování Fuzzy JOINů Jak funguje operace JOIN?
JOIN operace Metody spojení: Hash join Merge join (slévání) Menší tabulka se rozdělí pomocí hashovací funkce Pro každý záznam z větší tabulky se hledá odpovídající záznam z menší tabulky Merge join (slévání) Obě tabulky se setřídí podle atributu, na kterém mergujeme Záznamy se postupně prochází (vzestupně nebo sestupně…) jako při merge-sort
JOIN operace Která metoda je lepší? Pro klasické (non-fuzzy DB) je většinou výhodnější Hash join Ale co Fuzzy DB? Co vlastně znamená JOINovat podle fuzzy atributu…?
Fuzzy Join Spojení R d(R.X=S.X) S Dvě relace: R, S Společný atribut X Záznam se ve výsledku objeví pokud d(R.X=S.X)>0
Fuzzy Join Příklad: join na atribut X - „věk“ r.X = $around(35) („kolem 35“) Dejme tomu interval [30,40] s.X = $young („mladý“) Interval [20,35] Narozdíl od „normálních“ joinů, výsledek může obsahovat záznam, kde X není shodné Předpoklad: fuzzy predikát lze spočítat v konstatním čase...
Fuzzy Join Hash join? Jak tedy joinovat? Nelze použít (aspoň ne přímo), protože dvě různé hodnoty budou mít různý hash, ale záznamy se stejně budou spojovat Z tohoto důvodu je u fuzzy DB složitější i indexování (o tom jindy :) Jak tedy joinovat?
Modifikovaný merge join Definice parciálního uspořádání: pro fuzzy term v: b(v): začátek intervalu e(v): konec intervalu pro crisp hodnotu: v = b(v) = e(v) Pořadí: v1 < v2 jestliže b(v1) < b(v2) nebo (b(v1)=b(v2) a (e(v1)<e(v2)) v1 v2 jestliže v1 < v2 nebo v1 v2 Příklad: [2,5] < [3,4] [3,4] < [3,5]
Modifikovaný merge join Definice: Pro záznam r z množiny R, sml(r) je nejmenší neprázdná hodnota v, která je v S.X lrg(r) je největší neprázdná hodnota v, která je v S.X Range: Rng(r) = {s : s in S and sml(r) s.X lrg(r)} Pokud s není v Rng(r), pak s se nemůže spojit (joinovat) s r
Modifikovaný merge join Záznamy z R jsou načítány do paměti podle definovaného částečného uspořádání Pro záznam r z R, všechny potenciálně vhodné záznamy jsou v Rng(r) Načítáme postupně stránky záznamů z S (podle uspořádání) Pokud stránka z S obsahuje pouze záznamy předcházející r, je zbytečná Pokud stránka z S obsahuje záznamy v Rng(r), provede se JOIN Pokud stránka z S obsahuje záznam za intervalem Rng(r), pokračujeme pro další záznam z r...
Modifikovaný merge join Paměťová náročnost Stránky z R a S se načítají pouze jednou, pokud se do paměti vejde 1 + max(P(Rng(r))) stránek P(Rng(r)) je velikost ve stránkách pro Rng(r) I/O náročnost SORT(R) + SORT(S) + P(R) + P(S)
FSQL – ano, nebo ne? V praxi relativně málo časté Konfiguračně náročné Setkali jste se? Konfiguračně náročné Administrátor musí nakonfigurovat atributy a jejich distribuční funkce (FMB) Jak by vypadala například distribuční funkce pro $drahý? Jak tuto funkci vytvořit obecně - automaticky? Problém s výkonem a škálováním… SQL je příliš schopné! JOINy, agregace, vnořené SELECTy…
FSQL – ano, nebo ne? Uživatelské rozhraní Jak zvolíme prahové hodnoty t? Uživatel by si je mohl vybrat sám Můžeme si být jisti, že uživatel chce hledat “fuzzy”? Co když vlastně chce třeba všechny výrobky kromě Aceru, ale on stejně ve výsledcích jeden najde…
Současnost a budoucnost Podporují současné DBMS fuzzy dotazování? Částečně, určitě ne kompletní FSQL MySQL fulltext search Alternativa: Fuzzy NoSQL :D Lucene/Solr/ElasticSearch… FuzzyQuery v ElasticSearch Levenshtein distance na stringy, intervaly na čísla a datumy moreLikeThis query na nalezení podobných dokumentů
Zdroje P. Bosc, M. Galibourg, G. Hamon: Fuzzy querying with SQL: Extensions and implementation aspects F. Hao, H. Dougman, P. Zielinsky: A Fast Search Algorithm for a Large Fuzzy Database Q. Yang, C. Lie, J. Wu: Efficient Processing of Nested Fuzzy SQL Queries