Разработка языка запросов в бинарной модели знаний и транслятора этого языка в язык SQL (бакалаврская работа) (544460), страница 9
Текст из файла (страница 9)
Примеры 2.11. 1) Каждый профессор или доцент кафедры прикладной математики руководит хотя бы одним студентом.
EACH Препод(Должность = профессор OR доцент;
THAT Работает Кафедра(Назв='прикладная математика'));
Руководит SOME Студент.
(X Руководит Y) IF Y.Руководитель = Х.
2) Зарплата профессора больше 10000 рублей
IF Х IN Препод(Должность=профессор) THEN
X.Зарплата > 10000.
В БМЗ имеют предложения, относящиеся к интервальной логике Аллена, [Allen, 1983]. Декларация события С выполняется предложением EVENT C. Базовые отношения между событиями C и D выражаются следующими предложениями:
С BEFORE D (раньше),
C MEETS D (встречает),
C OVERLAPS D (перекрывает),
C FINISHES D (заканчивает),
С STARTS D (начинает),
С DURING D (в течение),
C EQUAL D (равно).
Обратные отношения обозначаются с помощью приставки i . Например,
предложение C i-BEFORE D эквивалентно предложению D BEFORE C.
Дизъюнкция предложений с одинаковыми парами событий обозначается как конечное множество связок Аллена. Например, дизъюнкция трех предложений
С BEFORE D
C i-MEETS D
C EQUAL D
обозначается как
С {BEFORE, i-MEETS, EQUAL} D.
ГЛАВА 3
ЯЗЫК ЗАПРОСОВ ДЛЯ БИНАРНОЙ МОДЕЛИ ДАННЫХ
Здесь рассматривается язык запросов для структурных схем, записанных в языке ЯОД. Такие запросы обращаются к базам данных (фактов), структурированным по эти схемам. Будет построена система синтаксической корректности этих запросов и система трансляции конъюнктивных запросов в язык SQL.
3.1. Примеры запросов
Запрос 1. Найти студентов, родившихся в 1991 году.
?Х.ФИО – X IN Студент(ГодРожд = 1991) (3.1)
Заметим, что в этом запросе (неявно) предполагается, что нужно найти фамилии студентов. Если мы напишем
?Х – X IN Студент(ГодРожд = 1991),
то ответом на этот запрос будет множество суррогатов студентов, родившихся в 1991 году. Однако пользователю суррогату не нужны, они нужны только интерпретатору запросов. Вместо (3.1) можно записать короче
? - Студент(ГодРожд = 1991).ФИО
Этот запрос можно также записать без использования атрибутных условий:
?Х.ФИО – X IN Студент; Х.ГодРожд = 1991
Запрос 2. Какую фамилию имеет староста группы А13-09?
?Х.Группа.Староста.ФИО – Х IN Студент(Группа.Номер =
'А13-09')
Без атрибутного условия этот запрос записывается так:
?Х.Группа.Староста.ФИО – Х IN Студент; Х.Группа.Номер =
'А13-09'
Можно также исключить двукратное применение операции «точка»:
?Х.Группа.Староста.ФИО – Х IN Студент; Х.Группа = Y; Y.Номер ='А13-09'
Запрос 3. Найти всех студентов группы А13-01, родившихся ранее старосты этой группы.
?Х.ФИО – X IN Студент(Группа.Номер = А13-09;
ГодРожд < Группа.Староста.ГодРожд)
Запрос 4. Какие студенты группы А13-08 сдали экзамен по дискретной математике на отлично?
?Х.ФИО – X IN Студент;Х.Группа.Номер = А13-09;
(Х СдалЭкзамен Z Y);
Y.Назв='дискретная математика';Z.Оценка= 5
Здесь переменная X обозначает пример (экземпляр) класса Студент, а переменная Y обозначает пример класса Предмет. Это следует из того, что выражение (Х СдалЭкзамен Z Y) должно быть согласовано с формой (Студент СдалЭкзамен Предмет). То, что переменная Z стоит за ЭкзЭкз, означает, что Z есть пример бинарной связи СдалЭкзамен.
Запрос 5. Каков средний бал на экзвмене по дискретной математике у студентов группы А13-08?
?AVG(Z.Оценка) – Z IN СдалЭкзамен(Предмет.Назв =
‘дискретная матем.’; Студент.Группа.Номер = А13-08)
Запрос 6. Какие студенты сдали все экзамены на отлично в январе 2012 года?
?Х.ФИО – (Х СдалЭкзамен Z Y);Z.Оценка = 5; Z.Дата >= 01/01/2012; Z.Дата =< 31/01/2012
Запрос 7. Найти всех профессоров кафедры Прикладной математики.
Х.ФИО – Работает_на(Х).Назв = 'Прикладная математика'
Х.Должность = 'Профессор'
В этом запросе использована функциональная бинарная связь Работает_на. Если бы мы не использовали свойство функциональности этой связи, то этот запрос можно было бы представить так:
Х.ФИО –(Х Работает_на Y); Y.Назв = 'Прикладная математика';
Х.Должность = профессор
Запрос 8. Какие студенты и по каким предметам сдади экзамены на отлично? У каких препододавателей и по каким предметам студент Иванов сдал экзамены на отлично?
?X.Студент.ФИО,Х.Предмет.Назв – Х IN СдалЭкзамен( Х.Оценка=5)
Этот запрос можно также короче:
?X.ФИО,Y.Назв – (Х СдалЭкзамен Z Y); Z.Оценка=5.
Запрос 9. У каких препододавателей и по каким предметам студент Иванов сдал экзамены на отлично?
?Z.Кому.ФИО,Y.Назв – ('Иванов А.П.' СдалЭкзамен Z Y);
Z.Оценка=5
3.2. Описание запросов
Запрос состоит из двух частей: цели и условия. Запрос начинается с символа “?”, после него пишутся цели, затем символ “-”, после которого пишутся условия. Как в целях запроса, так и в условиях пишутся переменные. В целях перечисляются запрашиваемые переменные и атрибуты. В условиях запроса задается тип переменных, значение атрибутов, или указывается, как атрибуты одной переменной связываются с другими переменными.
Тип может определяться явно и неявно. Явное определение осуществляется через ключевое слова IN, либо через круглые скобки, если переменная описывает отношение. Неявное определение типа осуществляется через атрибуты другой переменной, либо через круглые скобки, если переменная учавствует в отношении.
Примеры определения типа:
-
X IN Студент
Переменная X относится к классу Студент.
-
X IN Студент;X.Группа = Y
Переменная Y относится к классу Группа.
-
(X СдалЭкзамен Y Z)
Переменная Y относится к отношению СдалЭкзамен. Так как отношение СдалЭкзамен должно быть согласовано с формой (Студент СдалЭкзамен Предмет) переменная X относится к классу Студент, а переменная Z – к классу Предмет.
Значение атрибутов задается с помощью оператора «точка» («.») и одного из операторов сравнения («=», «<=», «>=», «LIKE»). Допускается многократное использование оператора «точка».
Пример:
-
X IN Студент; X.ФИО = ‘Архипов А.А.’
Во втором условии указано,что атрибут Name должен равняться значению ‘Архипов’.
-
X IN Студент; X.Группа.Староста.ФИО =’Иванов’
Во втором условии указано многократное примение оператора «точка».
Допускается использовать атрибутное условие, когда сразу после объявления класса переменной задаются атрибуты в круглых скобках
Пример:
-
X IN Студент(ГодРожд=1990)
Это условие эквивалентно двум: X IN Студент;X.ГодРожд=1990
Связывание атрибутов одной переменной с атрибутами другой переменной пишется, так же как и задание атрибутов, за исключением того что после оператора сравнения должна стоять переменная с атрибутом, либо название класса с атрибутом.
Пример:
-
Y IN Группа;X IN Студент(ГодРожд < Y.Староста.ГодРожд)
-
X IN Студент(ГодРожд < Группа.Староста.ГодРожд)
Второй пример эквивалентен первому, за исключением того что явно не используется переменная Y.
Отношения могут задаватся одним из следующих образов:
-
(X relation Y Z),
-
(X relation Z),
-
relation(X).Y_Attribute,
где relation – имя отношения, X,Z – переменные для отношения relation, Y – переменная, описывающяя отнощение,Y_Attribute – атрибут переменной Y.
В целях может присутвовать агрегатная функция:
-
?AVG(Z.Оценка) – Z IN СдалЭкзамен; …
Запрашивается среднее значение атрибутов Оценка переменной Z, относящейся к классу далЭкзамен.
Ниже описана грамматика языка:
<запрос>::= ? <цели запроса> - <условия запроса>
<цели запроса> ::= <цель>|<цели запроса>,<цель>
< цель> ::= <имя переменной>.<имя столбца>|<имя переменной>
<условия запроса>::= <условие>|<условия запроса>;<условие>
<условие> ::=<условие IN>|<определение атрибута>|
<отношение с внешними скобками>|<отношение без внешних скобок>
< условие IN>::= <имя переменной> IN <имя класса>|
<имя переменной> IN <имя класса>(<атрибутные условия>)
< атрибутные условия> ::= < атрибутное условие >|< атрибутные условия >;< атрибутное условие >
< атрибутное условие > ::= <атрибуты > <оператор> <значение атрибута>
<определение атрибута> ::= <имя переменной>. <атрибуты ><оператор> <значение атрибута>
<значение атрибута> := <слово>|<имя переменной>.<атрибуты>|<имя класса>.<атрибуты>
<атрибуты >::= <имя атрибута>|<атрибуты>.<имя атрибута>
< отношение с внешними скобками >::=
(<имя переменной> <имя отношения> <имя переменной> ) |
(<имя переменной> <имя отношения> <имя переменной> <имя переменной>)
<отношение без внешних скобок>::= <имя отношения>(<имя переменной>)< атрибуты через точку><оператор><значение атрибута>
< оператор сравнения> ::= =|<=|>=|<> |LIKE
<имя класса> ::= <имя определяемое пользователем>
<имя переменной> ::= <имя определяемое пользователем>
<имя отношения> ::= <имя определяемое пользователем>
<слово> ::= '<имя определяемое пользователем>'|<число>
<имя определяемое пользователем> ::= <буква или нижнее подчеркивание>|
<имя определяемое пользователем>< буква или нижнее подчеркивание >|
<имя определяемое пользователем><цифра>
<число> ::= <цифра>|<число><цифра>
<буква или нижнее подчеркивание > ::=
А|Б|В|Г|Д|Е|Ё|Ж|З|И|К|Л|М|Н|О|П|Р|С|Т|У|Ф|Х|Ч|Ш|Щ|Ъ|Ы|Ь|Э|Ю|Я|
а|б|в|г|д|е|ё|ж|з|и|к|л|м|н|о|п|р|с|т|у|ф|х|ц|ч|ш|щ|ъ|ы|ь|э|ю|я|
A|B|C|D|E|F|G||H|I|J|K|L|M|N|O|P|Q|R|S|T|U|V|W|X|Y|Z|
a|b|c|d|e|f|g||h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z|_
<цифра> ::= 0|1|2|3|4|5|6|7|8|9
3.3. Описание алгоритма трансляции.
Трансляция состоит из следующих этапов:
-
Подготовка к трансляции.
-
Анализ используемых переменных, замена коротких записей.
-
Проверка на корректность классов.
-
Удаление ненужных переменных.
-
Создание запроса SQL на основе используемых переменных.
Каждому этапу соответствует несколько функций в программном коде, который представлен в приложении.
Ниже дается описание каждого этапа и названия функций в программе.
-
Подготовка к трансляции.
Определяется структурная схема. Запрос делится на две части: с целями (левую) и с конъюнктивными условиями (правую). Создаются списки всех переменных и целевых переменных, инициализируется счетчик искусственных переменных.
Функции: string translate(string query)
void divideQuery(string query)
-
Анализ используемых переменных и замена коротких записей.
Анализ
Анализ состоит в определении целей, типов переменных, используемых атрибутов и значений для атрибутов.
В каждой цели проверяется наличие агрегатной функции (среднее арифметическое(AVG), сумма(SUM), максимум(MAX), минимум(MIN), количество(COUNT)).
Правая часть запроса разбивается на отдельные конъюнкции. Список конъюнкций проходится два раза: первый раз для определения типа переменных, второй – для замены коротких записей и для определения используемых атрибутов переменных и их значений.
Замена коротких записей














