/
/
Введение
предикат тейз реляционный программный
В современной науке одним из наиболее перспективных направлений вычислительной техники считается создание систем искусственного интеллекта. Разработка интеллектуальных систем подразумевает не только изучение человеческого интеллекта с использованием идей и методов его мыслительной деятельности, но и создание компьютерного интеллекта, представляющего собой некую аналогию человеческому. Здесь наиболее важным шагом является объяснение принципов мыслительного процесса человека, основных идей и методов, с помощью которых человек производит свои вычисления. Таким образом, под понятие интеллекта подводится принципиально новая теоретическая база, и тот факт, что компьютерные системы искусственного интеллекта находят широкий круг применения, становится очевидным.
Развитие систем искусственного интеллекта тесно связано с расширением пределов возможностей компьютерного обеспечения и компьютерных технологий. Возникающие в данной области исследований проблемы достаточно сложны и интересны, вследствие чего в настоящее время искусственный интеллект является одной из приоритетных областей, в которой занято большое количество специалистов. Таким образом, вполне естественно, что идеи развития искусственного интеллекта перетекли в область компьютерных исследований, и в настоящее время компьютерное моделирование интеллектуальной деятельности человека является весьма актуальным.
В последние годы одним из интереснейших направлений в разработке систем ИИ является рассмотрение процессов интеллектуальной деятельности человека во времени. Время не случайно столь приоритетно в исследованиях в области искусственного интеллекта: и в человеческих рассуждениях фактор времени является одним из основополагающих. Образ так называемой «временной оси» глубоко заложен в человеческое понимание окружающего мира. Каждый наверняка замечал, что все наши воспоминания мы строим на воображаемой временной оси, и часто нам приходится восстанавливать произошедшие события в хронологическом порядке. Человеческая способность выстроить события на временной оси очень сильна, и для большинства людей, не обладающих способностями абстрактного мышления, является единственным способом представления происходящих событий.
Трудно представить существование какой-либо области исследований в искусственном интеллекте, не использующей рассуждения с учетом временного фактора в той или иной интерпретации, будь то системы медицинской диагностики, в которых необходимо определять время попадания вируса в кровеносную систему и период инкубации; системы тестирования электронных систем, в которых необходимо исследовать временной период, в течение которого увеличивается нагрузка конденсатора; системы программирования роботов, в которых необходимо выполнение определенной последовательности заданий в определенное время; базы знаний, в которых знания экспертов и коэффициенты уверенности правил являются результатом воздействия внешней информации и внутренней реакции, а следовательно тоже изменяются с течением времени.
Фактор времени имеет первостепенную важность, поскольку окружающий нас мир изменяется во времени. Если бы мы жили в мире, где какие бы то ни было изменения были невозможны - не существовало бы заражающих кровеносную систему вирусов, изменений электрической нагрузки, не существовало бы даже изменений расположения солнца на небе - не было бы и необходимости учета временного фактора. При исследованиях временного фактора должны учитываться следующие основные моменты:
1) Необходим язык для описания того, что истинно или ложно в каждый момент времени, что изменяется, а что остается постоянным.
2) Необходимо определение правил «законных изменений» (изменений, подчиняющихся определенному закону) в вышеуказанном языке, учитывающих возможные изменения во времени.
В ИИ можно определить несколько классов задач, при решении которых требуется учет временного фактора, основные из которых можно охарактеризовать следующим образом [1]:
1. Задача предсказания: У нас имеются описания окружающего мира в определенный период времени и правила, которые применяются к ситуациям, возникающим при изменениях окружающего мира (Например, известны траектории движения бильярдных шаров, необходимо предсказать момент их столкновения и его последствия.)
2. Задача объяснения: Пусть дано описание окружающего мира в какой-то период времени, а так же критерии «законных изменений» происходящих процессов. Необходимо дать описание мира в некий момент времени, предшествующий данному, которое привело окружающий мир в текущее состояние. (Например, сидя в бильярдной и услышав громкий шум удара, можно сделать предположение, что в предшествующий момент произошло столкновение двух шаров.)
3. Задача планирования: Пусть дано описание какого-то состояния, в которое необходимо перевести окружающий мир в некоторый момент времени, и описание «законных изменений». Необходимо произвести последовательные действия, переводящие мир в желаемое состояния. (Например, желая забить бильярдный шар в лунку, необходимо ударить по нему другим шаром под определенным углом.)
4. Описание истории происходящих процессов: Пусть даны описания окружающего мира в различные моменты времени, необходимо описать историю происходящих в мире процессов.
Хотя очевидно, что данные классы задач тесно взаимосвязаны, в ИИ поиск решения подобных проблем привел к возникновению множества различных направлений исследований.
Учитывая важность и перспективность направлений в области ИИ, связанного с учетом фактора времени, в дипломной работе исследуются вопросы представления времени в интеллектуальных системах. Основное внимание уделяется учету временной информации при разработке баз данных, а именно, в работе будет рассмотрена темпоральная (временная) модель данных (ТМД), являющаяся расширением реляционной модели данных на случай оперирования темпоральной информацией, а так же временная алгебра. В качестве модельного примера будет разработана база данных для обслуживания сферы консалтинга, ведущая учет всех компаний-клиентов, сотрудников компаний, проектов, ежемесячной прибыли и доходов, зарплат и должностей. Реализация будет проведена средствами программного обеспечения СУБД MYSQL с использованием удобного инструмента для визуального проектирования БД - My SQL Workbench. Кроме того, для реализации методов темпоральной алгебры будет использован объектно-ориентированный язык программирования Java и фреймворк Hibernate. Он позволяет обращаться с реляционной БД с помощью запросов «Criteria» как с обычными объектами ООП.
Основная сложность в решении поставленной задачи заключается в том, что на сегодняшний день данное направление не является достаточно изученным. Несмотря на многочисленные исследования и разработки таких крупных организаций, как Oracle и Microsoft, еще не появилось коммерческой реализации темпоральной системы управления базами данных (СУБД), однако предложены различные расширения, позволяющие обрабатывать временные данные. Кроме того, ощущается недостаток публикаций по данному вопросу на русском языке.
1. Основные подходы к учету фактора времени при разработке систем ИИ
1.1 Основные свойства времени
Перед рассмотрением различных способов представления времени в интеллектуальных системах необходимо оценить человеческое восприятие времени как такового, а именно, ответить на вопросы, какими основными свойствами обладает время и с помощью чего его можно охарактеризовать.
В памяти человека сведения об окружающем мире и возможных действиях в нем упорядочены не только различными классифицирующими и ситуативными отношениями. Для фиксации соотношений любых отдельных информационных единиц она использует различные шкалы. Так, существуют метрические шкалы (установление количественного соотношения и порядка тех или иных совокупностей информационных единиц), порядковые шкалы (фиксация лишь порядка информационных единиц), оппозиционные шкалы (образуются с помощью пар слов - антонимов) и пр. Важно отметить, что для времени возможны два способа шкалирования. Один из них отражает упорядочение событий на шкале: прошлое - настоящее - будущее, а другой на шкале типа раньше - позже. Каждое событие на первой шкале в процессе эволюции как бы перемещается по ней. Если в какой-то начальный момент оно было расположено в будущем, то изменяясь или приближаясь, возникает в настоящем, а потом уходит в прошлое, оставаясь там навсегда. Если же оно не реализуется в настоящем, то исчезнет из шкалы. На шкалах второго типа (к ним относится подавляющее большинство шкал, используемых для времени) события располагаются в неизменном порядке. Это как бы застывшая шкала «уже произошедшего».
По тому, как события отражены на шкалах, мы будем различать два типа временных систем: А-система и В-систем. Обе они должны быть реализованы в интеллектуальных системах. Логики времени, связанные с ними, несколько различаются.
Перейдем к основным свойствам времени, используемых в теории интеллектуальных систем для осуществления взаимодействия системы с окружающим миром [2].
1. Направленность
Основное назначение времени, реализуемое в А-системах - фиксация направления его изменения из прошлого через настоящее в будущее, ориентация течения событий, процессов, действий или замещающих их «кусков времени» - ТЕМПОРов. Время в В-системах также фиксирует направление, определяющее семантику отношений следования для ТЕМПОРов или тех элементов, которые они замещают.
В окружающей реальности мы всегда можем заметить однонаправленность и необратимость времени. Эти его свойства используются в различных логиках и моделях. Однако, не трудно представить модели времени, в которых оно идет в обратном направлении, а также модели, где время считается как бы застывшим, неподвижным (например, в произведениях искусства).
2. Линейность
Чаще всего время представляется в виде некоего множества (на котором задано отношение нестрогого порядка), обуславливающего справедливость отношения транзитивности для ТЕМПОРов и замещаемых ими элементов. В основном в литературе рассматриваются логики, для которых выполняется свойство линейности.
Однако, можно представить себе и такие модели времени, в которых свойство линейности нарушается. Например, трактуя в А-системах будущее развитие интересующих нас событий, можно исследовать различные альтернативные последовательности их реализации или в более общем случае ТЕМПОРов. Ибо будущее еще не наступило и оно носит модальный характер. Будущее время как бы ветвится по альтернативным последовательностям событий или ТЕМПОРов. Конечно, свойство транзитивности здесь может нарушаться. Такое «ветвление» характерно, например, для моделей психологического времени.
3. Непрерывность
Стало стандартом представлять время в виде одномерного континуума, геометрическим образом которого служит прямая. Фундаментальное свойство, вытекающее из непрерывности, заключается в том, что для любых двух ТЕМПОРов или замещаемых ими элементов, строго упорядоченных в одномерном континууме, всегда найдется ТЕМПОР, который будет лежать (с точки зрения строгой упорядоченности) между этими двумя ТЕМПОРами.
В отличие от двух предшествующих свойств времени его непрерывность в прагматическом аспекте не сама собой разумеющаяся. Многовековая философская дискуссия по проблеме непрерывности / дискретности времени - яркое тому свидетельство. В квантовой физике утверждается единство дискретности и непрерывности времени. Иначе говоря, время - не только непрерывный поток, но и его отдельные фазы, стадии. Как форма существования отдельных объектов, каждый из которых прослеживает свое индивидуальное время, время дискретно, но из вечности материи и ее одновременного пребывания во множестве объектов следует, что время непрерывно.
Эта двойственность проявляется и в тех моделях и логиках, которые мы рассмотрим в дальнейшем. В любой момент их изучения мы предполагаем время дискретным, но потенциально можем сколько угодно продолжать процесс его дробления.
4. Неоканчиваемость
Естественное представление о времени таково, что его можно бесконечно продолжать и в будущее, и в прошлое. По крайней мере, для А-систем это нам представляется вполне естественным. Таким свойством оно будет обладать и в предлагаемых далее логиках и моделях. Однако, как ни парадоксально, но можно вообразить себе время, не обладающее данным свойством. Таково циклическое время, представляемое циклами церковных праздников и финансовыми годами.
5. Гомогенность
Для человека время, как таковое, обладает свойством однородности. Любой момент времени, любой его интервал, любая цепь из точек и интервалов времени (т.е. любой ТЕМПОР) никак не меняются, если их перемещать по шкале времени. Однако, гомогенность времени нарушается в системах с датированием, где отдельные участки временной шкалы снабжаются маркерами - датами, различными для разных участков шкалы. Учитывая важность систем датирования, в дальнейшем мы будем использовать свойство гомогенности времени в ограниченном понимании и только в случаях, когда временные рассуждения не опираются на какие-либо маркеры (в частности даты) на временной шкале. Особенно сильно свойство гомогенности нарушается в моделях психологического времени.
Из сказанного следует, что ни одно свойство времени, сколь бы естественным оно не казалось, не носит универсального характера. Поэтому оказывается возможным строить различные временные логики и модели времени, отличающиеся друг от друга списком принятых в качестве их исходных аксиом тех или иных свойств времени. Другими словами, нет и не может быть какой-то одной единственно правильной временной логики или модели времени, которая удовлетворяли бы нас во всех случаях жизни.
Процесс разработки альтернативных логик аналогичен процессу построения моделей в геометрии. Отказ от знаменитого пятого постулата Евклида привел к геометриям Лобачевского и Римана. Отказ от того или иного свойства времени приводит к временной логике с новыми свойствами. И как геометрия Лобачевского оказалась способной отразить особенности пространства в пределах космоса, так и временные модели, свойства которых кажутся нам неестественными (например, время, как оно представляется в теории относительности), могут описывать некие свойства действительности или субъективного мира человека.
1.2 Способы представления времени
Предположим, что мы хотим представить каким-то образом информацию о том, что конкретный дом, например ДОМ17 был КРАСНОГО цвета в момент времени t. В связи с этим возникает несколько вопросов.
Первым необходимо решить вопрос о том, что на самом деле представляет собой t: это временная точка, интервал времени или, может быть, некая более сложная сущность? Существуют различные виды утверждений, некоторые из которых интерпретируются с помощью временных точек, другие - с помощью временных интервалов, иные - с помощью наборов непересекающихся интервалов и т.д. В исследованиях по ИИ можно найти ответ на этот вопрос. В изначально предложенной A. Pnueli [3] формализации модальной временной логики и предложенной V. Pratt [4] динамической логики утверждения интерпретировались с помощью временных точек. Позднее появилось несколько обобщений подобных систем (Nisihmura [5]), в которых использовались оба понятия: «утверждения с временными точками» и «утверждения с временными интервалами». В последнее время в ИИ наблюдается определенное движение в сторону более однородных логик, основанных на понятии интервала. В ИИ можно обнаружить системы всех 3-х типов: основанные на понятии точки, интервала и смешанные.
Возникает еще один вопрос: что выбрать в качестве основного темпорального элемента в наших рассуждениях о сущности времени. Можно, конечно, рассматривать различные возможности, но все же основными являются интервалы и точки. Интервалы могут считаться примитивными объектами, связанными между собой различными способами: «I1 полностью перед I2», «I1 граничит с I2», «I1 и I2 перекрываются» и т.п. Если принимается данный способ представления, все еще возможно говорить о временных точках, представляя их с помощью примитивных объектов, а именно определяя временную точку как результат некой операции над интервалами, например, пересечение бесконечного множества интервалов [6]. В качестве альтернативы предыдущему способу представления можно взять за примитивные объекты точки, причем единственным возможным отношением между двумя точками (кроме идентичности) может быть следующее: «P1 предшествует Р2». В данном случае интервал можно представить с помощью упорядоченной пары точек (начальная и конечная точки), такой, что первая точка либо предшествует второй, либо совпадает с ней (таким образом, точка Р представляется с помощью интервала {Р, Р}). Сторонники выбора в качестве основного примитивного элемента интервала, а не точки, основываются на интуитивных соображениях о несколько искусственной природе точек и более естественной для человека природе интервалов.
Еще один важный вопрос, который возникает в связи с проблемой представления времени, - существует ли какая-либо связь между истинностью утверждения на интервале и его истинностью на отдельных участках интервала. Обычно задается вопрос о том, являются ли интервалы «открытыми» или «закрытыми». На самом деле, такой вопрос не имеет смысла. Если интервал определяется как упорядоченная пара точек, а не множество точек, то нет смысла спрашивать о том, является ли Р1 элементом {Р1, Р2}. Далее возникает вопрос: является ли сделанный нами вывод действительно корректным, распространяются ли принимаемые на интервале истинностные значения на все подинтервалы данного интервала? Перенесение истинностных значений с интервала на его подинтервалы в утверждениях типа «ДОМ17 красного цвета» кажется абсолютно логичным, однако, оно оказалось бы неприемлемым для следующих утверждений: «я пробежал более пяти миль», «робот выполнил процедуру поиска от начала до конца». Самым популярным подходом к разрешению подобных недоразумений считается различение разных типов сущностей: первое утверждение представляло собой «факт» или «свойство», а другие являлись «событиями».
Таким образом, при разработке новых формализмов для интерпретации времени возможно использование любой комбинации признаков в зависимости от цели разработки того или иного формализма.
Итак, рассмотрим более подробно два наиболее распространенных в настоящее время в ИИ формализма: интервальный подход Allen [7] и точечный подход MсDermott [8].
Темпоральная логика, основанная на интервальном представлении времени
Темпоральную интервальную логику предложил Аллен в начале 80-х годов [7]. В качестве временных примитивов в ней используются интервалы, а не временные точки.
Здесь заглавными буквами обозначены предикаты и константы, а строчными переменные. Кроме того, будем использовать набор связок и квантификаторов в их стандартной интерпретации, а именно:
- конъюнкция, ? - дизъюнкция, ? - отрицание, - импликация, - эквивалентность, - квантор общности, - квантор существования, ! - квантор существования и единственности.
Временной интервал X - это упорядоченная пара (X-, X+), такая что, X- < X+, где X- и X+ рассматриваются как моменты времени (например, на вещественной оси). Структура времени может быть любая (необходимая в конкретной ситуации). Временные точки рассматриваются как очень маленькие временные интервалы. Построены варианты этой логики с ветвящейся структурой времени [Reich A., 1994].
Данный подход появился благодаря некоторым наблюдениям: единственные промежутки времени, которые можно четко конкретизировать - это время происхождения событий или действий и интервалы действия тех или иных свойств. Для каждого такого промежутка времени (например, периода передвижения человека из дома на работу) происходящие события можно рассмотреть более четко и разложить их на составляющие, следовательно, и рассматриваемый интервал времени можно разложить на подинтервалы. Другими словами, оказывается, что практически всегда существует более подробное объяснение причин того или иного явления, чем это обычно принято полагать. Хорошей аналогией в данном случае является представление, что каждому периоду времени соответствуют некие интервалы на действительной оси.
Рассматриваемая логика является типизируемой логикой исчисления предикатов первого порядка, в которой термы подразделяются на множество категорий. В настоящий момент рассмотрим три из этих категорий:
- термы типа TIME-INTERVAL, обозначающие интервалы времени
- термы типа PROPERTY, обозначающие утверждения, которые могут сохранять или не сохранять свою истинность в конкретный момент времени
- термы, соответствующие объектам в домене.
Мы так же рассмотрим несколько предикатов. Одним из наиболее важных является предикат HOLDS, который отражает утверждение о том, что некоторое свойство сохраняется (т.е. является истинным) на определенном временном интервале. Таким образом, HOLDS (p, t) истинен в том и только том случае, если свойство р сохраняется на временном интервале t. Следствием этого является аксиома о том, что свойство р сохраняется также и на каждом подинтервале интервала t.
Существует базовое множество взаимно исключающих примитивных отношений, которые могут быть между темпоральными (временными) интервалами. Каждое из этих отношений представляется в логике при помощи определенного предиката (табл. 1).
Рассмотрим пример. DURING (t1, t2): временной интервал t1 полностью содержится внутри временного интервала t2, STARTS (t1, t2): временной интервал t1 начинается тогда же, когда и временной интервал t2, однако заканчивается раньше, чем заканчивается t2 и т.д.
Табл.1. Множество базовых интервальных отношений
Теперь имея вышеуказанные предикаты, необходимо отметить, что существует ряд аксиом, определяющих их поведение. Во-первых, имея интервал I, можно сказать, что существуют интервалы, связанные с I каждым из вышеперечисленных отношений. Мы также располагаем аксиомами, утверждающими, что каждое из отношений является взаимно исключающим все остальные, а также большим набором аксиом, описывающих транзитивность поведения. Приведем пример:
BEFORE (t1, t2) BEFORE (t2, t3) BEFORE (t1, t3) (1.1)
MEETS (t1, t2) DURING (t2, t3) (OVERLAPS (t1, t3) ?
DURING (t1, t3) ? MEETS (t1, t3)) (1.2)
Будет полезно определить предикат, который подытоживал бы отношения, в которых один интервал полностью содержится в другом. Определим IN следующим образом:
IN (t1, t2) (DURING (t1, t2) ? STARTS (t1, t2) ? FINISHES (t1, t2)) (1.3)
Используя это предикат, можно ввести в рассмотрение первое решающее свойство предиката HOLDS: если свойство р сохраняется на интервале Т, то оно сохраняется на всех его подинтервалах интервала Т, т.е.:
HOLDS (p, T) ( t. IN (t, T) HOLDS (p, t)). (1.4)
Например, если в течение 2015 года у меня была машина, то, следовательно, я владел машиной в январе 2015, в феврале 2015 и т.д.
На самом деле оказывается, что в дальнейшем нам необходима более сильная аксиома. Она будет представлена ниже (1.5), несмотря на то, что (1.4) может быть выведена из нее и свойств отношения IN.
HOLDS (p, T) t. IN (t, T) ( s. IN (s, t) HOLDS (p, t)). (1.5)
Чтобы записывать сложные логические выражения существует набор функций вида and, or, not, all, exists, соответствующих логическим операторам , ?, ?, , , причем это соответствие можно отразить следующим образом.
Конъюнкция легко может быть определена для предиката HOLDS:
HOLDS (and (p, q), t) HOLDS (p, t) HOLDS (q, t) (1.6)
Отрицание определяется так:
HOLDS (not (p), T) ( t. IN (t, T) ?HOLDS (p, t)). (1.7)
Последнее отличается от ?HOLDS (p, Т), что по аксиоме (1.4) эквивалентно следующему:
?( t. IN (t, T) HOLDS (p, t)),
что, в свою очередь, эквивалентно следующему:
t. IN (t, T) ?HOLDS (p, t).
Таким образом, последнее означает, что существует по крайней мере один подинтервал, на котором р не сохраняется, в то время как предыдущее означает, что р не сохраняется ни на одном из подинтервалов Т.
Используя вышеприведенные определение, мы можем доказать следующее:
HOLDS (not (p), T) ?HOLDS (p, T). (1.8)
Также, используя (1.4) и (1.2), можно вывести следующее:
HOLDS (not (not (p)), T) HOLDS (p, T), (1.9)
чего мы и ожидали интуитивно. Отражая аналогичным образом обычное определение дизъюнкции для определения функции «or», т.е.,
HOLDS (or (p, q), t) ? HOLDS (not (and (not (p), not (q))), t),
можно вывести следующее:
HOLDS (or (p, q), T) t. IN (t, T) ( s. IN (s, t) (HOLDS (p, s) ? HOLDS (q, s))). (1.10)
Многие подходы к разработке и исследованию темпоральных логик используют в модели понятие ветвящегося будущего. Это используется для анализа понятия возможности некоторого события, а также понятия необходимости некоторого события. В модели, описываемой здесь, ветвящееся будущее не рассматривается. Это происходит потому, что рассуждения о будущем рассматриваются лишь как один из вариантов гипотетических рассуждений. Другие примеры включают рассуждения о прошлом (например, как мог мир перейти в то состояние, в котором он находится в данный момент), а также рассуждения, не зависящие от времени и физической природы (например, математика).
Таким образом, существует простая единая временная линия (которая соответствует реальному прошлому и реальному будущему в ветвящейся модели времени). Конечно, человек, проводящий рассуждения, никогда не может полностью идентифицировать настоящее, прошлое или будущее, и рассуждения о том, что действительно произошло или произойдет, состоят из построения наиболее правдоподобных гипотез, в предположении, что рассуждающий располагает информацией о прошлом, настоящем и будущем.
В дальнейшем на основных принципах описанной темпоральной логики могут быть представлены события и действия.
Темпоральная логика, основанная на точечном представлении времени
В данном разделе мы кратко остановимся на основных понятиях темпоральной логики, использующей подход предложенный McDermott [8].
В этой логике отражены два основных момента: «открытость» будущего и непрерывность времени. «Открытость» будущего подразумевает, что, начинаясь в один и тот же момент времени, может произойти множество различных событий. В нашей логике это моделируется с помощью множества различных возможных моделей развития будущего. Непрерывность времени подразумевает, что большинство вещей непрерывно во времени. В нашей логике это достигается разрешением наличия бесконечного числа примеров событий между двумя мгновениями времени.
Для отражения вышеуказанных основных идей рассматривается бесконечный набор состояний окружающего мира. Состояние представляет собой моментальный «слепок» окружающего мира. Состояния представляются частично упорядоченными с помощью отношения «=<». Для обозначения того факта, что состояние s1 было раньше состояния s2 или идентично ему будем использовать запись вида: (=< s1 s2). Для написания логических формул используется т.н. «польская нотация». Каждый терм, атомарная формула или их комбинация записываются в виде (р…), где р есть предикат, функция или связка. Оставшаяся часть формулы (после р) есть аргументы или другие составные части. Если р - квантор существования или общности, то в качестве составных частей выступают список переменных и формула:
(forall (-vars-) fmla)
(exists (-vars-) fmla)
Для других связок составные части формул можно отразить в следующем виде:
(not fmla)
(if fmla1 fmla2)
(and fmla1 fmla2…)
(or fmla1 fmla2…)
(iff fmla1 fmla2)
Если р - бинарное транзитивное отношение, то (p w x y … z) есть сокращенная запись для (and (p w x) (p x y) … (p … z)).
Аксиома 1: (iff (and (=<? s1? s2) (=<? s2? s1)) (=? s1? s2))
(iff (<? s1? s2) (and (=<? s1? s2) (not (=? s1? s2))))
Если (=< s1 s2) и s1, s2 различны, будем писать (< s1 s2).
Аксиома 2: (Плотность)
(forall (s1 s2) (if (< s1 s2) (exists (s) (and (< s1 s) (< s s2)))))
Аксиома 3: (Транзитивность)
(forall (s1 s2 s3) (if (and (=< s1 s2) (=< s2 s3)) (=< s1 s3)))
Отметим, что рассматривается типизированная логика. Так, переменные, начинающиеся с s, означают состояния. Это означает, что (forall (x) p), где x - типизированная переменная, есть сокращенная запись для:
(forall (x) (if (is sort x) p)),
sort - так называемый sort или «тип данных». По сути дела они не слишком важны, а лишь помогают сохранить определенную «типизацию» структуры. Мы можем читать запись вида: (forall (s)…) как «для всех состояний…», не упоминая явно, что условия, что s является состоянием (is STATE s).
Неограниченные переменные (пишутся с? в начале) универсально квантифицируемы, т.е. их действие распространяется на всю формулу.
Каждое состояние имеет время происхождения, обозначаемое действительным числом и называемое датой. Функция d возвращает дату состояния, как, например, в формуле (= (d s1) D1). Любое действительное число является корректной датой: время же по своей сути бесконечно и не имеет циклов. Это означает, что 2 состояния будут иметь сравнимые даты, даже если они не являются связанными отношением =<. Будем использовать =< и < для обозначения обычного числового упорядочения, а также частичного упорядочения состояний, поскольку используемые sorts устраняют всякую двусмысленность в данном вопросе. Переменные, начинающиеся с «r» или «t» означают действительные числа.
Два вида упорядочения сравнимы:
Аксиома 4: (if (< s1 s2) (< (d s1) (d s2)))
Состояния объединяются в т.н. «хронологии». Хронология есть полная возможная история мира, полностью упорядоченное множество состояний, бесконечно расширяющееся во времени.
Аксиома 5: (Определение хронологии)
(iff (if CHRONICLE? x)
(and; множество состояний
(forall (y) (if (elt y? x) (is STATE y)))
; полностью упорядочено
(forall (s1 s2) (iff (and (elt s1? x) (elt s2? x))
(or (< s1 s2) (> s1 s2) (= s1 s2))))
; бесконечно во времени
(forall (t) (exists(s) (and (elt s? x) (= (d s) t))))))
(elt a x) означает, что а является элементом множества х. Прямым следствием аксиомы 5 является тот факт, что хронология является «выпуклой»:
(if (is CHRONICLE? x)
(forall s1 s2) (if (and (elt s1? x) (elt s2? x))
(forall (s) (if (< s1 s s2) (elt s? x)))))
Определив хронологию х (is CHRONICLE x), мы можем объявлять переменные, начинающиеся с «ch» переменными sort «CHRONICLE».
Хронология есть способ возможного развития событий. Согласно нашей логике, может быть несколько возможных путей развития событий (Рис. 1).
Каждое состояние входит в какую-то хронологию. Действительно:
Аксиома 6: (if (=<? s1? s2) (exists (ch) (and (elt? s1 ch) (elt? s2 ch))))
где, согласно свойству «выпуклости», каждое состояние между? s1 и? s2 входит в хронологию ch.
Рис. 1. Дерево хронологий
Подразумевается ветвление хронологий лишь в будущее (Рис. 1).
Аксиома 7: (if (and (=<? s1? s) (=<? s2? s))
(or (=<? s1? s2) (=<? s2? s1)))
Причиной этого является тот факт, что будущее на самом деле недетерминируемо. Прошлое может быть неизвестным, но существует лишь одно прошлое. Напротив, для одного состояния может быть более одного возможного будущего. Причина построения логики именно таким образом состоит в том, чтобы обеспечить определенную свободу рассуждений о действиях, которые могут привести к одному будущему, а не к какому-то другому.
Состояния и хронологии особенно важны потому, что они являются определенной стадией рассмотрения фактов и событий [8].
1.3 Временная логика предикатов А. Тейза
Линейную временную логику предикатов представил в своих работах А. Тейз путем обобщения временной логики высказываний и введения переменных, функций и предикатов [9]. Выразительные возможности при этом значительно возросли, как и в классической логике. На данный момент временная логика предикатов активно используется в исследовании систем, связанных с параллельными процессами.
При построении языка линейной временной логики предикатов используются символы двух видов: одни обозначают «глобальные объекты», другие - «локальные объекты». Интерпретация глобальных объектов не зависит от заданного момента времени. Например, глобальным объектом является некоторый субъект; символ, обозначающий его, сохраняет одно и то же значение во всех состояниях. Примером локального объекта служит обладатель некоторой должности. Эту должность могут последовательно занимать разные лица, поэтому, символ, обозначающий лицо, занимающее данную должность, в разных состояниях представляет разных людей.
Язык линейной временной логики предикатов (или язык первого порядка) строится на основе множеств символов:
1. Множество логических связок (?, , ?, ? и ?)
2. Множество временных операторов (, ?, ЃZ, И)
3. Множество кванторов (, )
4. Символ равенства (=)
5. Множество Р глобальных предикатных констант
6. Множество F глобальных функциональных констант
7. Множество Q локальных констант
8. Множество L локальных индивидных констант
9. Множество V глобальных переменных
Эти множества не пересекаются. Каждой функциональной или предикатной константе соответствует некоторое целое неотрицательное число, называемое числом мест или арностью.
Элементы рассматриваемого языка получаются по правилам построения, аналогичным, с одной стороны, правилам построения, применяющимся в логике предикатов, и, с другой стороны, правилам построения, применяющимся во временной логике высказываний:
· Термом называется всякая переменная, всякая индивидная локальная константа и всякая функциональная форма
· Функциональная форма представляет собой последовательность символов, состоящую из функциональной константы, скобок и подходящего числа термов. Точнее, если f - (глобальная) функциональная константа с числом мест n и t1, …, tn - термы, то соответствующая форма имеет вид f (t1, …, tn). Если n равно 0, то вместо f() пишут f и говорят о (глобальной) индивидной константе.
· Предикатная форма есть последовательность символов, состоящая из предикатной константы, скобок и подходящего числа термов. Если р - (глобальная) предикатная константа, у которой число мест m, и t1,…, tm суть термы, то соответствующая форма имеет вид p (t1,…, tm). Если т равно 0, то пишут р вместо р() и говорят о (глобальной) пропозициональной константе.
· Атомом называется всякая предикатная форма, всякое локальное высказывание и всякое равенство.
· Равенством называется выражение вида (s = t), где s и t-термы.
· Понятие формулы определяется рекурсивно посредством следующих правил:
- атом является формулой;
- если A - формула, то ~A, ? А, ?А и ЃZА - формулы;
- если А и В-формулы, то (А В), (А?В), (А?В), (А? В), (А И В) - формулы;
- если А есть формула и х - некоторая переменная, тогда хА и хА являются формулами.
Отметим, что в той логике, которую мы только что определили, все символы являются глобальными, за исключением некоторых индивидных констант и некоторых высказываний, которые могут быть локальными. Можно было бы ввести локальные элементы всех типов, но мы ограничимся индивидными константами и высказываниями ввиду того, что только эти локальные элементы используются на практике.
Пусть заданы множества глобальных и локальных символов, которые только что были введены. Тогда временной интерпретацией называется пятерка (S, R, D, Ic, Iv), обладающая следующими свойствами.
· (S, R) - линейная временная структура
· D - непустое множество; это область интерпретации.
· Iс - функция интерпретации констант, которая сопоставляет
- каждой функциональной глобальной n-местной константе f F некоторую функцию Ic(f), действующую из Dn в D;
- каждой предикатной глобальной m-местной константе р Р некую функцию Ic(p), действующую из Dm в {И, Л};
- каждому состоянию s S и каждой индивидной локальной константе l L некоторый элемент Ic (s, l) D;
- каждому состоянию s S и каждому локальному высказыванию q Q некоторое значение истинности Ic (s, q).
· Iv является функцией интерпретации переменных, которая сопоставляет каждой переменной x V некий элемент Iv(x) D.
Пусть заданы временная интерпретация J = (S, R, D, Ic, Iv) и состояние s S, тогда с помощью следующих правил интерпретации можно приписать каждому терму некоторый элемент из D и каждой формуле-некоторое значение истинности.
· Если х-переменная, то J (s, х) = def Iv(x).
· Если l - локальная индивидная константа, то J (s, l) = def Ic(s, l).
· Если f - функциональная n-местная константа и t1,…, tn - термы, то J (s, f(t1,…, tn)) = def Iс(f) (J (s, t1), …, J (s, tn)).
· Если р-предикатная m-местная константа и t1,…, tm суть термы, то J (s, p(t1,…, tm)) = def Iс(p) (J (s, t1), …, J (s, tm)).
· Если q - локальное высказывание, то J (s, q) = def Ic(s, q)
· Если t1 и t2-термы, то J (s, t1 = t2) есть И, если J (s, t1) = J (s, t2), а иначе Л.
· Если А и В формулы, то ~А, (А В), (A?В), (А?В) и (А ? В) интерпретируются, как формулы.
· Если А и В-формулы, то ЃZ А, А, ? А и (A И B) интерпретируются, как формулы.
· Если А - формула и х-переменная, то J (s, xA) есть И, если Jx/d(s, А) равняется И для всех d D, и J (s, хА) есть И, если Jx/d (s, А) равняется И хотя бы для одного d D. Запись Jx/d означает некую интерпретацию, совпадающую с J всюду, за исключением переменной х, для которой Iv(х) = d.
Отметим, что можно ограничиться случаем, когда S есть множество неотрицательных целых чисел, a R-функция следования. Тогда временная интерпретация представляется в виде бесконечной последовательности классических интерпретаций, в которых глобальные символы интерпретируются единообразно. Подчеркнем тот факт, что временной аспект этой логики не меняет роли переменных. В частности, их можно квалифицировать как свободные или связанные.
Эффективное использование временной логики первого порядка для формализации рассуждений практически возможно только при наличии некоторой аксиоматической системы.
Естественная идея состоит в комбинировании аксиоматической системы для классической логики первого порядка с той системой, которая построена для временного исчисления высказываний. Однако следует проявлять осторожность. Прежде всего схема
xА (x) ? А (t),
общезначимая в классической логике, общезначима во временной логике тогда и только тогда, когда замена переменной х термом t не вводит локальную константу в область действия некоторого временного оператора. Если это условие соблюдается, то говорят, что терм t заменяем на х в А.
Следует также уточнить связи между временными операторами и кванторами. Имеют место соотношения
xЃZА ? ЃZxА
xА ? xА
Аксиоматическая система, которую мы используем, содержит (рекурсивное) множество аксиом, определяемых следующими правилами.
1) Любая конкретизация схемы общезначимой формулы временной логики высказываний является аксиомой.
2) Если А - формула, не содержащая локальных объектов, то импликация (А ?ЃZА) является аксиомой.
3) Если х - глобальная переменная, А(х) - формула и t - терм, заменяемый на х в А (х), то импликация (x A(x) ?A(t)) есть аксиома.
4) Если А - формула и x-глобальная переменная, то формула (х~А ? ~хА) является аксиомой.
5) Если A - формула и х-глобальная переменная, то импликация (хЃZА ? ЃZхА) есть аксиома.
Принимаются следующие правила вывода.
• Если А и А? В-теоремы, то В является теоремой.
• Если A - теорема, то А является теоремой (Необходимость).
• Если А не содержит свободных вхождений глобальной переменной х и А ? В-теорема, то импликация А?х В является теоремой (Обобщение).
В противоположность классическому исчислению предикатов временное исчисление предикатов не допускает полную аксиоматизацию. Тем не менее представленная аксиоматическая система позволяет осуществлять вывод многочисленных полезных теорем.
2. Учет временного фактора при разработке баз данных
Традиционные реляционные модели данных способны хранить лишь последнюю информацию об объектах предметной области, или, в терминах баз данных: предоставлять моментальные снимки данных на текущий момент времени. Изменения объекта или атрибутов объекта приводит к тому, что предыдущее состояние становится неизвестным, и невозможно что-либо сказать об этом объекте в прошлом. Что касается темпоральных моделей данных, они позволяют хранить историческую информацию об объектах: если объект начал свое существование в момент времени Т1, а закончил в момент времени Т2, то нам будут известны все его состояния на промежутке времени [Т1, Т2].
Темпоральность объектов подразумевает прямую или косвенную связь объекта с конкретными датами или интервалами времени. Темпоральные данные могут быть определены как данные, изменяющиеся со временем.
В настоящее время еще не разработана СУБД, поддерживающая все темпоральные возможности. Для их осуществления в пределах информационной системы (ИС) разработчикам приходится создавать новые средства дополнения и расширения реляционных моделей. Наиболее популярной проблемой создания подобных приложений считается непонимание уровня и способа осуществления поддержки темпоральности в базах данных.
2.1 Темпоральная модель данных
В теории темпоральных БД существует понятие темпоральной модели данных (ТМД) [10]. Это модель данных, которая ориентирована на хранение и обработку темпоральных данных, все ее аспекты также являются темпоральными. В традиционной модели выделяют три компоненты М=(DS, OP, C), где DS - структура данных, OP - операции, С - ограничения целостности. Темпоральная же модель MT=(DST, OPT, CT) поддерживает понятия трех компонент с учетом данных, изменяющихся во времени. Структура модифицируется для осуществления хранения временных данных. Алгебра и операции изменения переопределяются с помощью темпоральной семантики. Кроме того, во временной модели должны поддерживаться аналоги нетемпоральных ограничений. Семантика темпоральных ограничений целостности также должна быть переопределена.
Рассмотрим данные в БД, как отражение окружающего мира в определенный момент времени, а каждую запись, как факт, являющийся истинным на интервале или в данный момент времени. При переходе к темпоральной БД, необходимо указывать интервалы времени, когда каждый из фактов был истинным в описываемом мире. Данное представление времени, когда к данным привязывается промежуток их истинности, называется модельным, или действительным (valid time). Например, фраза «Семья Н. Проживала по этому адресу в период с 11.12.1998 по 30.10.2007» говорит нам о том, что информация о проживании этой семьи по данному адресу верна лишь в заданный период времени и ни днем больше.
Исследователи выделяют и второй тип линии времени - это транзакционное время. Каждая запись когда-либо вносится в БД и удаляется из нее. Удаление объекта происходит только на логическом уровне: информация об объекте сохраняется в базе данных, но он уже не включается в ее текущее состояние. Этот промежуток на временной шкале между созданием и удалением записи часто используется в темпоральных БД. Благодаря этому можно, например, производить сравнение времени записи информации об одном и том же объекте или свойстве и использовать в дальнейшем более новую информацию, полагая ее более достоверной.
Наиболее используема в проектировании ИС битемпоральная модель данных. Эта модель работает как с транзакционным, так и с действительным временем. Именно ее мы будем использовать в данной работе. Важно помнить, что действительное и транзакционное время не обязательно будут совпадать, так как данные могут быть внесены до осуществления события, либо действительное время факта может измениться в последствии.
Рассмотрим пример того, как сопоставляются друг другу действительное и транзакционное время. Допустим в организации имеется таблица с зарплатами сотрудников на данный момент (Табл.2).
Табл. 2 Таблица зарплат без темпоральных расширений
При добавлении поддержки действительного времени, появляется возможность получить полные сведения о зарплатах сотрудников за определенный период, то есть отследить все изменения (Табл.3) и представить данные о зарплате как ряд изменяющихся значений.
Табл. 3. Таблица зарплат с поддержкой действительного времени
Если таблица обладает поддержкой транзакционного времени, можно проследить в какой момент в базу было внесено новое значение (Табл.4).
Табл.4 Таблица зарплат с поддержкой транзакционного времени
Однако самый широко используемый вариант представления данных в таблицах БД - это использование двух типов времени (Табл.5). В этом случае появляется возможность отслеживать, когда были внесены некорректные данные, когда они были исправлены и исключается случай использования неактуальной на данный момент информации.
Табл.5. Таблица с поддержкой обеих линий времени
2.2 Методы представления данных
Для реализации темпоральной поддержки данных в реляционных моделях требуется изменение моделей данных на уровне СУБД, но этот способ достаточно трудоемкий и не всегда является возможным. На практике применяются два основных метода реализации поддержки темпоральной функциональности: реализация ТМД на уровне приложения и расширение нетемпоральной модели данных до темпоральной [14]. Однако первый метод не является универсальным, так как в случае изменения части кода в приложении каждому разработчику приходится проектировать временную семантику заново. Вторая схема - расширение реляционной модели до темпоральной широко используется программистами ТБД, поскольку подразумевает собой модификацию отдельных составляющих модели, таких как ограничение целостности или языка запросов. Структура данных и способ доступа к информации остаются прежними.
Существуют различные ТМД основанные на последнем подходе. Их различие заключается в следующих значимых критериях:
· Тип темпоральных данных (интервальная или точечная интерпретация времени)
· Поддержка темпоральности на уровне кортежа или конкретного атрибута
Как уже было рассмотрено ранее, временные данные в БД могут быть представлены и в дискретном, и в интервальном виде. Точечное представление имеет преимущество в связи с тем, что оно поддерживается стандартом SQL-92. Однако использование лишь одного атрибута времени усложнит запросы и обработку данных, поэтому реализация модели с интервальным представлением времени в этом плане имеет преимущество.
По второму критерию разделяются следующие темпоральные модели данных [11].
1. Темпоральная модель данных, разработанная Р. Снодграсом.
В битемпоральном отношении R содержится набор следующих атрибутов (A1,…, An, T), где Т - определенный на множестве битемпоральных элементов атрибут. Теперь R перепишем следующим образом: R = (A1,…, An, Ts, Te, Vs, Ve). Новые атрибуты Ts, Te, Vs, Ve - это атомарные временные атрибуты, первые два из которых содержат даты начала и конца транзакционного времени (transactional start, end), вторые - действительного времени (valid strart, end). Этот способ представления временных атрибутов является наиболее естественным и часто используемым.
2. Темпоральная модель данных, разработанная К. Дженсеном.
Идея этого представления заключается в том, что исторические кортежи не изменяются, соответственно их можно лишь прочитать. Данная модель данных наилучшим образом подходит для хранения битемпоральных отношений, основанного на архивах. Битемпоральное отношение R с тем же набором атрибутов A1,…, An представим в таком виде: R = (A1,…, An, Vs, Ve, T, Op). Здесь Vs, Ve - также являются датами начала и окончания истинности факта в моделируемом мире, T - время занесения кортежа в базу, а атрибут Op отвечает за создание (I - insert) или удаление (D - delete) кортежа из БД. Изменение записи возможно путем выполнения двух запросов - удаление и создание новой записи с таким же атрибутом Т.
3. Темпоральная модель данных, разработанная С. Гадией.
Данный метод подразумевает, что каждый атрибут, входящий в кортеж, имеет битемпоральные метки. Благодаря этому возможно более гибкое моделирование в реальном мире. В битемпоральном отношении R содержится набор следующих атрибутов (A1,…, An, T), где Т - определенный на множестве битемпоральных элементов атрибут. Далее можно представить отношение R, как отношения, в которых каждому атрибуту сопоставляется собственная темпоральная метка: R=({([Ts, Te] [Vs, Ve] A1)},…, {([Ts, Te] [Vs, Ve] An)}). В каждом кортеже содержится n элементов, представляющих собой набор из трех значений: транзакционное время атрибута [Ts, Te], действительное время [Vs, Ve] и само значение атрибута Ai.
4. Темпоральная модель данных, разработанная E. МакКензи.
Здесь в качестве битемпорального отношения выступает ряд состояний в действительном времени, а вместо индексов записывается транзакционное время. В кортежах с действительным временем атрибутам сопоставляются темпоральные метки. Битемпоральное отношение R, имеющее ряд атрибутов A1,…, An, выражается как отношение, где атрибуты помечены временными метками: R = (VR, T), где VR - отношение в действительном времени; Т - транзакционное время. Модель отношения действительного времени выглядит так: VR = (A1V1,…, AnVn), где A1,…, An - атрибуты, а Vi - атрибут действительного времени, относящийся к каждому атрибуту Ai и отражающий время актуальности этого атрибута в моделируемом мире.
5. Темпоральная модель данных, разработанная Дж. Бен-Зви.
В битемпоральном отношении R содержится набор следующих атрибутов (A1,…, An, T), где Т - определенный на множестве битемпоральных элементов атрибут. Данная модель представляет отношение R таким образом: R = (A1,…, An, Tes, Trs, Tee, Tre, Td). Остановимся на значении каждого атрибута подробнее. Атрибут Tes (effective start) содержит время начала актуальности значения атрибута кортежа. Атрибут Trs - это момент занесения Tes в БД. По аналогии: Tee (effective end) содержит информацию, о времени, когда факт становится не актуальным, а Tre - момент фиксации Tee в БД. В последнем атрибуте Td указывается момент времени, когда запись была удалена из базы данных.
Существуют еще критерии отличия темпоральных баз данных, например, способность работать с некорректно введенными данными. Российские авторы предложили свой взгляд на эту проблему, суть их методов заключается в расширении традиционной модели до темпоральной с помощью добавочных таблиц-связей [12]. Работоспособность данных методов доказана на многочисленных примерах, но нельзя утверждать, что они полностью покрывают все темпоральные возможности с точки зрения определения ТМД.
При работе с темпоральными данными методы индексации, эффективно применяемые в реляционных СУБД, становятся не столь результативными. В исследовании [13] выявляются основные сложности работы с темпоральными базами данных, и одной из них является организация поддержки временных меток, конкретно: поддержание темпоральных отношений в склеенном виде.
При использовании любой темпоральной модели пользователям необходимо, чтобы временные данные были представлены в склеенном состоянии, что ускорит их обработку и сделает их использование более удобным. Склеенность можно трактовать следующим образом: если имеются два кортежа, не темпоральные атрибуты которых совпадают, то их временные атрибуты, представленные в виде интервалов должны:
- не пересекаться, иначе они заменяются одним интервалом, представляющим собой объединение
- не быть смежными, иначе они должны быть заменены на один интервал, являющийся так же объединением
Важно отметить, что при выполнении операций агрегации, произведения или проекции и использовании отношений, хранящихся в склеенном виде, могут получиться «не склеенные» отношения.
3. Разработка концепции базы данных на основе реляционной СУБД
3.1 Темпоральная надстройка над реляционными СУБД
Одно из преимуществ реляционных баз данных состоит в том, что они работают с ограничениями целостности на обрабатываемые данные - это ограничения внешних и первичных ключей. Но для темпоральных данных необходимо более подробно рассматривать процесс осуществления ограничений и корректного хранения. В этом случае важно принимать во внимание временные стороны сущностей.
Самые распространенные и широко используемые СУБД, такие как Oracle, MySQL Server, PostgreSQL, автоматически поддерживают ограничения первичного и внешнего ключей. Значение первичного ключа априори должно являться уникальным, поэтому атрибуты, на которые ссылается внешний ключ будут уникальными.
Сейчас крупные реляционные СУБД обрабатывают данные из БД с помощью языка запросов SQL. Темпоральные данные могут быть обработаны на его основе, но этот метод будет иметь ряд минусов, например:
- в каждом конкретном приложении нужно выполнять независимую темпоральную поддержку
- скорее всего в временном SQL-запросе появится множество ошибок в связи с его громоздкостью.
С связи с распространением временных БД, для хранения и работы со всеми историческими изменениями появился особый класс СУБД, называемый темпоральными или временными СУБД. В таких СУБД реализация ограничений целостности и запросов для данных, которые изменяются во времени, становится на много проще, в сравнении с классическими СУБД.
Время в темпоральных БД воспринимается как целое измерение, притом абсолютно независимое, управляемое самой СУБД и не представляющееся в виде атрибутов сущностей. Кроме того оперирование временем происходит в виде интервалов или наборов интервалов, что сильно отличается от моментального представления. Следовательно, можно сделать вывод, что временные СУБД и языки запросов значительно разнятся с реляционными.
Как уже упоминалось в данной работе, еще не создана СУБД широкого пользования, осуществляющая поддержку временных данных в полном объеме. В связи с этим программисты решают данную проблему при помощи темпоральных надстроек над реляционными СУБД [15]. Приложение клиента посылает запрос не напрямую к СУБД, а к реализованной надстройке, которая изменяет темпоральный клиентский запрос и посылает преобразованный запрос в СУБД на понятном ей языке (Рис. 2). Такая схема обладает большим преимуществом, так как надстройка никак не изменяет реализацию реляционной СУБД. Это позволяет нам использовать всю существующую функциональность классических СУБД. Однако у этого метода есть и недостатки: при его применении использование техники оптимизации, основанной на таких механизмах, как темпоральная структура хранения, темпоральные индексы и темпоральные соединения, представляется невозможным.
Рис. 2. Схема расширения реляционной СУБД до темпоральной
Базу для создания темпоральной надстройки составляет совокупность положений, предоставляющая возможность осуществления алгоритма трансляции поступающих темпоральных запросов в запросы SQL. Далее будут рассмотрены эти правила и некоторые из алгоритмов их реализации.
3.2 Темпоральная надстройка над SQL
Для решения задачи создания темпоральной надстройки над СУБД в 1994 году было разработано расширение SQL/Temporal.
В стандарте SQL-92 временные аспекты данных можно поддерживать с помощью лишь трех типов данных: TIME, DATE, TIMESTAMP. Что касается стандарта SQL/Temporal, здесь возможности хранения подобных данных были расширены, и была осуществлена почти полноценная обработка темпоральности. Язык дополнен типом данных PERIOD и связанными с ним предикатами и функциями. Атрибуты такого типа выражают интервалы транзакционного или действительного времени.
При создании темпоральной надстройки над СУБД для работы с существующей реляционной БД необходимо сохранять поддержку имеющихся данных и приложений, спроектированных ранее, так, чтобы они не требовали изменений в коде. Таким образом, SQL/Temporal является дополнением SQL, расширяя его семантику и синтаксис, обеспечивает его обратную совместимость. Требование обратной темпоральной совместимости можно сформулировать так: любой запрос SQL, реализованный на темпоральной и на не темпоральной аналогичной таблице, должен иметь сходные результаты.
При необходимости добавления в таблицу временной поддержки данных, либо создания новой темпоральной таблицы используются следующие конструкции: ALTER TABLE… ADD VALIDTIME или CREATE TABLE… AS VALIDTIME. В случае если темпоральная поддержка добавляется в обычную реляционную таблицу, в нее добавляются новые атрибуты, обозначающие интервал от времени модификации таблицы и до следующего ее изменения.
Каждый темпоральный запрос рассматривает исторические данные состояний таблицы, в отличие от классических запросов, работающих только с текущим положением. Результатом темпорального запроса является таблица тоже с поддержкой времени. Данная таблица может рассматриваться как совокупность состояний, которые соотносятся со своим интервалом времени, для которого данное состояние было действительным. По тому, как сопоставляется набор состояний итоговой таблицы с состояниями первоначальной, выделяют два типа темпоральных запросов: несерийные (NONSEQUENCED) и серийные (SEQUENCED).
Серийными являются запросы, представляющие собой как бы логическое обобщение для классического SQL-запроса. При использовании темпорального SQL-3 серийные запросы по написанию очень похожи на свою подобную нетемпоральную модель. Отличие их состоит в записанном впереди главного слова: VALIDTIME[15].
Наглядная модель серийного запроса q' изображена на Рис. 3.1. Он представляет собой логическое расширение классического запроса q. В результате выполнения классического запроса q получается реляционная таблица, так как обращается он к последнему действительному на данный момент состоянию таблицы, которая поддерживает временные атрибуты. Серийный же темпоральный запрос выполняет данный запрос q над всеми состояниями исходной таблицы (на картинке верхний ряд) и записывает новое состояние в итоговую таблицу. Как результат он имеет поддерживающую пользовательское время темпоральную таблицу.
Рис. 3.1. Серийный темпоральный запрос
Серийные операции модификации выполняются подобно случаю с запросами. Здесь серийная операция обновления является расширением классической операции u. В результате выполнения операции модификации u' получаем ряд состояний, содержащий преобразованные с помощью операции u соответствующие состояния первоначальной таблицы (Рис. 3.2).
Рис. 3.2. Серийная темпоральная операция модификации
При выполнении серийного запроса, в итоговой таблице с темпоральной поддержкой оказываются состояния, полученные каждый из одного конкретного состояния в определенный момент времени одной или нескольких первоначальных таблиц. Несерийные же темпоральные запросы для получения конечных состояний используют абсолютно все имеющиеся состояния в первоначальной таблице (Рис. 3.3). Здесь вверху и внизу изображены таблицы с темпоральной поддержкой и их состояния в разные моменты времени. Первоначальная таблица находится вверху, итоговая, полученная при выполнении запроса q над состояниями верхней таблицы - внизу. Следовательно, несерийный запрос можно определить, как запрос, который для вычисления результирующих состояний использует состояния исходной таблицы не только в данный момент времени, но и в другие. Записан такой запрос может быть с использованием следующей добавки: NONSEQUENCED VALIDTIME.
Рис. 3.3. Несерийный темпоральный запрос
При использовании несерийных запросов пользователю приходится вручную высчитывать временные метки, для серийных же есть автоматическая поддержка.
Подобно несерийному запросу введем понятие несерийной операции модификации. При выполнении таких изменений для модификации конкретого состояния необходима информация обо всех состояниях в первоначальной таблице. Схематическая модель такой операции изображена на Рис. 3.4.
Рис. 3.4. Несерийная темпоральная операция модификации
3.3 Реализация надстройки для поддержки временных данных
В связи отсутствием СУБД, поддерживающих временные данные, выделим три основных подхода к работе с темпоральностью:
· Первый из них - темпоральная поддержка СУБД, предоставляет абсолютную поддержку временных данных, но для него необходимо преобразование ядра СУБД с изменением структур данных. Этот метод довольно трудоемкий и ресурсозатратный, поэтому нами он не рассматривается. Остальные два метода позволяют не вмешиваться в структуру существующей СУБД и задействовать всю ее мощность (индексация, транзакции, восстановление данных).
· Второй подход подразумевает поддержку темпоральных данных через создание библиотеки, транслирующей темпоральные запросы, например, на на языке SQL/Temporal в запросы SQL. Эта реализация является довольно сложной, так как необходимо реализовать транслятор, который будет обращаться к базе данных и парсер языка темпоральной алгебры.
· И последний метод основывается на том, что в каждом конкретном приложении осуществляется своя работа с темпоральными данными. Этот метод мы и рассмотрим дальше в данной работе на примере БД для консалтинговой компании. Чтобы при изменении структуры БД не пришлось переписывать все темпоральные методы, необходимо в приложении реализовать универсальные методы трансляции темпоральной алгебры на SQL.
Все темпоральные запросы могут быть преобразованы в терминах операций реляционной алгебры. Для трансляции в приложении выражений временной алгебры в конструкцию SQL-92 созданы специальные методы, которые отвечают за каждое выражение в темпоральной алгебре. Методы преобразовывают выражение с входными данными во внутреннее представление приложения, затем транслируются в SQL-92 и передаются на выполнение в СУБД. Результаты выдаются на экран или в файл.
Задача создания методов трансляции и создания надстройки над СУБД будет решена с помощью прикладной программы, написанной на языке Java. Такая надстройка может быть модифицирована и использована для любых баз данных.
Для удобства подключения к базе данных MySQL и ускорения разработки прикладной программы нами был использован фреймворк Hibernate. Он позволяет обращаться с реляционной БД с помощью запросов «Criteria» как с обычными объектами ООП.
3.4 Темпоральная алгебра
Рассматриваемая темпоральная алгебра состоит из семи операций, перечисленных в таблице 6. Каждая операция должна возвращать отношение в склеенном состоянии. Результат некоторых операций всегда является склеенным, если переданные в качестве параметров отношения склеенные.
Далее подробно рассматривается семантика каждой из операций и правила ее трансляции в SQL-выражения. Для обозначения строк в таблицах, поддерживающих пользовательское время, используется t||VT. t обозначает атрибуты, a VT - временную метку. Начало и конец временной метки обозначаются, как VT- и VT+, соответственно. Кроме того, используется операция склейки coal(r), семантика которой описана ниже.
Табл. 6. Операции темпоральной алгебры
1. Темпоральная выборка
Темпоральная выборка вычисляется по следующей формуле:
Она фактически совпадает с операцией селекции из реляционной алгебры Кодда при условии, что временная метка задается обычными атрибутами.
Результат селекции всегда является склеенным. В результирующее отношение входит только часть кортежей исходного отношения и других кортежей в нем нет, поэтому появление в результирующей таблице записей с одинаковыми пользовательскими атрибутами и пересекающимися временными метками означало бы наличие таких записей в исходном отношении, что противоречит его склеенности.
Таким образом, операция темпоральной селекции может быть записана как простая селекция на языке запросов SQL:
SELECT * FROM table WHERE condition
2. Темпоральная проекция
Темпоральная проекция задается формулой:
Здесь f задает набор пользовательских атрибутов, по которым производится проекция. При вычислении результатов проекции требуется дополнительная склейка, т.к. удаление из кортежей склеенного отношения некоторых пользовательских атрибутов может привести к нарушению склеенности таблицы.
Таблица, передаваемая в качестве параметра операции склейки, может быть вычислена следующим образом (помимо пользовательских атрибутов в результат должна входить временная метка):
SELECT a1,…, an, valid_begin, valid_end FROM r;
Предполагается, что проекция таблицы r производится по пользовательским атрибутам a1,…, an.
3. Темпоральное объединение
Темпоральное объединение вычисляется по формуле:
Результат необходимо приводить к склеенному состоянию, т.к. в объединяемых таблицах могут быть записи с одинаковыми пользовательскими атрибутами и пересекающимися либо смежными временными метками.
Параметр операции coal может быть вычислен достаточно просто:
SELECT * FROM r1 UNION SELECT * FROM r2
При этом необходимо гарантировать, что типы атрибутов на соответствующих местах совпадают.
4. Темпоральное пересечение
Темпоральное пересечения вычисляется по формуле: intersect
Результат пересечения двух склеенных таблиц всегда является склеенным. Если в результате содержатся две записи с одинаковыми пользовательскими атрибутами и пересекающимися временными метками, то, по крайней мере, в одной из исходных таблиц было две записи с такими же пользовательскими атрибутами и временными метками содержащими временные метки записей результата. Поскольку такие метки не меньше меток соответствующих записей результирующего отношения, то они обязаны пересекаться, что противоречит предположению о склеенности исходных таблиц.
5. Темпоральная разность
Разность двух темпоральных отношений вычисляется по следующей формуле:
В результат входят все записи из первой таблицы, для которых не существует записей с такими же значениями пользовательских атрибутов во второй таблице, и записи, для которых существуют записи во второй таблице. При этом временная метка записи результата является максимальным интервалом, содержащимся в соответствующей временной метке записи из первой таблицы, не пересекающимся с временными метками записей второй таблицы с такими же значениями пользовательских атрибутов.
6. Темпоральное произведение
Операция темпорального произведения задается следующей формулой:
To есть в результате должно получиться темпоральное отношение, набор атрибутов которого состоит из всех атрибутов отношения в левой части и атрибутов отношения в правой части, которых нет в левой. Атрибуты с одинаковыми именами должны иметь одинаковые значения, поэтому в результат из каждой пары равных атрибутов включается только один.
7. Темпоральная агрегация
Результат темпоральной агрегации задается следующей формулой:
Здесь agg - это функция-агрегат (например, COUNT, AVG, MAX и т.п.). Значение такой функции для каждого момента времени вычисляется на наборе всех кортежей, временная метка которых содержит данный момент и пользовательские атрибуты, заданные функцией f(), совпадают.
8. Склейка
Все операции рассматриваемой темпоральной алгебры должны возвращать таблицы в склеенном состоянии. Как было показано выше, реализация на SQL некоторых из них, принимая таблицы в склеенном виде, всегда возвращает склеенный результат, другие же (проекция, объединение, агрегация) могут вернуть не склеенную таблицу, которую нужно привести к склеенному виду.
Операция склейки используется для вычисления максимальных непрерывных интервалов для кортежей с одинаковыми наборами пользовательских атрибутов. В результате склейки отношения, все кортежи с одинаковыми пользовательскими атрибутами и смежными либо пересекающимися временными метками должны быть заменены одним кортежем с таким же набором пользовательских атрибутов и временной меткой, представляющей объединение всех временных меток исходных кортежей.
Операция склейки может быть вычислена следующим образом:
4. Разработка концепции базы данных в сфере консалтинга
4.1 Основные требования к разрабатываемому программному продукту
1. База данных разрабатывается с использованием инструментальных средств СУБД MYSQL с использованием удобного инструмента для визуального проектирования БД - MySQL Workbench. Данный программный продукт предоставляет возможность наглядно изобразить модель базы данных в графическом виде, создать необходимые таблицы и установить связи между ними и т.п.
2. Для реализации методов темпоральной логики был использован язык Java с фреймворком Hibernate для удобной синхронизации и работы с базой данных. Это обусловлено современностью и удобством применения данных программных продуктов с точки зрения разработчика.
3. В основе разрабатываемого приложения лежит модель структуры темпоральных данных, представленная Р. Снодграсом и реализующая темпоральные характеристики на уровне кортежа. Этот способ был выбран в связи с наибольшей естественностью и простотой осуществления по сравнению с другими.
4. Для придания разработке функциональной направленности в качестве конкретного примера рассматривается база данных, удовлетворяющая потребности сферы консалтинга.
4.2 Реализация темпоральной модели в терминах СУБД MYSQL
Данный раздел мы посветим реализации темпоральной модели данных в БД консалтинговой компании. Нам предстоит определить основные элементы структуры предметной области, связь этих элементов между собой и общую концепцию представления этих элементов.
Процедура моделирования предметной области состоит из двух основных этапов, которые будут последовательно разобраны.
Первая стадия процедуры моделирования (начало работы с проектом) состоит в определении цели моделирования и выделении основных сущностей, находящихся в пределах моделируемой проблемной области.
В нашем случае основной целью моделирования является разработка схемы базы данных консалтинга. Основными информационными единицами являются Компания (Company), Сотрудник (Employee), Проект (Project), Должность (Position) и Прибыль (Profit). Каждая выделенная сущность характеризуется своим именем и определением (назначением).
На второй стадии происходит определение связей между сущностями и атрибутов сущностей.
· Первая сущность - Company. Данная таблица хранит информацию обо всех организациях, с которыми сотрудничает рассматриваемая консалтинговая фирма. В качестве атрибутов выступают:
Сompany_id - первичный ключ (PK) данной таблицы,
Сompany_name - название компании,
Сompany_establish - дата основания компании,
Сompany_adress - адрес компании,
Employee_Employee_director - директор организации (внешний ключ - FK).
· Таблица Profit - в ней хранится подробная информация о ежемесячной выручке, затратах и прибыли организаций. Таблица содержит следующие атрибуты:
Profit_id - первичный ключ (PK) таблицы,
Profit_month - месяц, за который вносятся данные,
Profit_year - год за который вносятся данные,
Profit_income - доход за указанный месяц,
Profit_spend - расходы за указанный месяц,
Profit_profit - прибыль за месяц,
Profit_transact_time - дата занесения информации в БД,
Company_Company_id - id компании (FK).
· Таблица Employee - данная таблица хранит в себе информацию о всех сотрудниках, трудящихся в компаниях - клиентах. Набор атрибутов таблицы:
Employee_id - PK таблицы,
Employee_name - имя сотрудника,
Employee_surname - фамилия сотрудника,
Employee_patronymic - отчество сотрудника,
Employee_civility - пол сотрудника,
Employee_adress - адрес сотрудника,
Compamy_company_id - id компании (FK).
· Таблица Project - темпоральная таблица, содержит информацию о всех прошлых, текущих и будущих проектах компаний. Атрибуты:
Project_id - РК таблицы,
Project_name - название проекта,
Project_start - дата начала проекта,
Project_end - реальная или планируемая дата завершения проекта,
Project_cost - стоимость проекта в рублях,
Project_transact_time - дата внесения информации по проекту в БД.
· Таблица Position - хранит все активные и неактивные должности в компании. Атрибуты таблицы:
Position_id - РК таблицы,
Position_name - название должности.
· Таблица Temp_position - таблица с темпоральной поддержкой, содержащая историческую информацию о занимаемых должностях каждого работавшего и работающего сотрудника в компании - дата начала и дата окончания работы сотрудника. Атрибуты:
Temp_position_id - РК таблицы,
Temp_position_start - дата начала работы в данной должности,
Temp_position_end - дата, с которой сотрудник больше не выступает в данной должности,
Temp_position_transact_time - дата занесения информации в БД,
Employee_Employee_id - id сотрудника (FK), занимающего должность,
Position_Position_id - id должности (FK).
· Таблица Temp_Selary - темпоральная таблица, предоставляющая исторические данных о всех зарплатах и их изменениях за различные периоды. В таблице содержатся следующие атрибуты:
Temp_Salary_id - первичный ключ таблицы,
Temp_Salary_amount - заработная плата сотрудника в рублях,
Temp_Salary_start - дата, начиная с которой сотрудник получает указанную заработную плату,
Temp_Salary_end - дата, начиная с которой сотрудник не получает указанную заработную плату,
Temp_Salary_transact_time - дата занесения информации в БД,
Employee_Employee_id - id сотрудника (FK).
На данном этапе следует определить связи между сущностями. С помощью программного обеспечения MySQL с использованием удобного инструмента для визуального проектирования БД - MySQL Workbench нами была построена диаграмма сущностей и построены отношения между ними (Рис. 4).
В основном между объектами устанавливается «неидентифицирующая связь» - такая связь, при которой экземпляр дочерней сущности не идентифицируется через свою связь с родительской сущностью. Таким образом, создается обыкновенный внешний ключ, причем в дочернюю таблицу добавляется столбец - первичный ключ родительской таблицы. Например, неидентифицирующей является связь «Работает» между Сотрудниками (дочерняя таблица) и Компанией (родительская таблица), связь один-ко-многим; или связь «Руководит» между этими таблицами, связь один-к-одному.
Между таблицами «Сотрудник» и «Проект» устанавливается связь многие-ко-многим, так как один сотрудник может быть задействован в нескольких проектах, и один проект ведут несколько сотрудников. Так как связь многие-ко-многим возможна только в логической модели данных, на физическом уровне связь многие-ко-многим преобразуется в две новые связи один-ко-многим от старых сущностей к новой добавленной ассоциативной сущности, в нашем случае к Employee_has_Project (Рис. 4).
· Таблица Employee_has_Project - информирует о том, в каких проектах задействован каждый из сотрудников. В таблице 2 атрибута:
Employee_Employee_id - id сотрудника, участвующего в проекте,
Project_Project_id - id проекта.
Рис. 4. Диаграмма сущностей БД консалтинга
Связь один-ко-многим между сущностями Компания и Прибыль означает, что информация о прибыли и расходах компании хранится за каждый месяц. Соответственно, одной компании будет соответствовать множество строк, описывающие прибыль за разные месяцы.
Связь один-ко-многим между сущностями Сотрудник и Темпоральная зарплата подразумевает всю историю зарплат имеющихся сотрудников. Следовательно, каждому сотруднику в таблице Темпоральная зарплата будет соответствовать некоторое количество строк, предоставляющее информацию о зарплатах в разные периоды работы в компании.
Связь один-ко-многим, соединяющая сущности Сотрудник и Темпоральная позиция, аналогично предыдущей связи означает, что у каждого сотрудника в таблице Темпоральная должность хранится вся история его должностей в данной компании. Значит каждому сотруднику в этой таблице будет соответствовать от одной до нескольких строк (если занимаемая должность в компании изменялась).
И последняя связь один-ко-многим между сущностями Позиция и Темпоральная позиция трактуется следующим образом: одна и та же позиция в компании в разное время занята разными людьми. Следовательно одной должности в таблице Темпоральная позиция будут ставиться в соответствие разные сотрудники с указанием времени их работы на данной должности.
4.2 Темпоральная надстройка
На данном этапе перед ними стоит цель создания темпоральной надстройки. В качестве языка программирования был выбран объектно-ориентированный язык Java.
Для доступа к данным из БД используется фреймворк Hibernate, который подключается к нашей БД MySQL с помощью стандартного драйвера JDBC. Для настройки подключения Hibernate к БД используется файл конфигураций hibernate.cfg.xml, в котором необходимо указать данные соединения, некоторую служебную информацию и указать ресурсы, которые будут использоваться из БД (Рис. 5).
Рис. 5. Файл конфигураций Hibernate
После подключения Hibernate необходимо создать классы сущностей, которые будут соответствовать таблицам из БД. Кроме того, все связи указываются в отдельных xml файлах. Один из примеров таких файлов для таблицы Temp_position:
<? xml version='1.0' encoding='utf-8'?>
<! DOCTYPE hibernate-mapping PUBLIC
«- //Hibernate/Hibernate Mapping DTD 3.0 //EN»
«http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd»>
<hibernate-mapping>
<class name= «vera.db.methods.entities. TempPosition» table= «Temp_position» schema= «mydb»>
<id name= «tempPositionId»>
<column name= «Temp_position_id» sql-type= «int(11)»/>
</id>
<property name= «tempPositionStart»>
<column name= «Temp_position_start» sql-type= «date»/>
</property>
<property name= «tempPositionEnd»>
<column name= «Temp_position_end» sql-type= «date» not-null= «true»/>
</property>
<many-to-one name= «employeeEmployeeId» column= «Employee_Employee_id» class= «vera.db.methods.entities. Employee»
lazy= «false» fetch= «join» not-null= «true» />
<many-to-one name= «positionPositionId» column= «Position_Position_id» class= «vera.db.methods.entities. Position»
lazy= «false» fetch= «join» not-null= «true» />
<property name= «tempPositionTransactTime»>
<column name= «Temp_position_transact_time» sql-type= «date»/>
</property>
</class>
</hibernate-mapping>
В первую очередь необходимо реализовать темпоральную алгебру из предыдущей главы. Нужно реализовать обработчик, который будет преобразовывать входные данные в SQL-запрос.
Интерфейс темпоральной алгебры будет состоять из следующих 7-ми методов:
public interface TempAlgebraDao {
List<Object> selection (Object table, String condition);
List<Object> projection (Object table, Date valid_begin, Date valid_end);
List<Object> union (Object r1, Object r2);
List<Object> intersection (Object r1, Object r2);
List<Object> difference (Object r1, Object r2);
List<Object> composition (Object r1, Object r2);
List<Object> aggregation (Object r, String agg);
},
где каждый из методов отвечает за отдельную операцию: выборка, проекция, объединение, вычетание и т.д.
Чтобы реализовать этот интерфейс мы будем использовать класс org.hibernate.criterion. Criterion для обработки и трансляции входных данных и данных из БД в SQL-запрос. Результаты работы методов должны формировать SQL-запросы для каждой операции темпоральной алгебры.
· Так, для операции темпоральной выборки получаем на выходе SQL-запрос к реляционной БД (Рис. 6):
Рис. 6. Темпоральная выборка
· При выполнении метода, отвечающего за темпоральную проекцию, имеем следующий SQL-запрос (Рис. 7):
Рис. 7. Темпоральная проекция
Где r - таблица, а a1,…, an - атрибуты.
· Темпоральное объединение выполняется следующим запросом (Рис. 8):
Рис. 8. Темпоральное объединение
· Результат пересечения двух таблиц r1 и r2 c пользовательскими атрибутами а1,…, аn и b1,…, bn соответственно, можно вычислить с помощью SQL-выражения (Рис. 9):
Рис. 9. Темпоральное пересечение
· Темпоральную разность таблиц l и r можно найти с помощью следующего SQL-запроса (таблицы имеют наборы пользовательских атрибутов а1,…, аn и b1,…, bn, соответственно) (Рис. 10):
Рис. 10. Темпоральная разность
· Темпоральное произведение паблицы l с пользовательскими атрибутами а1,…, аk, c1,…, cn и r с пользовательскими атрибутами b1,…, bm, c1,…, cn можно вычислить с помощью следующего SQL-запроса (Рис. 11):
Рис. 11. Темпоральное произведение
· Темпоральную агрегацию в несклеенном виде (до применения операции coal) для отношения r с пользовательскими атрибутами a1,…, am, g1,…, gn, агрегирующей функции f и набором атрибутов, по которым производится группировка записей для агрегирующей функции g1,…, gn, можно вычислить с помощью следующей полседовательности SQL-выражений (Рис. 12):
Рис. 12. Темпоральная агрегация
· На SQL склейку таблицы r с пользовательскими атрибутами a1,…, an можно записать следующим образом (Рис. 13):
Рис. 13. Склейка
После реализации темпоральной алгебры любой темпоральнй запрос может быть транслирован в реляционный. Наконец, для дополнительной обработки темпоральной информации будем использовать дополнительные методы, результат которых так же будет SQL-запрос к нашей БД.
Например, для поиска максимального дохода за некоторый промежуток времени реализуем метод maxProfitIncome, в который передается интервал времени.
public List<Profit> maxProfitIncome (int startMonth, int endMonth) {
sf = HibernateUtil.getSessionFactory();
sf.getCurrentSession();
Session session = sf.openSession();
DetachedCriteria maxId = DetachedCriteria.forClass (Profit.class)
setProjection (Projections.max («profitIncome»));
Criteria criteria = session.createCriteria (Profit.class)
add (Restrictions.between («profitMonth», startMonth, endMonth)).add (Property.forName («profitIncome»).eq(maxId));
return criteria.list();
}
Так же для определения зарплаты сотрудника метод getSalary, который принимает на вход сотрудника и интервал времени.
public List<TempSalary> getSalary (Employee employee, Date start, Date end) {
sf = HibernateUtil.getSessionFactory();
Session session = sf.openSession();
Criteria criteria = session.createCriteria (Profit.class)
add (Restrictions.ge («Temp_Salary_Start», start)).add (Restrictions.lt («Temp_Salary_Start», end));
return criteria.list();
}
Заключение
В процессе выполнения выпускной квалификационной работы по теме «Исследование и разработка темпоральнои? базы данных» получены следующие результаты:
1. Исследованы и проанализированы основные модели представления временного фактора в теории интеллектуальных систем, а именно: темпоральные интервальная (представление времени с помощью временных интервалов) и точечная (использование в качестве базовых элементов временных точек) логики. Идея представления времени с использованием временных интервалов проиллюстрирована на примере темпоральной логики Allen [7], а точечный подход проиллюстрирован на примере темпоральной логики McDermott [8].
2. Исследованы и проанализированы темпоральная модель данных (ТМД) и ее различные модификации и темпоральная логика, служащая основой языка запросов ТМД при построении временной БД.
3. Разработана основная концепция (базовые элементы и связи) ТМД, построена ER-диаграмма для обеспечения области консалтинга
4. Средствами СУБД MySQL была спроектирована и создана БД для консалтинга. С помощью объектно-ориентированного языка программирования Java с фреймворком Hibernate была разработана темпоральная надстройка над реляционной БД, опирающаяся на основные принципы темпоральной алгебры и транслирующая темпоральные запросы в запросы SQL.
Выпускная квалификационная работа имеет множество путей для дальнейшего развития. В будущем может быть создан интерфейс, реализована поддержка пользователя с всплывающими подсказками. Кроме того, работа является первым шагом в исследовании темпоральных баз данных, ведь сейчас данное направление исследуется многими крупными фирмами-разработчиками, и ведутся попытки реализации темпоральной СУБД, которая будет учитывать все возможности темпоральной поддержки.
Список использованных источников
1. Yoav Shoham. Reasoning about Change. - The MIT Press Series in Artificial Intelligence, 1988.
2. Е.Ю. Кандрашина, Л.В. Литвинцева, Д.А. Поспелов. - Представление знаний о времени и пространстве в интеллектуальных системах. - М.: Наука, 1989.
3. A. Pnueli. A temporal logic of programs. - Proceedings of 18th FOCS, October 1977.
4. V.R. Pratt. Semantical Considerations on floyd-hoare logic. - Proceedings of 17th FOCS, IEEE, October 1976.
5. H. Nishimura. Descriptevely complete process logic. - Acta Informatica, 1980.
6. J.F. Allen and P.J. Hayes. A common-sense theory of time. - Proceedings of 9th IJCAI, Los Angeles, 1985.
7. J.F. Allen. Towards a general theory of action and time. - Artificial Intelligence, 23 (2), 1984.
8. D. McDermott. A temporal logic for reasoning about processes and plans. - Cognitive science, 1982.
9. А. Тейз, П. Грибомон. Логический подход к искусственном интеллекту: От модальной логики к логике баз данных: Пер. с франц. - М.: Мир, 1998.
10. Snodgrass R. Developing Time-Oriented Database Applications in SQL - Morgan Kaufmann Publishers, 1999.
11. Jensen C.S., Soo M.D., Snodgrass R.T. Unifying Temporal Data Models Via a Conceptual Model, Information Systems Vol. 19, No. 7, 1994.
12. Пораи? Д.С., Соловьев А.В., Корольков Г.В. Реализация концепции темпоральнои? базы данных средствами реляционнои? СУБД // Документооборот. Концепции и инструментарии?: сб. науч. тр. / Ин-т системного анализа РАН; под ред. В.Л. Арлазарова, Н.Е. Емельянова. М.: Едиториал УРСС, 2004.
13. К.Дж. Дейт. Введение в системы баз данных, 7-е издание. Вильямс, 2002.
14. А.Н. Базаркин. Разработка темпоральнои? модели данных в медицинскои? информационнои? системе. тр. Междунар. конф.: ИПС РАН, Переславль-Залесскии?, 2006.
15. Нгуен Доан Куонг. Организация доступа, хранения и извлечения знаний в темпоральных базах данных. Санкт-Петербург, 2006.
16. Б.Б. Костенко, С.Д. Кузнецов. История и актуальные проблемы темпоральных баз данных, МГУ, 2007, Эл. ресурс: http://www.citforum.ru/
database/articles/temporal
17. McKenzie E., Snodgrass R. Supporting Valid Time in an Historical Relational Algebra: Proofs and Extensions: Technical Report Department of Computer Science, University of Arizona. Tucson, AZ, 1991.
Приложение
Интерфейсы:
package impl;
import vera.db.methods.entities. Profit;
import java.util. List;
public interface ProfitDao {
List<Profit> getProfit();
List<Profit> getProfit (int month, int year);
List<Profit> maxProfitIncome (int startMonth, int endMonth);
List<Profit> minProfitIncome (int startMonth, int endMonth);
List<Profit> maxProfitConsumption (int startMonth, int endMonth);
List<Profit> minProfitConsumption (int startMonth, int endMonth);
}
package impl;
import java.util. Date;
import java.util. List;
public interface TempAlgebraDao {
List<Object> selection (Object table, String condition);
List<Object> projection (Object table, Date valid_begin, Date valid_end);
List<Object> union (Object r1, Object r2);
List<Object> intersection (Object r1, Object r2);
List<Object> difference (Object r1, Object r2);
List<Object> composition (Object r1, Object r2);
List<Object> aggregation (Object r, String agg);
}
Реализация:
package dao;
import impl. ProfitDao;
import org.hibernate. Criteria;
import org.hibernate. Session;
import org.hibernate. SessionFactory;
import org.hibernate.criterion.*;
import utils. HibernateUtil;
import vera.db.methods.entities. Profit;
import java.util. List;
public class ProfitDaoImpl implements ProfitDao {
private SessionFactory sf;
public List<Profit> getProfit() {
sf = HibernateUtil.getSessionFactory();
Session session = sf.openSession();
List profits = session.createQuery («from Profit»).list();
session.close();
return profits;
}
public List<Profit> getProfit (int month, int year) {
sf = HibernateUtil.getSessionFactory();
Session session = sf.openSession();
List profits = session.createQuery («from Profit where profitMonth =» + month + «and profitYear =» + year).list();
session.close();
return profits;
}
public List<Profit> maxProfitIncome (int startMonth, int endMonth) {
sf = HibernateUtil.getSessionFactory();
sf.getCurrentSession();
Session session = sf.openSession();
DetachedCriteria maxId = DetachedCriteria.forClass (Profit.class)
setProjection (Projections.max («profitIncome»));
Criteria criteria = session.createCriteria (Profit.class)
add (Restrictions.between («profitMonth», startMonth, endMonth)).add (Property.forName («profitIncome»).eq(maxId));
return criteria.list();
}
public List<Profit> minProfitIncome (int startMonth, int endMonth) {
sf = HibernateUtil.getSessionFactory();
sf.getCurrentSession();
Session session = sf.openSession();
DetachedCriteria maxId = DetachedCriteria.forClass (Profit.class)
setProjection (Projections.min («profitIncome»));
Criteria criteria = session.createCriteria (Profit.class)
add (Restrictions.between («profitMonth», startMonth, endMonth)).add (Property.forName («profitIncome»).eq(maxId));
return criteria.list();
}
public List<Profit> maxProfitConsumption (int startMonth, int endMonth) {
sf = HibernateUtil.getSessionFactory();
sf.getCurrentSession();
Session session = sf.openSession();
DetachedCriteria maxId = DetachedCriteria.forClass (Profit.class)
setProjection (Projections.max («profitSpend»));
Criteria criteria = session.createCriteria (Profit.class)
add (Restrictions.between («profitMonth», startMonth, endMonth)).add (Property.forName («profitIncome»).eq(maxId));
return criteria.list();
}
public List<Profit> minProfitConsumption (int startMonth, int endMonth) {
sf = HibernateUtil.getSessionFactory();
sf.getCurrentSession();
Session session = sf.openSession();
DetachedCriteria maxId = DetachedCriteria.forClass (Profit.class)
setProjection (Projections.min («profitSpend»));
Criteria criteria = session.createCriteria (Profit.class)
add (Restrictions.between («profitMonth», startMonth, endMonth)).add (Property.forName («profitIncome»).eq(maxId));
return criteria.list();
}
}
package dao;
import impl. Temp_SalaryDao;
import org.hibernate. Criteria;
import org.hibernate. Session;
import org.hibernate. SessionFactory;
import org.hibernate.criterion. DetachedCriteria;
import org.hibernate.criterion. Projections;
import org.hibernate.criterion. Property;
import org.hibernate.criterion. Restrictions;
import utils. HibernateUtil;
import vera.db.methods.entities. Employee;
import vera.db.methods.entities. Profit;
import vera.db.methods.entities. TempSalary;
import java.util. Date;
import java.util. List;
public class Temp_SalaryDaoImpl implements Temp_SalaryDao {
private SessionFactory sf;
public List<TempSalary> getSalary() {
sf = HibernateUtil.getSessionFactory();
Session session = sf.openSession();
List tempSalary = session.createQuery («from TempSalary»).list();
session.close();
return tempSalary;
}
public List<TempSalary> getSalary (Employee employee, Date start, Date end) {
sf = HibernateUtil.getSessionFactory();
Session session = sf.openSession();
// DetachedCriteria maxId = DetachedCriteria.forClass (TempSalary.class)
// .setProjection (Projections.max («profitIncome»));
Criteria criteria = session.createCriteria (Profit.class)
add (Restrictions.ge («Temp_Salary_Start», start)).add (Restrictions.lt («Temp_Salary_Start», end));
return criteria.list();
}
}