- •Национальный исследовательский
- •Университет
- •В ы п у с к н а я р а б о т а
- •Введение
- •Глава 1 общие сведения об онтологиях и языках для спецификации онтологий
- •1.1. Содержание онтологии
- •1.2 Цели создания онтологий
- •1.3. Области применения онтологий
- •1.4. Формальная концептуализация и формальные онтологии
- •1.5. Формальная модель понятия и концептуальные языки
- •Глава 2 бинарная модель знаний
- •2.1. Синтаксис имен, используемых в бмз
- •2.2. Бинарная Модель Данных
- •2.2.1. Спецификация типов данных
- •2.2.2. Конструкторы типов данных
- •2.2.3. Спецификация функций
- •2.2.4. Спецификация структуры объектов
- •2.2.5. Синтаксис языка структурной спецификации
- •2.2.6. Атрибутные условия и интервальные ограничения
- •2.2.7. Структурные схемы
- •2.2.8. Представление данных в бмд
- •2.2.9. Логические предложения.
- •Глава 3 язык запросов для бинарной модели данных
- •3.1. Примеры запросов
- •3.2. Описание запросов
- •3.3. Описание алгоритма трансляции.
- •3.4. Примеры работы транслятора.
- •Глава 4 описание и использование программы, реализуюшей транслятор
- •4.1. Описание интерфейса программы.
- •4.2. Задание схемы
- •4.3. Использование транслятора в программном коде.
- •4.4. Программа с подключенной базой данных.
- •Приложение
- •Код программы Файл Onthology.Cs
- •Файл Translator.Cs
- •Заключение
- •Литература
- •Содержание
4.3. Использование транслятора в программном коде.
Для использования транслятора в программном коде, необходимо подключить файл Translator.cs, в котором находятся классы Translator и TranslatorException, реализующие соответственно транслятор и исключение с сообщением об ошибке, возникающее в ходе трансляции.
В программе нужно создать экземпляр транслятора, используя ранее определенную схему, и вызвать функцию translate, аргументом которой является запрос на языке БМЗ, результатом будет запрос наSQL.
Пример:
Translator t = new Translator(currentScheme);
string SQLQuery = t.translate(QLQuery);
Здесь currentScheme – схема, QLQuery – запрос на языке БМЗ, SQLQuery – запрос на SQL.
4.4. Программа с подключенной базой данных.
Ниже представлен пример программы, с подключенной базой данных, где используется транслятор запросов.
Внешний вид, в основном, совпадает с программой, представленной на Рис 3.1. При нажатии на кнопку «Перевести», кроме трансляции, выполяняется вывод результатов выполнения. В нижней части программы выводится результат запроса на SQL (Рис 4.4), либо одна из таблиц из базы данных (Рис 4.5).
Рис 4.4
Рис 4.5
Приложение
Сообщения об ошибке в запросе:
Запрос пуст
В начале запроса должен стоять вопросительный знак
Отсутствует знак '-'
Нельзя использовать символы "__” в начале слова
Отсутствует целевая переменная(выражение перед знаком '-'
Отсутствуют условия (выражения после знака '-')
Лишняя запятая после первой цели запроса <ЦЕЛЕВАЯ ЧАСТЬ>
Лишняя запятая после цели <ЦЕЛЬ>
Незакрытая скобка в цели запроса <ЦЕЛЬ>
Неизвестная функция <АГРЕГАТНАЯ ФУНКЦИЯ> в цели запроса <ЦЕЛЬ>
Лишняя открывающая скобка на <ПОЗИЦИЯ> символе
Конъюнктивное выражение под номером <НОМЕР> пусто
Последнее конъюнктивное выражение пусто (возможно лишний символ ";"
При использовании ключевого слова "IN" скобка должна стоять после имени класса
Пустое выражение внутри скобок в выражении <ВЫРАЖЕНИЕ>
Неверно выражение <ВЫРАЖЕНИЕ>. Отношение должно состоять из 4 слов:(X RelationName L Y) или из 3: (X RelationName Y)
Переменная отношения <ИМЯ ПЕРЕМЕННОЙ> относится к неизвестному отношению <ИМЯ ОТНОШЕНИЯ>
В выражении <ВЫРАЖЕНИЕ> несколько операторов
В выражении <ВЫРАЖЕНИЕ> отсутствуют операторы
Ошибка записи в выражении <ВЫРАЖЕНИЕ>. В атрибутах, где используются суррогаты можно использовать только оператор "="
Переменная <ИМЯ ПЕРЕМЕННОЙ> относится к классу <КЛАСС ПЕРЕМЕННОЙ> но в этом классе не содержится атрибут <ИМЯ АТРИБУТА>
Переменная <ИМЯ ПЕРЕМЕННОЙ> неизвестного типа
Не задана целевая переменая
Переменная <ИМЯ ПЕРЕМЕННОЙ> имеет неопределенный в схеме класс <КЛАСС ПЕРЕМЕННОЙ>
Неоднозначный тип у переменной <ИМЯ ПЕРЕМЕННОЙ>. Возможные значения типов: <КЛАСС1 ПЕРЕМЕННОЙ>, <КЛАСС2 ПЕРЕМЕННОЙ>
Код программы Файл Onthology.Cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Запросы
{
class OnthologyScheme
{
public string Name;
public List<OnthologyClass> Classes;
public List<OnthologyRelation> Relations;
public OnthologyScheme(string name, params OnthologyClass[] classes)
{
Name = name;
Classes = new List<OnthologyClass>();
Relations = new List<OnthologyRelation>();
foreach (OnthologyClass oc in classes)
{
if (oc is OnthologyRelation)
Relations.Add(oc as OnthologyRelation);
else
Classes.Add(oc);
}
}
}
class OnthologyClass
{
public string Name;
public List<OnthologyAttribute<string>> SimpleAttributes;
public List<OnthologyAttribute<OnthologyClass>> ClassAttributes;
public OnthologyClass(string name)
{
Name = name;
SimpleAttributes = new List<OnthologyAttribute<string>>();
ClassAttributes = new List<OnthologyAttribute<OnthologyClass>>();
}
public bool isSimpleAttribute(string attrName)
{
foreach (OnthologyAttribute<string> attr in SimpleAttributes)
{
if (attrName.ToUpper() == attr.Name.ToUpper())
return true;
}
return false;
}
virtual public bool isClassAttribute(string attrName)
{
foreach (OnthologyAttribute<OnthologyClass> attr in ClassAttributes)
{
if (attrName.ToUpper() == attr.Name.ToUpper())
return true;
}
return false;
}
public void AddSimpleAttribute(string name,string type)
{
SimpleAttributes.Add(new OnthologyAttribute<string>{Name = name, Type = type});
}
public void AddClassAttribute(string name, OnthologyClass oc)
{
ClassAttributes.Add(new OnthologyAttribute<OnthologyClass> { Name = name, Type = oc });
}
}
class OnthologyAttribute<T>
{
public string Name;
public T Type;
}
class OnthologyRelation : OnthologyClass
{
public OnthologyRelation(string name,OnthologyClass left,OnthologyClass right) : base(name)
{
Left = left;
Right = right;
}
public OnthologyClass Left;
public OnthologyClass Right;
override public bool isClassAttribute(string attrName)
{
return (base.isClassAttribute(attrName) ||
attrName.ToUpper() == Left.Name.ToUpper() ||
attrName.ToUpper() == Right.Name.ToUpper());
}
}
}