SQLf
SQLf — это расширение языка SQL, применяющее методы теории нечётких множеств для выражения гибких (нечётких) запросов к традиционным (или «обычным») реляционным базам данных. Язык был предложен в 1990-х годах (одна из первых публикаций датируется 1994 годом) Патриком Боском и Оливье Пивером[1][2]. SQLf является академической концепцией, активная разработка которой прекратилась[3]. Язык не имеет нативной поддержки в современных коммерческих и open-source СУБД; на практике концепции подобных расширений были вытеснены встроенными функциями современных реляционных баз данных[4].
Описание
SQLf является одним из известных предложений системы гибких запросов (наряду с такими альтернативами, как FSQL и FQUERY), позволяющей применять лингвистическую квантификацию над множеством строк в запросах, реализуемую посредством расширения вложенных и разбиенных структур SQL с помощью нечётких квантификаторов[5]. Кроме того, SQLf разрешает использовать квантификаторы для задания количества критериев поиска, которыми должна обладать каждая отдельная строка. Для оценки запросов предложено несколько механизмов[6], наиболее важным из которых считается основанный на принципе t-сечения[7]. Он основан на построении классических запросов, которые по заданному порогу «t» формируют t-сечение результата нечёткого запроса, что снижает дополнительные вычислительные издержки применения нечёткого языка. Современные подходы к оценке и оптимизации нечётких запросов включают использование нечётких моделей затрат (fuzzy cost models), алгоритмов для обработки Top-k запросов (таких как Fagin's Algorithm и Threshold Algorithm), а также применение q-gram индексов[8][9].
Синтаксис и структура запросов
Фундаментальной структурой запроса в SQLf является мультиреляционный блок. Его построение основано на трёх базовых операциях реляционной алгебры: проекция, декартово произведение и выборка, а также на применении концепций нечётких множеств. Результатом запроса в SQLf выступает нечёткое множество строк, то есть нечёткая (fuzzy) реляция вместо обычной.
Базовый блок SQLf состоит из конструкции с обязательными частями SELECT, FROM и необязательной WHERE. Семантика данной структуры следующая:
- Клауза
SELECTсоответствует операции проекции. Она определяет атрибуты отношений (или выражения атрибутов), которые будут выбраны. Результирующая таблица — это нечёткое множество, упорядоченное по степени удовлетворения в убывающем порядке. - Клауза
SELECTтакже задаёт калибровку, позволяющую ограничить множество возвращаемых строк. Она задаётся с помощью конструкцииWITH CALIBRATION [k|α|k,α](или с использованиемnиλ). Различают два типа калибровки: количественную и качественную. При количественной калибровке (параметрkилиn) пользователь задаёт число результатов, которые должны быть получены, и тогда выбираются строки с наивысшими степенями принадлежности до указанного количества ответов. При качественной калибровке (качественный порогαилиλ) пользователь указывает минимальную степень удовлетворения, которой должна соответствовать каждая извлекаемая строка[3]. - Клауза
FROMсоответствует декартову произведению. Запрос выполняется над декартовым произведением отношений, указанных в этой части запроса. - Клауза
WHEREсовпадает с выборкой (селекцией). Она определяет условие, по которому рассчитывается степень удовлетворения. Строки, не удовлетворяющие условию, отбрасываются. Это условие формируется как нечёткий предикат, который может включать любые атрибуты отношений.
Пример запроса SELECT, возвращающего список отелей, которые являются «дешёвыми». Запрос выбирает все строки из таблицы Hotels, удовлетворяющие нечёткому предикату cheap, заданному нечётким множеством μ=(∞, ∞, 25, 30). Результат сортируется по убыванию степени принадлежности строки требуемому критерию.
SELECT name, address
FROM Hotels
WHERE price IS "cheap"<ref name="FuzzyQueriesBaseGroup">{{cite web |url=https://basegroup.ru/community/articles/fuzzylogic-queries |title=Нечеткие запросы к базам данных |website=BaseGroup |access-date=2026-05-28 }}</ref>;
Сравнение и современные альтернативы
SQLf занимает определённое место среди технологий нечётких баз данных, таких как FSQL и нечёткие объектно-ориентированные базы данных (FOOD). В отличие от FSQL, который работает с нечёткими базами данных, SQLf ориентирован на традиционные реляционные базы данных. Отличие от нечётких объектно-ориентированных баз данных (FOOD) заключается в том, что в FOOD неопределённость заложена в саму модель данных, а SQLf применяет нечёткую логику только на уровне запроса[5].
В современных системах управления базами данных (таких как PostgreSQL и SQL Server) вместо специализированных языков применяются встроенные функции и расширения для нечёткого сопоставления строк (например, pg_trgm, EDIT_DISTANCE)[4].[10]