Разработка программного обеспечения для определения возможности одновременного приема медицинских препаратов
Анализ существующих технических решений для проверки взаимодействия лекарств. Создание семантической сети из базы данных с информацией о лекарствах. Запрос на получение ID лекарств из семантической сети. Создание графического интерфейса базы данных.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | русский |
Дата добавления | 14.09.2018 |
Размер файла | 6,2 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Федеральное государственное автономное образовательное учреждение высшего образования
"Национальный исследовательский университет "Высшая школа экономики""
Московский институт электроники и математики им. А.Н. Тихонова
Выпускная квалификационная работа
Разработка программного обеспечения для определения возможности одновременного приема медицинских препаратов
по направлению 09.03.01 Информатика и вычислительная техника
студента образовательной программы бакалавриата "Информатика и вычислительная техника"
Плохих Юлия Олеговна, группа БИВ144
Руководитель Старший преподаватель
Ерохина Елена Альфредовна
Москва 2018
Аннотация
семантический база данные лекарство
Целью данной выпускной квалификационной работы является создание системы рекомендаций по одновременному приему различных лекарств. Поставленная цель будет реализована с помощью семантических технологий. Результатом данной выпускной квалификационной работы является программа, реализующая проверку взаимодействия лекарств при одновременном приеме, написанная на языке программирования Java.
Разработанная программа предназначена для работников медицинских учреждений, а также обычных пользователей. Программа может получить развитие в создании персональной электронной карты здоровья (ПЭКЗ).
Данная работа содержит 80 иллюстраций, 9 приложений, 1 таблицу и 12 использованных источников. Объем выпускной квалификационной работы составляет 80 страниц.
Annotation
The general purpose of this project is to develop a recommendation system for simultaneous intake of various medications. A programing code together with an interface is to be written to process the data and to make recommendations. The task can be efficiently fulfilled by means of Semantic technologies and the Java language. The approaches used are powerful tools for processing data about drugs. Thus, a recommendation system will be developed. The results anticipated highlight the potential of the techniques applied and can be used by medical staff. Further research in this area leads to creating universal Personal Health Records.
The current research paper contains 80 illustrations, 9 annexes, 1 table and 12 used sources. The overall volume of the paper is 80 pages.
Оглавление
Введение
1. Анализ существующих решений в предметной области
1.1 Анализ существующих технических решений для проверки взаимодействия лекарств
1.2 Анализ существующих баз данных с лекарствами в формате семантических технологий
2. Описание структуры данных и правил работы с семантическими технологиями
3. Создание модели семантической сети
4. Создание семантической сети из базы данных с информацией о лекарствах
4.1 Описание базы данных с информацией о лекарствах
4.2 Создание семантической сети из XML-файла с данными о медицинских препаратах
4.3 Добавление ингредиентов лекарств в семантическую сеть
5. Создание запросов к семантической сети
5.1 Запрос на получение ID лекарств из семантической сети
5.2 Запрос на получение взаимодействия лекарств из семантической сети
5.3 Запрос на получение информации о медицинских препаратах из семантической сети
6. Создание графического интерфейса
7. Результаты создания семантической сети из базы данных
8. Тестирование программного обеспечения
Заключение
Список использованных источников
Приложения
Введение
Взаимодействие лекарств играет важную роль в лечении заболеваний. При одновременном приеме пациентом нескольких лекарств могут возникать неблагоприятные реакции, что создает необходимость контролировать одновременный прием лекарств.
Целью данной выпускной квалификационной работы является разработка программы на Java с использованием семантических технологий для проверки взаимодействия лекарств.
На данный момент в Интернете существует множество децентрализованных ресурсов с информацией о лекарственных препаратах и их взаимодействиях. Проверка взаимодействия медикаментов доступна как на зарубежных сайтах, так и российских. Каждый из этих ресурсов контролируют различные организации, которые имеют целью заполнение базы данных с лекарствами и проверку введенной информации. Информация в базах данных разнится, а также не представляется возможным объединение данных и слияние баз для создания единого ресурса с новейшей проверенной информацией о медикаментах.
Семантические технологии являются одним из самых простых и эффективных способов для создания единого ресурса данных, легкого объединения информации, доступной на разных языках. Также семантические технологии позволяют интегрировать информацию для различных целей как, например, создание глобальной персональной электронной карты здоровья.
При написании данной выпускной квалификационной работы были поставлены следующие задачи:
- найти базы данных, содержащие информацию о лекарствах в формате семантических технологий и выбрать одну из них для использования в выпускной квалификационной работе;
- изучить основные понятия семантических технологий и методы для работы с ними;
- спроектировать модель семантической сети, исходя из цели выпускной квалификационной работы и информации в базе данных с лекарствами;
- обработать выбранную базу данных и создать семантическую сеть, исходя из спроектированной модели;
- создать запросы к созданной семантической сети для вывода результатов взаимодействия лекарств;
- создать интерфейс для программы;
- провести тестирование программы.
Результатом данной выпускной квалификационной работы является программа, реализующая проверку взаимодействия лекарств. Данная программа написана на языке программирования Java с использованием фреймворка Apache Jena для работы с семантическими технологиями и библиотеки SWT для создания интерфейса. Семантическая сеть создана в формате Turtle, а запросы к ней осуществляются на языке SPARQL.
1. Анализ существующих решений в предметной области
1.1 Анализ существующих технических решений для проверки взаимодействия лекарств
На данный момент существует множество ресурсов, с помощью которых можно проверить взаимодействие лекарств. Для англоязычной аудитории одним из самых популярных сайтов для проверки лекарств на совместимость является WebMD (рис. 1) [1].
Рис. 1. Сайт WebMD.
Также нишу медицинских сайтов занимают Medscape (рис. 2) [2] и Drugs.com (рис. 3) [3].
Рис. 2. Сайт Medscape.
Рис. 3. Сайт Drugs.com.
При случайной выборке лекарств в трех данных источниках при проверке их взаимодействий оказывалось, что на каком-то сайте информации о взаимодействии не было вообще, а на других информация отличалась (не разительно, но достаточно для того, чтобы затруднить полное понимание последствий одновременного приема данного набора лекарств).
Среди российских аналогов нужно отметить сервис от компании РЛС [4] (Регистр Лекарственных Средств) для встраивания в «электронную медицинскую карту» (рис. 4). Данный сервис осуществляет проверку лекарств на совместимость с уже назначенными препаратами других специалистов. Также имеется и онлайн-справочник взаимодействия лекарств (следует отметить неудобство данного сервиса при поиске лекарств по названиям в базе данных, а также то, что данный сервис платный).
Рис. 4. Сайт Регистра Лекарственных Средств.
Почти все сервисы данной направленности имеют разрозненные базы данных, не совместимые между собой, с отличающейся информацией. Каждый такой сервис имеет поддержку разных медицинских компаний и институтов из разных стран. Это усложняет поиск релевантной информации, а тем более глобальный поиск данных.
Эти проблемы не появились, если бы все интернет-ресурсы хранили данные в едином формате, доступном для обработки компьютерами, вся опубликованная информация из разных источников была бы связана между собой, а также если информация могла бы быть найдена и скомбинирована для реализации проектов, отвечающих нуждам пользователей (не только взаимодействие лекарств). Данные проблемы могут быть решены средствами семантических технологий.
1.2 Анализ существующих баз данных с лекарствами в формате семантических технологий
Для создания семантической сети с информацией о лекарствах, нужно найти проверенную базу данных, доступную в формате семантических технологий и содержащую информацию о лекарствах. База ChemSpider [5] содержит информацию о лекарствах, но она направлена больше на классификацию препарата, чем на взаимодействие с другими препаратами (рис. 5).
Рис. 5. Аспирин в базе данных ChemSpider.
Другой популярной базой является ChEBI [6], но несмотря на полное описание препарата, структуры, классификации и воздействии на организм, в данном ресурсе не хватало информации о взаимодействии различных препаратов (рис. 6).
Рис. 6. Аспирин в базе данных ChEBI.
Информация о взаимодействии лекарств есть в открытой базе данных PubChem [7], которая содержит подробную информацию о медицинских препаратах и активных веществах (рис. 7).
Рис. 7. Информация, содержащаяся в базе данных PubChem.
Так как в вопросе взаимодействий PubChem ссылается на базу данных DrugBank [8], было принято решение работать именно с последним.
База данных DrugBank - это ресурс, содержащий подробную информацию о медицинских препаратах и их взаимодействиях (рис. 8). В версии 5.1.0, которая и используется в данной выпускной квалификационной работе, содержится 11041 записей о различных медицинских препаратах. Доступ к скачиванию базы данных бесплатный для учебных и научных целей. Проект поддерживается Канадским Институтом исследований в области здравоохранения и другими известными медицинскими учреждениями.
Рис. 8. Аспирин в базе данных DrugBank.
2. Описание структуры данных и правил работы с семантическими технологиями
Семантические технологии направлены на то, чтобы связывать данные различных форматов и из разных источников посредством построения связей, исходя из взаимодействия компонентов. Семантическую сеть можно считать надстройкой над Всемирной паутиной, которая может выдавать информацию исходя из взаимосвязей, а не просто по совпадению слов при поиске. World Wide Web Consortium (W3C) [9] разработал инструкции для разработчиков семантической сети, которые способствуют тому, чтобы сеть была универсальной (рис. 9).
Рис. 9. Сайт W3C Recommendation.
Семантические технологии работают с Resource Description Framework (RDF) и SPARQL (SPARQL Protocol and RDF Query Language). RDF - это формат, который базируется на XML и в котором хранятся данные в графах в семантической сети. SPARQL - это язык запросов, который позволяет извлечь информацию, представленную в RDF формате, из различных источников и баз данных. Сама же информация представлена в виде особых предложений - триплов (triple).
Трипл - это совокупность объекта, предиката и субъекта. Например, в предложениях «Дима - владеет машиной» и «Осло - столица Норвегии» слова «Дима» и «Осло» будут объектами (определяемые понятия), «машина» и «Норвегия» субъектами (определяющие понятия), а «владеет» и «столица» предикатами (определяют наличие у объекта какого-либо признака).
RDF использует понятие ресурса: почти все объекты и субъекты - это ресурс, который определяется URI (Uniform Resource Identi?ers), чтобы избежать конфликта имен [10]. Пример URI: http://example.org/stuff/1.0/Oslo . URI обычно сложны для понимания человеком. В формате для сериализации RDF графов Turtle возможно использование префиксов (рис. 10), что упрощает прочтение триплов.
Рис. 10. Трипл: Осло - столица Норвегии.
Триплы разделяются точками, между триплом и точкой должен быть пробел. Для простоты и краткости записи триплов применяют следующие правила: если трипл имеет одинаковый объект и предикат, то субъекты разделяются запятыми; если триплы содержат только одинаковый объект, то предикаты с субъектами разделяются точкой с запятой (рис. 11).
Рис. 11. Трипл: Россия содержит Сочи, Воронеж, Владивосток и её столица - Москва.
Семантические технологии позволяют записывать различные типы данных в качестве субъектов, например, строки или числа - за это отвечает префикс xsd (рис. 12). По умолчанию объекты без указания типа в кавычках записываются в семантическую сеть как строки.
Рис. 12. Трипл: оффициальное название города Москвы - «Москва» и его население составляет 11503501.
Глобализацию такой семантической сети обеспечивают тэги языков (это обеспечивает префикс rdfs), т.е. можно указать на каком языке написаны те или иные субъекты (рис. 13).
Рис. 13. Трипл: наименование России на норвежском языке - «Russland».
В семантической сети применяются blank nodes - пустые узлы. Они используются, когда объекты или субъекты не определены. Предикат «a» - это альтернативный вариант для определения типа объекта, такой же, как и rdf:type (рис. 14). Для правильного прочтения предиката «а» в семантическую сеть добавляется префикс rdf.
Рис. 14. Трипл: что-то - это машина, и оно же имеет название «Tesla Model S».
Есть несколько решений для работы с семантическими технологиями. Язык программирования Java является одним из самых универсальных. Для работы с Java была выбрана интегрированная среда разработки (IDE) Eclipse. Это бесплатная среда разработки, специально созданная для работы с языком программирования Java. Следующий важный компонент, который использовался для работы с Java - это Java Development Kit 8 (JDK 8). Существует несколько различных библиотек для работы с семантическими сетями на языке программирования Java, но самой часто используемой и общепризнанной является Apache Jena [11]. Это Application Programming Interface (API), который содержит набор готовых классов, функций и процедур для обработки семантических сетей. Jena позволяет работать с данными, представленными в формате RDF/XML, N3, Turtle и N-Triples и предоставляет возможность писать запросы к данным на языке SPARQL.
3. Создание модели семантической сети
Модель семантической сети, которая будет построена для базовой проверки взаимодействия лекарств представлена на рис. 15. Основные сущности данной семантической модели будут записаны с помощью пустых узлов (blank nodes), которые на схеме выделены цветом. Это позволит извлекать информацию из XML файла без привязки к имени лекарства. Так как в данной выпускной квалификационной работе не будет создано URI для уникального определения ресурсов, будет использоваться пустой префикс, который использовался в примере на рис. 10. Он будет обозначаться в виде двоеточия перед предикатами и типами ресурсов. Субъекты в триплах в основном будут иметь тип строки (string).
Просто хранить все данные о лекарствах и взаимодействиях в сущности типа Drug не представляется возможным, так как, например, при поиске взаимодействий двух активных веществ, их можно было бы связать, если в каждом хранить идентификатор другого вещества, но понять, для какого именно взаимодействия представлено описание, было бы почти невозможно. Поэтому для ясности результатов было принято решение создать отдельную сущность для описания взаимодействий.
Также в отдельную сущность была вынесена информация о лекарственных препаратах, которые содержат одно или несколько активных веществ. Данная сущность описывает производителя лекарства, форму, в которой представлено лекарство, и др. Так как медицинских препарат может содержать несколько веществ с различной дозировкой, то информация об этом была вынесена в другую сущность ингредиентов, к которой построена связь от сущности лекарств.
Рис. 15. Модель семантической сети для медицинских препаратов.
Активные вещества на данной модели обозначаются символом «_:d» и имеют тип Drug, а также следующие свойства:
- hasID - уникальный идентификатор лекарства, который будет однозначно определять активное вещество;
- hasName - наименование вещества;
- hasDescription - описание воздействия препарата на организм;
- hasSynonym - предоставляет возможность поиска вещества по другим его наименованиям;
- hasIndication - описание состояния здоровья, при котором может быть использовано данное активное вещество;
- hasPharmacodynamics - фармакодинамические свойства вещества;
- hasFoodInteraction - рекомендации по питанию при приеме данного активного вещества;
- interacts - связь между активным веществом и сущностью типа Interaction, которая отвечает за описание взаимодействия между данным активным веществом и другими, имеющимися в базе данных;
- hasProducts - связь между активным веществом и сущностью типа Product (лекарство), в которое входит данное вещество.
Взаимодействие лекарств прописано отдельной сущностью «_:i», которая имеет тип Interaction. Данный пустой узел будет иметь следующие свойства:
- hasDescription - описание взаимодействия препаратов;
- hasDrugID2 - хранит ID лекарства, с которым происходит взаимодействие.
Сущность типа Product, которая обозначена на модели как «_:p», отвечает за хранение информации о лекарствах. Она имеет такие свойства, как:
- hasLabeller - название компании, которая производит данное лекарство;
- hasNameOfProduct - наименование медицинского препарата;
- hasDosage - форма, в которой представлено лекарство: таблетка, капсула, жидкость для инъекции и другие;
- hasRoute - информация по способе приема лекарства;
- hasCountry - страна-изготовитель медицинского препарата;
- isOverTheCounter - имеет значение «true», если покупка данного лекарства может осуществляться без рецепта, и «false», если требуется рецепт;
- hasIngredient - информация о конкретном активном веществе и его дозировке в данном медицинском препарате.
Пустой узел с именем «_:ing» и типом Ingredient отвечает за информацию о дозировке активных веществ в препаратах и обладает свойствами:
- drugIDforProduct - хранит ID активного вещества;
- hasStrength - информация о дозировке вещества в лекарстве, если таковая представлена.
4. Создание семантической сети из базы данных с информацией о лекарствах
4.1 Описание базы данных с информацией о лекарствах
База данных с информацией о медицинских препаратах была загружена из ресурса DrugBank. Она представлена в формате XML и содержит 17587592 строки.
Структуру XML-файла можно представить так: сначала идет описание версии и кодировки файла, затем открывается тэг drugbank, в котором находятся такие необходимые для проверки взаимодействия лекарств, как drug (в нем содержится информация об отдельно взятом лекарстве), вложенные в него тэги name, description и другие (рис. 16).
Рис. 16. XML-файл с данными о лекарствах из ресурса DrugBank.
Особенность описания синонимов определенного медицинского препарата и его взаимодействий с другими лекарствами состоит в том, что они в свою очередь находятся во вложенных тэгах с названиями synonyms (рис. 17) и drug-interactions (рис. 18). Эта особенность должна быть учтена при чтении данных из файла XML формата.
Рис. 17. Структура описания синонимов в базе данных.
Рис. 18. Структура описания взаимодействий лекарств в базе данных.
Связь между активным веществом и медицинским препаратом, в который она входит, обеспечена тем, что в информацию о каждом таком веществе дублируется информация о лекарстве, т.е. если препарат содержит 3 вещества, то информация о нем будет написана 3 раза.
Рис. 19. Структура описания медицинских препаратов в базе данных.
При просмотре данных из базы DrugBank оказалось, что она не содержит информации о некоторых лекарствах, хотя содержит описание их взаимодействия. Так как работа со всеми лекарствами будет осуществляться непосредственно по ID, то отсутствие вещества с указанием типа Drug и ID может привести к тому, что при поиске ID по имени или синониму оно не найдется, и, как следствие, не найдется и взаимодействие, хотя оно есть в системе. Поэтому во избежание логической ошибки было принято решение вручную добавить недостающие лекарства.
4.2 Создание семантической сети из XML-файла с данными о медицинских препаратах
Формат данных XML не подходит для построения семантической сети, и для проверки взаимодействия лекарств не требуется вся информация о медицинских препаратах из базы данных. Поэтому для обращения к определенным данным из XML-файла была использована Объектная Модель Документа, DOM (Document Object Model) [12]. Она преобразует XML-файл к древовидной структуре и позволяет получить только нужные nodes (ноды).
Класс CreatingSemanticModel (Приложение 1) читает XML-файл методом DOM и одновременно записывает выборочные данные в семантическую сеть с помощью библиотеки Jena. Создание семантической сети средствами библиотеки Jena начинается с создания модели (рис. 20).
Рис. 20. Создание модели семантических технологий.
В Jena ресурсы и триплы будут привязаны к данной модели. В этой модели можно создавать ресурсы и пустые узлы методом createResource, предикаты - createProperty, а префиксы - setNsPrefix. В данной семантической сети помимо таких нужных префиксов, как rdf (для обозначения типа ресурса), xsd (для обозначения типа субъектов: строки или числа), будет использоваться пустой префикс (рис. 21). Метод getNsPrefixURI поможет получить данный префикс их модели для удобства при записи ресурсов и предикатов.
Рис. 21. Создание и получение префиксов из модели.
Были созданы все нужные для семантической сети свойства, такие как drug, hasID, hasName и другие методом createProperty (рис. 22).
Рис. 22. Создание свойств для модели семантических технологий.
Так как параллельно с чтением XML-файла и созданием семантической сети необходимо отслеживать вещества, которые участвуют во взаимодействиях, но информации о них нет в тэге drug, то для хранения уникальных ID и имен медицинских препаратов, с которыми идет взаимодействие, была создана переменная типа HashMap (рис. 23):
Рис. 23. Создание переменной типа HashMap.
В переменную fxml типа File был записан файл с информацией о лекарствах full_database.xml, взятый с сайта DrugBank. С помощью метода DocumentBuilderFactory стало возможным получение необходимых нодов из XML-файла (рис. 24).
Рис. 24. Чтение XML-файла с помощью DocumentBuilderFactory.
Затем был создан список из всех нодов с типом drug (рис. 25).
Рис. 25. Получение списка информации из нодов.
В цикле из каждого списка выделяется отдельный компонент. При условии, что он является нодом данного файла, из нода создается переменная типа Element (рис. 26).
Рис. 26. Получение списка информации из нода drug.
Из переменной eElement возможно получить любые значения тэгов по их имени, например получить название медицинского препарата. После создания пустого узла в модели, ему присваивается тип drug, а также такие свойства, как hasID, hasName и др.
Рис. 27. Получение списка информации из нодов drug.
Получение синонимов и взаимодействий лекарственных средств требует создания подсписка, так как совокупность синонимов находится в рамках тэга synonyms, а совокупность взаимодействий в тэге drug-interactions. Это требует получения вложенных тэгов по аналогии с получением информации об отдельном лекарстве (рис. 28).
Рис. 28. Получение списка информации из вложенных нодов drug.
Затем в зависимости от имени тэга выдаются вложенные тэги в виде списка. При вычислении значения синонимов лекарствам добавляется предикат hasSynonym. При просмотре вложенных тэгов в тэге drug-interactions, добавляется новый пустой узел типа interaction, который имеет такие свойства, как hasDrugID2, hasDescrOfInter (hasDrugID2 берется из вложенного тэга как и hasDescrOfInter), а также созданная сущность связывается с сущностью типа Drug свойством interacts (рис. 29).
Рис. 29. Создание пустого узла типа Interaction.
В данном цикле записывается ID и Name второго лекарства во взаимодействии в переменную interactions типа HashMap. Если такой ID уже существует, то он будет перезаписан, и информация не повторится второй раз.
По похожим принципам была получена информация для сущностей типа Product. Для облегчения работы программы сущность типа Ingredient будет реализована в другом классе (Приложение 2).
После прохождения по всем медицинским препаратом из файла формата XML и создания сущностей и их свойств в модели семантической сети, программа проходит по всем записанным ID в переменной interactions с помощью цикла (рис. 30). В данном цикле каждый раз будет создаваться лист ресурсов со свойством hasID (такое свойство есть только у объектов типа Drug).
Рис. 30. Обработка переменной interactions.
Затем будет проходить сравнение ID из списка interactions и ID среди перечня лекарств (рис. 31). Также будет создана переменная типа boolean, которая покажет, если ID уже есть среди списка лекарств (изначально переменной flag2 присвоено значение false).
Рис. 31. Проверка ID лекарств из взаимодействий на совпадение с уже присутствующими в базе данных.
Если значение флага так и осталось ложным, то создается новый ресурс типа Drug, который будет содержать в себе ID и Name недостающего лекарства (рис. 32).
Рис. 32. Создание недостающих пустых узлов типа Drug.
Дополненная модель записывается в файл формата Turtle. Он является более комфортным для понимания человеком, чем RDF/XML и занимает меньше строк в файле.
4.3 Добавление ингредиентов лекарств в семантическую сеть
За добавление пустых узлов типа Ingredients отвечает отдельный класс Fixing_Ingredients (Приложение 2).
После прочтения созданной на предыдущем шаге модели семантической сети и получении всех необходимых для функционирования свойств, добавляем свойства hasIngredient и ingredient для новых пустых узлов. Такие свойства, как дозировка и ID активных веществ уже есть и пока принадлежат сущностям типа Product. Впоследствии эти свойства перейдут ингредиентам, а потом удалятся из медицинских препаратов за ненадобностью.
Был создан класс для хранения информацией об ингредиентах. Она называется IDPlusStrength и хранит ID и дозировку ингредиента (рис. 33).
Рис. 33. Класс IDPlusStrength.
В переменной типа Hash Map хранятся уникальные ID сущностей типа Product, и в качестве второго аргумента - переменные класса IDPlusStrength (рис. 34). Они предназначены для того, чтобы нужные ингредиенты с дозировками были «привязаны» к нужным медицинским препаратам. Сначала будут обрабатываться все ресурсы, которые имеют идентификатор DPD (лекарства Канадского производства).
Рис. 34. Хранение ID продуктов и переменных класса IDPlusStrength.
Если в ingredients еще не содержится ID медицинского препарата, то он будет добавлен, как и найденный ингредиент, а если нет, то информация о нем добавляется в список для уже существующего ингредиента (рис. 35).
Рис. 35. Добавление ингредиентов и ID лекарств в переменную ingredients.
Затем через итератор осуществляется поиск по всем ресурсам, теперь уже с целью построить связь между существующими продуктами и ингредиентами из списка ingredients. Для каждого ингредиента создается пустой узел, добавляются нужные свойства, устанавливается связь с помощью свойства hasIngredient, а лишняя информация удаляется из сущности типа Product (рис. 36).
Рис. 36. Создание пустых узлов типа Ingredient.
Процесс повторяется для медицинских препаратов с NDС ID, а затем измененная модель записывается в файл в формате TURTLE.
5. Создание запросов к семантической сети
5.1 Запрос на получение ID лекарств из семантической сети
Для создания запросов по получению ID лекарств был создан класс ListOfNames, содержащий:
- информацию о названии, которое было введено пользователем для поиска лекарства,
- id найденного активного вещества,
- тип и номер для определения принадлежности лекарству (рис. 37).
Методы данного класса представлены в Приложении 3.
Рис. 37. Класс ListOfNames.
Класс ListOfNames будет содержать в себе структуру, описанную в табл. 1. В списке членов класса ListOfNames можно получить любой элемент в списке с помощью номера строки в списке, а также записывается:
- название, которое пользователь ввел в поле для поиска;
- ID активного вещества, которое содержится в данном препарате;
- наименование вещества;
- номер для соотнесения вещества с медицинским препаратом;
- тип вводимого лекарства (вещество, синоним или препарат).
Если лекарство содержит 3 вещества, то оно занимает 3 строки, наименование лекарства и тип дублируется. Если данный препарат был введен первым, то номер для соотнесения вещества и лекарства для всех строк в таблице будет нулевым. По данной аналогии в таблицу будут записываться все лекарства, найденные пользователем и добавленные в поле для взаимодействия. Необходимость именно такой структуры хранения данных будет объяснена позже, при описании получения взаимодействий веществ и информации о медицинских препаратах.
Таблица 1. Структура данных, хранимых для проверки взаимодействия лекарств в разрабатываемой системе
Номер строки в списке |
Наименование лекарства |
ID активного вещества |
Наименование активного вещества |
Номер для соотнесения вещества и лекарства |
Тип |
|
0 |
292 Tab |
DB00945 |
Acetylsalicylic acid |
0 |
Product |
|
1 |
292 Tab |
DBSALT000866 |
Caffeine citrate |
0 |
Product |
|
2 |
292 Tab |
DBSALT000030 |
Codeine phosphate |
0 |
Product |
|
3 |
Aggrenox |
DB00945 |
Acetylsalicylic acid |
1 |
Product |
|
4 |
Aggrenox |
DB00975 |
Dipyridamole |
1 |
Product |
|
5 |
Lepirudin |
DB00001 |
Lepirudin |
2 |
Drug |
Для получения ID лекарства при вводе его наименования были составлены запросы на языке SPARQL. Обработка данных запросов находится в классе DrugExecutor (Приложение 4). Функция, совершающая обработку данных, называется idExecutor. После создания пустой семантической модели и построения в ней сети из файла, были получены необходимые префиксы для создания запросов.
Был создан список для элементов класса ListOfNames, а также переменная counter, которая будет служить для подсчета количества строк в таблице (рис. 38).
Рис. 38. Создание списка элементов класса ListOfNames.
В строковую переменную записывается текст запроса, представленный на рис. 39. Производится выбор различных ID и наименований, где наименование является либо активным веществом, либо его синонимом, либо это название медицинского препарата. ID активных веществ нужно получать через связи сущностей классов Product, Ingredients и Drug.
Рис. 39. Запрос по получению ID лекарственного препарата по его названию.
Также были написаны запросы для определения типа вводимого наименования. Запрос типа ASK на рис. 40 позволяет получить ответ в виде булевой переменной, на вопрос: действительно ли наименование является медицинским препаратом. Запрос на определение является ли наименование синонимом написан по похожему алгоритму. Получение ответа будет описано на примере запроса с рис. 39.
Рис. 40. Запрос по получению ID лекарственного препарата по его названию.
С помощью QueryFactory создается запрос на основе информации из строковой переменной. Благодаря методу QueryExecutionFactory запрос применяется в модели семантической сети (рис. 41). При этом создание модели семантической сети из файла происходит в отдельном классе SemanticModel (Приложение 5). Поэтому обращение к модели происходит через этот класс.
Рис. 41. Применение запроса к семантической модели.
Результат запроса записывается в переменную res с помощью метода execSelect. Получим список результатов. Пройдём по списку в цикле while. При этом каждый из элементов, который являлся целью поиска, записывается в переменные типа RDFNode (рис. 42).
Рис. 42. Получение результатов запроса по поиску ID и наименования активных веществ.
После этого в список добавляется переменная типа ListOfNames, структура которой показана на рис. 37. Переменная temp будет отвечать за принадлежность активных веществ лекарствам и приходит класс извне (рис. 43). Также по номеру элемента в строке, записывается тип введенного наименования. В том же цикле счетчик counter увеличивает свое значение.
Рис. 43. Получение результатов запроса по поиску ID и наименования активных веществ.
Если во введенном препарате находится несколько активных веществ, то все они запишутся в список. Функция idExecutor возвращает null, если информации об элементах не было найдено, и список drugNames, если результат запроса не null.
5.2 Запрос на получение взаимодействия лекарств из семантической сети
Проверка взаимодействий будет проводиться парами: все компоненты каждого препарата сравниваются со всеми компонентами последующих лекарств в списке. Он имеет структуру из табл. 1.
Для данной задачи был создан класс DDIExecutor, который содержит в себе метод interactionExecutor (Приложение 5).
В данном методе после стандартной процедуры получения нужных префиксов до основных циклов получения взаимодействий, создается переменная типа StringBuilder. Она будет содержать строки-результаты взаимодействий лекарственных средств. Также создаётся переменная numFirstDrug, отвечающая за хранение номера первого препарата.(рис. 44).
Рис. 44. Создание переменной типа StringBuilder и счетчика для первых лекарств в паре взаимодействий.
Первый цикл будет перебирать все препараты, которые будут участвовать в качестве первого компонента во взаимодействии (не доходит до последнего препарата, так как он априори будет вторым). Создается список из членов класса ListOfNames и переменная для подсчета всех строк в allElements для списка со всеми препаратами drugNames. Список drugNames приходит в данный метод извне. Также создается переменная для подсчета количества ингредиентов в первом лекарстве. Определение того, входят ли компоненты, лежащие в списке drugNames, в состав первого препарата происходит с помощью цикла while. Происходит сравнение номера в таблице и переменной temp, которая так же приходит извне и содержит количество введенных пользователем препаратов (рис. 45). Затем в список dN1 записывается вся информация о необходимых компонентах.
Рис. 45. Цикл для получения всех компонентов первого во взаимодействии препарата.
На протяжении выполнения всей программы будет происходить запись результатов поиска в переменную builder. После этого вычисляется номер следующего лекарства для проверки его взаимодействий в качестве первого препарата, а также подсчет всех строк в листе (рис. 46).
Рис. 46. Цикл для получения всех компонентов первого во взаимодействии препарата.
Схожий принцип используется во вложенном цикле для второго препарата. В этом цикле проверяются последующие препараты, включая последний. В связи с этим, в цикле while требуется проверка на ошибку IndexOutOfBoundsExсeption.
Рис. 47. Цикл для получения всех компонентов второго во взаимодействии препарата.
После циклов для прохождения по препаратам, идут циклы для поиска взаимодействий между всеми компонентами двух препаратов, которые представлены в списках dN1 и dN2 (рис. 48).
Рис. 48. Циклы для поиска взаимодействии между компонентами двух препаратов.
Для того, чтобы не проверять взаимодействие между одинаковыми компонентами двух препаратов, проводится проверка на такие случаи (рис. 49).
Рис. 49. Проверка на совпадение компонентов.
При условии, что проверяемые на взаимодействие компоненты разные, в строковую переменную qsDDI записывается запрос. Он находит два вещества с известными ID и ищет, есть ли между ними взаимодействие. Проверяется, существует ли такой пустой узел типа Interaction, который содержит в себе ID второго активного вещества и описание их взаимодействия (рис. 50).
Рис. 50. Текст запроса на поиск взаимодействия между двумя активными веществами.
Если взаимодействие найдено, то оно записывается в переменную builder (рис. 51).
Рис. 51. Получение результата взаимодействия.
Данный метод возвратит строки-результаты взаимодействий из переменной builder.
5.3 Запрос на получение информации о медицинских препаратах из семантической сети
Был создан класс GettingInfo с методом infoExecutor, который получает на вход список с ингредиентами продукта и выводит информацию о нем в виде строк (Приложение 6).
Были получены нужные префиксы и свойства из модели, как например hasID, hasDescription и другие и создана переменная builder типа StringBuilder для записи результата поиска информации (рис. 52).
Рис. 52. Получение свойств из модели и создание переменной типа StringBuilder.
При условии, что полученный лист -- это препарат (не активное вещество), создается запрос, который ищет всю информацию о данном продукте. При этом, в зависимости от страны производства ID продукта будет разным. Запрос будет иметь тип UNION, который можно рассматривать, как логическую функцию «или»: либо найдется лекарство производства Канады, либо США (рис. 53).
Рис. 53. Запрос на получение информации о препарате.
После получения всех компонентов запроса в виде переменных типа RDFNode, они записываются в переменную результата (рис. 54). Узнать, отпускается ли лекарственный препарат без рецепта, можно через свойство «isOverTheCounter».
Рис. 54. Вывод информации о препарате.
Затем создается цикл, который проходит по всем компонентам препарата либо по одному отдельному активному веществу. При каждой итерации цикла с помощью Iterator<Resource> получаем список всех ресурсов с ID активного вещества (рис. 55). Так как ID является уникальным идентификатором веществ, ресурс будет один. Инициализируем строки, отвечающие за описание веществ пустыми значениями (для примера используется строка-описание вещества).
Рис. 55. Получение списка ресурсов по идентификатору.
Происходит проверка на null всех строк с описанием, так как у некоторых веществ может не оказаться тех или иных свойств (рис. 56).
Рис. 56. Получение списка ресурсов по идентификатору.
Затем они записываются в переменную builder, которую по завершении работы программа вернет для отображения в класс графического интерфейса.
6. Создание графического интерфейса
Точкой входа в программу является класс Main (Приложение 7). В нем с помощью переменной типа Thread в потоке вызывается метод, отвечающий за создание семантической сети из базы данных с информацией о лекарствах (рис. 57). Код класса SemanticModel представлен в Приложении 8.
Рис. 57. Вызов метода для создания семантической сети.
Использование потоков ускоряет запуск программы. Без потоков программа запускалась за 70-80 секунд, а с их использованием - за 40 секунд.
После создания модели семантической сети, происходит открытие окна интерфейса DrugSearchShell (рис. 58).
Рис. 58. Открытие окна DrugSearchShell.
За графический интерфейс отвечает класс DrugSearchShell (Приложение 9). Глобальными переменными данного класса являются (рис. 59):
- listOfDrug (отвечает за отдельный препарат);
- listOfDrugs (список из всех препаратов, которые будут проверяться на взаимодействие);
- temp (количество препаратов).
Рис. 59. Глобальные переменные класса DrugSearchShell.
Затем были созданы компоненты для графического интерфейса, например различные кнопки, окно для ввода наименования лекарства и др. Реагирование на нажатие кнопки было прописано с помощью вызова метода addSelectionListener для этой кнопки. Например, при нажатии кнопки поиска лекарства среди базы данных, в строку сохраняется его название (рис. 60).
Рис. 60. Метод, вызываемый при нажатии на кнопку searchButton.
Затем полученная строка и текущий номер препарата посылаются в метод idExecutor класса DrugExecutor, функционал которого был описан ранее. В зависимости от того, нашелся ли препарат по имени или нет, появляются или исчезают необходимые кнопки и элементы типа Label (рис. 61). Если такого препарата нет, то выведется сообщение об ошибке.
Рис. 61. Работа с результатами поиска лекарства по имени.
В этом же методе вызывается метод addSelectionListener для кнопки seeInfoButton, которая позволит посмотреть информацию о препарате, который удалось найти (рис. 62). В нем вызывается метод класса infoExecutor класса GettingInfo, который в строковую переменную передаст результаты поиска информации. После этого откроется отдельное окно с выводом данных из строки infoResult.
Рис. 62. Метод, вызываемый при нажатии на кнопку seeInfoButton.
При нажатии на кнопку добавления лекарства в список для проверки взаимодействий, он проверяется на совпадение с именами уже имеющихся препаратов в данном списке (рис. 63).
Рис. 63. Метод, вызываемый при нажатии на кнопку seeInfoButton.
Если такое лекарство уже находится в списке, то высветится сообщение об ошибке (рис. 64).
Рис. 64. Вызов окна с сообщением об ошибке при совпадении препаратов в списке для проверки взаимодействий.
В противном случае лекарство добавится в список для проверки взаимодействий. При этом переменная temp увеличит своё значение на единицу, а рядом с этим лекарством появится кнопка «Clear». Она необходима в случае, если пользователь передумал проверять взаимодействие конкретного лекарства. При нажатии на эту кнопку, переменной i присваивается номер препарата, который нужно удалить (рис. 65). Затем в цикле while производится поиск нужных строк для удаления веществ данного препарата, после чего они удаляются. Всем следующим после него элементам присваивается номер меньший исходного на единицу. Также переменная temp уменьшает свое значение. Производится проверка на то, что если в списке меньше двух элементов, то проверить взаимодействие будет невозможно.
Рис. 65. Метод, вызываемый при нажатии на кнопку clearButton.
После соблюдения условий, что в списке не должно быть повторяющихся препаратов и их количество должно быть больше двух, возможно произвести проверку на взаимодействие лекарств. Вызывается метод interactionExecutor класса DDIExecutor, который возвратит строковую переменную с описанием всех найденных взаимодействий. Данный результат выведется в отдельном окне в виде текста (рис. 66).
Рис. 66. Метод, вызываемый при нажатии на кнопку checkButton.
В данной главе были описаны основные методы, использующиеся при создании графического интерфейса для данного программного обеспечения. Создание каждого компонента и способы размещения приведены в Приложении 9. Теперь приступим к тестированию данного программного обеспечения.
7. Результаты создания семантической сети из базы данных
Для быстрой и эффективной работы классов CreatingSemanticModel, Fixing_Ingredients, а также класса Main, в файле eclipse.ini были проставлены аргументы -Xms1024m и -Xm8g, что позволяет среде Eclipse максимально эффективно работать с кодом программ (рис. 67).
Рис. 67. Файл eclipse.ini.
Также для всех запускаемых приложений во вкладке Run Configurations в поле VM arguments были проставлены те же значения (рис. 68). Это позволяет при запуске программ занимать все выделенные для Eclipse ресурсы персонального компьютера.
Рис. 68. VM arguments для приложения Main.
Результатом работы классов CreatingSemanticModel и Fixing_Ingredients является файл формата TURTLE (рис. 69), в котором находятся вся информация из базы данных в формате XML, необходимая для построения семантической сети со структурой, представленной на рис. 15. В полученном файле уже проставлены необходимые для построения семантической сети префиксы. Для каждого из лекарств необходимым свойством является ID и наименование, остальные же свойства могут отсутствовать.
Рис. 69. Файл с семантической сетью информации из базы данных.
При получении необходимой информации из XML-файла также было реализовано добавление наименования медицинского препарата в список лекарств. Это возможно при условии, что наименование указано при участии во взаимодействии, но не находится в числе ресурсов с типом Drug. Одним из таких лекарств является Bendazac, который был успешно добавлен в качестве объекта типа Drug (рис. 70).
Рис. 70. Добавленное в семантическую сеть лекарство Bendazac.
Также было реализовано создание сущностей типа Product и их связь со входящими ингредиентами (рис. 71).
Рис. 71. Свойства hasProducts и hasIngredient в семантической сети.
Взаимодействие лекарств было прописано через свойство Interacts и тип сущности Interaction (рис. 72).
Рис. 72. Свойства interacts для сущности типа Drug.
Данные скриншоты показывают правильность создания семантической модели для заданной структуры активных веществ, медицинский препаратов и взаимодействий.
8. Тестирование программного обеспечения
Запуск программы занимает 40 секунд, т.к. для построения семантической сети из почти 8 миллионов строк требуется некоторое время. Сами запросы на получение информации из этой сети работают достаточно быстро.
Стартовое окно можно увидеть на рис. 73.
Рис. 73. Стартовое окно.
Для начала работы с программой следует ввести наименование лекарства в поле для поиска и нажать на кнопку Search, которая станет активной при вводе данных. Если данное лекарство не будет найдено, то будет выведено сообщение, представленное на рис. 74.
Рис. 74. Сообщение о том, что препарат с введенным именем не найден в базе данных.
Если ввести наименование лекарства, которое есть базе данных, например, Аспирин, то оно появится в результатах поиска (рис. 75). Программа позволяет вводить и наименование активного вещества (например, Ацетилсалициловая кислота), и синонимов (Аспирин) и коммерческое наименование лекарства (Zee Aspirin).
Рис. 75. Результаты поиска аспирина в базе данных.
Имеется возможность посмотреть информацию о данном лекарстве, нажав на кнопку «See info». Сначала выведется информация о различных препаратах с данным именем, затем информация о веществах, содержащихся в лекарстве (рис. 76).
Рис. 76. Результаты поиска информации об аспирине в базе данных.
При закрытии данного окна программа перейдет в положение окна, изображенное на рис. 77. Данное лекарство можно добавить для проверки взаимодействия кнопкой «Add». Оно попадет в список лекарств для проверки взаимодействий (рис. 77). Кнопка добавления станет неактивной, а лекарство можно будет удалить из списка с помощью кнопки «Clear».
Рис. 77. Результаты поиска аспирина в базе данных.
Таким образом добавляем в список различные препараты (рис. 78). Если их больше одного, то кнопка «Check» становится активной, и мы можем проверить взаимодействия.
Рис. 78. Результаты поиска аспирина в базе данных.
Результаты проверки взаимодействия медицинских препаратов изображены на рис. 79.
Рис. 79. Результаты поиска аспирина в базе данных.
Если ввести «282 Tab» и «Zomepirac» для проверки взаимодействий, то по результату работы программы можно увидеть, что «282 Tab» состоит из нескольких компонентов, и каждый из них проверяется на взаимодействие с веществом «Zomepirac» (рис. 80).
Рис. 80. Результаты поиска аспирина в базе данных.
Тестирование показало правильность работы данного программного обеспечения.
Заключение
Во время написания данной выпускной квалификационной работы были изучены различные способы проверки лекарств на взаимодействие, выявлена непрактичность использования обычных баз данных для проверки лекарств на взаимодействия. Установлена невозможность их интегрирования и слияния между собой, единовременность заполнения их самой последней информацией и, как следствие, невозможность создания универсального решения для медицинских данных. Семантические технологии имеют возможность справиться с данными недостатками, а Apache Jena является мощным и универсальным инструментом для работы с семантической сетью данных.
Была разработана структура семантической сети с информацией о лекарствах и их взаимодействиях, основанная на стандартах, прописанных W3C. Были найдены и исправлены логические недочеты базы данных и, как следствие, работы программы, выявленные при тестировании запросов, связанные с отсутствием информации о некоторых лекарствах, участвующих при этом во взаимодействиях.
Была создана семантическая сеть с помощью средств фреймворка Jena, добавлены необходимые ресурсы и свойства объектов, создана новая база данных в формате Turtle. Созданы такие запросы, как получение ID лекарств по имени и синонимам, получение результатов взаимодействия нескольких медицинских препаратов и получение полной информации о лекарствах. Также был разработан графический интерфейс для работы с программным обеспечением.
В дальнейшем возможно расширение семантической сети путем добавления новых предикатов для расширения функционала программы.
В текущей реализации приложение работает так, что база данных с информацией о медицинских препаратах находится у пользователя, а семантическая сеть создается каждый раз при открытии приложения, что занимает некоторое время. В перспективе развития данного программного обеспечения можно расположить базу данных на сервере и предоставить доступ к этой базе через web-клиента или через специальное мобильное приложение.
Среди глобальных перспектив развития данного проекта находится создание единой глобальной персональной электронной карты здоровья с применением семантических технологий.
Список использованных источников
1. WebMD - Better information. Better health [Электронный ресурс]. - Режим доступа: URL: https://www.webmd.com/ (дата обращения 05.04.2018).
2. MedScape - Multi-Drug Interaction Checker [Электронный ресурс]. - Режим доступа: URL: https://reference.medscape.com/drug-interactionchecker (дата обращения 05.04.2018).
3. Drugs.com - Drug Interactions Checker - For Drugs, Food & Alcohol [Электронный ресурс]. - Режим доступа: URL: https://www.drugs.com/drug_interactions.html (дата обращения 05.04.2018).
4. Справочник лекарств РЛС - Взаимодействие лекарств (действующих веществ) [Электронный ресурс]. - Режим доступа: URL: https://www.rlsnet.ru/interactions_alf.htm (дата обращения 05.04.2018).
5. ChemSpider - Search and share chemistry [Электронный ресурс]. - Режим доступа: URL: http://www.chemspider.com/ (дата обращения 09.04.2018).
6. ChEBI - Chemical Entities of Biological Interest [Электронный ресурс]. - Режим доступа: URL: https://www.ebi.ac.uk/chebi/init.do (дата обращения 09.04.2018).
7. PubChem - Open Chemistry Database [Электронный ресурс]. - Режим доступа: URL: https://pubchem.ncbi.nlm.nih.gov/ (дата обращения 09.04.2018).
8. DrugBank - The DrugBank database [Электронный ресурс]. - Режим доступа: URL: https://www.drugbank.ca/ (дата обращения 09.04.2018).
9. World Wide Web Consortium (W3C) - About W3C [Электронный ресурс]. - Режим доступа: URL: https://www.w3.org/Consortium/ (дата обращения 06.04.2018).
10. Hitzler P. Foundations of Semantic Web Technologies [Текст] / P. Hitzler, M. Krцtzsch, S. Rudolph. -- М.: CRC Press, 2009. -- 20 с.
11. Apache Jena - Home [Электронный ресурс]. - Режим доступа: URL: https://jena.apache.org/ (дата обращения 06.04.2018).
Подобные документы
Разработка базы данных с информацией о сотрудниках, товарах, со справочником типов товаров средствами системы управления базами данных MySQL с помощью SQL-запросов. Разработка инфологической модели предметной области. Структура таблиц, полей базы данных.
контрольная работа [648,7 K], добавлен 13.04.2012Разработка и программная реализация сайта и базы данных, наполнение базы данных тестовой информацией о товарах. Инструментальные средства создания сайта. Организация тестирования сайта, модуль визуализации интерфейса. Создание запросов в базе данных SQL.
курсовая работа [1,4 M], добавлен 24.12.2012Создание базы данных "Компьютерные игры": разработка и дизайн интерфейса, наполнение таблиц информацией, формирование идентификаторов. Использование системы управления базами данных Microsoft Access для составления стандартных запросов, форм и отчетов.
курсовая работа [715,7 K], добавлен 29.01.2011Создание таблиц базы данных с помощью MS Access "Страны Азии". Форма базы данных и запросы к выборкам данных. Модификация структуры таблиц, создания связей между главными таблицами, редактирование данных и проектирование форм для реальной базы данных.
контрольная работа [723,9 K], добавлен 25.11.2012Авторизация с каталогами проектирования базы данных магазина. Задачи базы данных: учет всех товаров, поиск и выдача данных о клиентах, адрес, телефоны, цена и наличие товара. Этапы проектирования базы данных. Схема данных, создание запросов и их формы.
реферат [1,6 M], добавлен 22.10.2009Анализ возможностей системы управления базами данных "Microsoft Access 2003". Создание базы данных, предназначенной для отражения деятельности аэропорта. Концептуальная и физическая модель базы данных. Создание таблиц, запросов, отчетов и главной формы.
курсовая работа [1,8 M], добавлен 26.06.2013- Создание базы данных автомобилестроительного предприятия в виде настольного приложения на языке Java
Разработка логической схемы базы данных автомобилестроительного предприятия. Инфологическое моделирование системы. Создание графического интерфейса пользователя для базы данных средствами языка программирования Java. Тестирование программных средств.
курсовая работа [2,3 M], добавлен 16.12.2013 Создание базы данных "Аптека", предназначенных для программного анализа продаж лекарств на основе справочной информации, содержащейся в четырех взаимосвязанных таблицах. Данная программа будет автоматизировать процесс регистрации и продажи лекарств.
реферат [366,6 K], добавлен 11.01.2009Разработка информационной базы данных для компании с помощью СУБД Microsoft Office Access. Построение семантической модели предметной области. Листинг программного продукта: создание и заполнение таблиц. Инструкция по применению автоматизированной ИС.
курсовая работа [1010,5 K], добавлен 26.03.2014Порядок проектирования и разработки базы данных и программного обеспечения. Информация о структуре базы данных, созданных таблицах, формах, отчетах, запросах, хранимой информации. Логическая и концептуальная модели данных; выбор программного обеспечения.
курсовая работа [906,6 K], добавлен 20.01.2010