Статья опубликована в рамках: XVIII Международной научно-практической конференции «Научное сообщество студентов: МЕЖДИСЦИПЛИНАРНЫЕ ИССЛЕДОВАНИЯ» (Россия, г. Новосибирск, 03 апреля 2017 г.)
Наука: Информационные технологии
Скачать книгу(-и): Сборник статей конференции
отправлен участнику
РЕАЛИЗАЦИЯ НЕЧЕТКИХ ЗАПРОСОВ НА ЯЗЫКЕ SQL ДЛЯ РЕЛЯЦИОННЫХ БАЗ ДАННЫХ
Запросы к базам данных - это один из основных инструментов выборки, обновления и обработки данных в таблицах базы данных. Запрос формирует пользовательское представление о данных, не обязательно отвечающее требованиям нормализации. Результат выполнения запроса — это новая, чаще всего временная, таблица, которая существует до закрытия запроса. Рассмотрим 2 группы пользовательских запросов, которые создаются на естественном языке: это детерминированные и нечеткие запросы.
Известно, что формализованное представление информационных ресурсов для повышения удобства их хранения и поиска осуществляется при организации их в информационных базах. Именно базы данных используются для хранения электронных информационных ресурсов в упорядоченной и схематизированной форме, что даёт возможность пользователям при помощи запросов найти нужную информацию и провести дальнейшую их обработку.
Но всегда ли пользователи получают запрашиваемые ими данные в полном объеме с помощью запросов в реляционных базах данных? Для ответа на этот вопрос проанализируем пользовательские запросы наглядно.
Воспользуемся примером из [2].
Пусть «Cars» это реляционная база данных, которая содержит в себе таблицу, основными полями которой являются «Model», «Price» и «Engine_Power»:
Таблица 1.
Пример таблицы из базы данных «Cars».
Model |
Price |
Engine_Power |
А |
750000 |
99 |
В |
383400 |
112 |
C |
512 500 |
125 |
D |
155000 |
65 |
E |
985000 |
175 |
F |
210000 |
78 |
1. Детерминированные запросы. Данные запросы, как правило, состоят из точных терминов и булевых операторов. Поиск по этим запросам ведется путем выбора подходящих данных из реляционной базы данных. К примеру, необходимо выполнить запрос "Получить список мощных, но приемлемых по цене автомобилей" (основываясь по Таблице 1). Формализуем этот запрос для того чтобы выполнить его на языке SQL. В этом запросе появятся конкретные числовые значения, достаточно субъективно определяющие понятия "мощный" и "приемлемый по цене". Наглядно такой запрос может выглядеть таким образом:
SELECT* FROM CARS
WHERE CARS.PRICE <=500 AND CARS.ENGINE_POWER >120;
Данный запрос не даст результатов, хотя автомобили марок «B» и «C» почти удовлетворяют условиям запроса.
2. Нечеткие запросы. Математический аппарат нечеткой логики в запросах к базам данных был подробно рассмотрен в [2], поэтому приведем пример реализации.
Для внедрения на практике можно воспользоваться теорией нечетких множеств и его понятием «лингвистическая переменная» [2] для определения адекватных значений нечетких запросов.
Реализуем выполнение запроса на языке SQL. Для этого, как и в [2] зададим лингвистические термы для переменных "цена" и "мощность двигателя", а также построим функции принадлежности для лингвистических термов. Функции принадлежности выберем z-образного, трапецеидального и s-образного вида. Параметры функций принадлежности для переменной "цена": «Низкая» = [250, 300], «Средняя» = [250, 350, 500, 600], «Высокая» = [500, 650]. Для переменной "мощность двигателя": «Очень малая» = [50, 55], «Малая» = [50, 55, 60, 70], «Средняя» =[60, 70, 100, 120], «Большая» = [110, 120].
Рисунок 1. Вид функции принадлежности для лингвистической переменной «цена».
Рисунок 2. Вид функции принадлежности для лингвистической переменной мощность.
Создадим дополнительные таблицы для хранения в них значений функции принадлежности параметров каждого автомобиля к каждому определенному множеству [1].
CREATE TABLE CarsPower (Mark VARCHAR2(30), O4Mal NUMBER, Mal NUMBER, Sred NUMBER, Bolsh NUMBER);
CREATE TABLE CarsPrice (Mark VARCHAR2(30), Nizk NUMBER, Sredn NUMBER, Vsok NUMBER);
Создадим триггер, автоматически срабатывающий при добавлении или изменении записи в главную таблицу "Cars", вызывающий процедуры, высчитывающие и заносящие в таблицу значения функций принадлежности [1].
CREATE OR REPLACE TRIGGER AutoIns BEFORE INSERT OR UPDATE ON Cars
FOR EACH ROW
BEGIN
ADD_CarsPrice(:NEW.Mark, :NEW.Price);
ADD_CARSPOWER(:NEW.Mark, :NEW.Engine_Power);
END AutoIns;
CREATE OR REPLACE PROCEDURE ADD_CarsPrice(NewMark VARCHAR2, NewPrice NUMBER) IS
N NUMBER := 0;
S NUMBER := 0;
V NUMBER := 0;
BEGIN
IF NewPrice BETWEEN 0 AND 300 THEN
IF NewPrice < 250 THEN N:=1;
END IF;
IF NewPrice > 250 THEN N:=(300-NewPrice)/50;
END IF;
END IF;
IF NewPrice BETWEEN 250 AND 600 THEN
IF NewPrice BETWEEN 250 AND 350 THEN S:=(NewPrice-250)/100;
END IF;
IF NewPrice BETWEEN 350 AND 500 THEN S:=1;
END IF;
IF NewPrice BETWEEN 500 AND 600 THEN S:=(600-NewPrice)/100;
END IF;
END IF;
IF NewPrice > 500 THEN
IF NewPrice BETWEEN 500 AND 650 THEN V:=(NewPrice-500)/150;
END IF;
IF NewPrice > 650 THEN V:=1;
END IF;
END IF;
INSERT INTO CarsPrice(MARK, NIZK, SREDN, VSOK) VALUES (NewMark, N, S, V);
END ADD_CarsPrice;
CREATE OR REPLACE PROCEDURE ADD_CarsPower(NewMark VARCHAR2, NewPower NUMBER) IS
OM NUMBER := 0;
M NUMBER := 0;
S NUMBER := 0;
B NUMBER := 0;
BEGIN
IF NewPower BETWEEN 0 AND 55 THEN
IF NewPower < 50 THEN OM:=1;
END IF;
IF NewPower > 50 THEN OM:=(55-NewPower)/5;
END IF;
END IF;
IF NewPower BETWEEN 50 AND 70 THEN
IF NewPower BETWEEN 50 AND 55 THEN M:=(NewPower-50)/5;
END IF;
IF NewPower BETWEEN 55 AND 60 THEN M:=1;
END IF;
IF NewPower BETWEEN 60 AND 70 THEN M:=(70-NewPower)/10;
END IF;
END IF;
IF NewPower BETWEEN 60 AND 120 THEN
IF NewPower BETWEEN 60 AND 70 THEN S:=(NewPower-60)/10;
END IF;
IF NewPower BETWEEN 70 AND 100 THEN S:=1;
END IF;
IF NewPower BETWEEN 100 AND 120 THEN S:=(120-NewPower)/20;
END IF;
END IF;
IF NewPower > 110 THEN
IF NewPower BETWEEN 110 AND 120 THEN B:=(NewPower-110)/10;
END IF;
IF NewPower > 120 THEN B:=1;
END IF;
END IF;
INSERT INTO CarsPower(MARK, O4MAL, MAL, SRED, BOLSH) VALUES (NewMark, OM, M, S, B);
END ADD_CARSPOWER;
Теперь к таблице "Cars" можно формулировать естественные запросы на формализованном языке, не боясь потерять нужные данные, так как сложные запросы будут рассматриваться как логическое пересечение нечетких множеств, соответствующих отдельному подзапросу. Продемонстрируем это. Для удобства, создадим представление ViewCar [1], объединяющее в себе три полученных выше таблицы. Выполним к нему запрос, схожий по смыслу с детерминированным запросом, выполненным выше: "автомобиль со средней ценой и большой мощностью двигателя". Не составит большого труда создание процедуры, переводящей лингвистические термы в язык терминов SQL, определенных в данной схеме базы данных. В результате запрос на языке SQL в рамках реализованной нечеткой логики будет выглядеть так:
SELECT MARK, PRICE, ENGINE_POWER FROM ViewCar
WHERE PRICE=’СРЕДНЯЯ’ AND ENGINE_POWER=’БОЛЬШАЯ’;
В результате получим потерянные в детерминированном запросе данные:
Таблица 2
Результат запроса.
Таким образом, к данной таблице могут выполняться любые запросы, основанные на недетерминированных терминах.
Подобным образом при проектировании базы данных несложно реализовать любые запросы на естественном языке. Неоднозначность определения функции принадлежности для различных лингвистических переменных к множествам может быть устранена на основе статистических данных субъектов-пользователей базы дынных или на основе экспертных оценок.
Заключение
Итак, в данной работе были рассмотрены различные варианты запросов к реляционным базам данных на языке SQL, которые подразделяются на детерминированные и нечеткие. Для реализации нечетких запросов к базам данных требуется время и дополнительная память, однако они заметно сокращают время неавтоматизированного перебора данных пользователями для получения необходимой информации. Обработка таких запросов в конечном итоге приводит к интеллектуальному поиску, когда точные атрибуты запроса неизвестны или неопределенны. Это значительно упрощает работу с большими объемами различных данных для пользователей.
Список литературы:
- Кузнецов, С. Базы данных. Вводный курс. [Электронный ресурс]. — Режим доступа. — URL: http://citforum.ru/database/advanced_intro/ (дата обращения 01.04.17)
- Тимофеева О.В., Каньшин Е.А. ПРИМЕНЕНИЕ НЕЧЕТКОЙ ЛОГИКИ В ЗАПРОСАХ К БАЗАМ ДАННЫХ // Научное сообщество студентов XXI столетия. ТЕХНИЧЕСКИЕ НАУКИ: сб. ст. по мат. XLI междунар. студ. науч.-практ. конф. № 4(40).
отправлен участнику
Оставить комментарий