Методология и принципы моделирования онтологии и работы с данными.¶
Введение¶
В мире существует множество рекомендаций по вопросу проектирования онтологий. Есть подходы, в которых онтологии создаются экспертами, а есть и автоматизированные способы создания онтологий. Автор настоящих рекомендаций знаком с некоторыми из них, так же с принципами моделирования данных, изложенным в ISO 15926. Автор имеет опыт моделирования данных как в соответствии с ISO 15926, так в соответствии с Direct Semantic (прямое использование стандартов Semantic Web от W3C).
Предлагаемая здесь методика и принципы изложены в упрощенным виде и сформулированы на основе опыта разработки приложений для сложных инженерных проектов.
В качестве примера выбрана доработанная онтология Пиццы, так как она используется в руководстве Protégé по созданию онтологий. Программа Protégé и руководство по ней являются хорошими средствами для освоения технологии Semantic Web и автор тоже начинал с этого.
Методология¶
Так как онтологии должны разрабатываться специалистами предметной области, а не специалистами по базам данных, то для того чтобы описать какой-либо предмет уместно опираться на ГОСТ Р ИСО 704 —2010. Так, согласно этого ГОСТ [1]:
«Объекты в реальном мире идентифицируются своими свойствами. Объекты абстрагируются в понятия, а свойства абстрагируются в характеристики, определяющие понятия. Абстрагирование — это процесс выделения совокупности общих признаков индивидуального набора объектов и на этой основе формирования понятия для указанного набора объектов. Характеристики являются спецификаторами, они сужают значение главного понятия (см. 5.5.2.1). Необходимо отметить, что «характеристика» является лингвистическим понятием, которое не следует путать с понятием «свойство» из области информационных технологий (ИТ).».
Эта цитата проиллюстрирована на рисунке ниже. Представленные на рисунке четыре понятия поясняются следующими принципами:
каждый объект имеет одно или несколько свойств;
каждое свойство подобного вида абстрагируется в одну характеристику;
каждая характеристика является частью одного или нескольких понятий;
каждое понятие образует одну или несколько характеристик;
каждый объект абстрагируется в одно или несколько понятий.
рисунок «Основные понятия по ГОСТ Р ИСО 704-2010 [1]»
В терминах ГОСТ [1] онтология представляет из себя «Абстракцию», т.е. описание реального мира. Соответственно
сразу возникает соблазн моделировать «Понятия» как «Классы» онтологии, а «Характеристики» как «Предикаты»
онтологии. Например в учебной онтологии pizza.owl
, из руководства по Protégé, характеристика пиццы «Острая»
задается через «Предикат» pizza:hasSpiciness
. Однако последнее предложение указанной выше цитаты из [1] и
другие источники рекомендуют моделировать «Характеристику» в виде «Класса», как самостоятельный объект,
а не в виде «Предиката». Ключевым доводом в пользу онтологического описания «Характеристик» в виде «Классов»
является сложность и размеры онтологии. Чем больше «Классов» или «Предикатов» в онтологии тем сложнее с ней работать.
Если к тысячам «Классов» онтологии добавить тысячи «Предикатов», описывающие свойства предмета, то при разработке
запросов к базе данных встает вопрос: Какие предикаты надо использовать в каких случаях?
Подсказка
Минимизируйте использование предикатов - это поможет при размещении и обращении к данным
Минимизация предикатов в онтологии существенно облегчает задачу работы с данными, как при размещении данных в хранилище, так и при извлечении данных с помощью SPARQL-запросов. Кроме того, используя предлагаемый здесь ограниченный набор «Предикатов» можно через последовательные запросы получать промежуточные результаты, которые потом уточнять через новые запросы в зависимости от потребности.
Для того, что бы перейти к списку рекомендуемых предикатов дополним утверждения ГОСТ [1] новыми принципами:
каждый объект может состоять из одних объектов и сам быть частью других объектов
каждый объект может вступать/иметь отношения с другим объектом(и)
Какие же предикаты рекомендуется использовать? Опыт моделирования данных в разных предметных областях показал, что для практически везде можно опираться на следующий набор:
rdf:type
– это предикат указывающий на Класс, которому принадлежит «Экземпляр».
onto:PartOf
– это предикат используется для описания отношений «часть-целое». При создани онтологии можно так же добавить обратное отношениеonto:isPartOf
, не забыв при этом указать что оно являетсяowl:inverseOf
исходному. Это упрощает разработку запросов. Но надо не забывать, что тогда запрос должен выполняться с включенным ризонером.
onto:hasAttribute
– этот предикат используется для описания характеристик «Экземпляра». Использование слова Attribute выбрано в связи с тем, что его написание не вызывает проблем для не англоговорящих специалистов.
onto:hasAttributeValue
– этот предикат используется для описания значений характеристик «Экземпляра».
onto:value/rdfs:label
- эти предикаты используются для обращения к значению характеристики «Экземпляра», выраженное «Литералом», первый для числовых и типа data, а второй для строковых.
Этот набор «Предикатов» достаточен для отражения первых 6 принципов.
Для описания специфических отношений между «Понятиями» для конкретной предметной области необходимо создавать отдельные «Предикаты», которые так же, как и «Классы», можно организовать в виде иерархии, если такие отношения являются родственными и могут быть обощены. Состав и разнообразие таких «Предикатов» определяется исключительно составом хранимых данных и профессиональными терминами моделируемой предметной области. Поэтому реализация принципа №7 является творческим делом и зависит от опыта онтолога.
Однако использование узкого набор «Предикатов» даже при широкой таксономии «Классов» делает описание предметной области не полным. Необходимо специфицировать какие именно «Характеристики» могут быть у каких «Понятий» и в какие отношения могут вступать «Понятия» между собой.
Для онтологического закрепления обязательного набора «Характеристики» за нужным «Классом» используются
Аксиомы. Аксиомы представляют собой те важные правила, которые действуют в моделируемой
предметной области, и фактически наличие Аксиом позволяет говорить об онтологии как о базе знаний. Однако
применение Аксиом на больших массивах данных и больших онтологиях сопряжено с огромными трудностями. Одна из
таких трудностей - последовательность применения правил логических выводов, а так же проблема отладки и управления.
Поэтому на практике широкое применение логических выводов делается с использованием SHACL-rules
. А вот
разрабатывать SHACL-rules лучше всего на основании аксиом. Последовательность и состав SHACL-rules
можно
легко задавать в зависимости от текущей потребности.
Итак, при соблюдении предложеннего здесь подхода по описанию данных можно легко получать информацию о любом объекте и его свойствах используя универсального набор запросов. Использование универсального набора запросов очень важно при разработке приложений и интерфейсов отображения данных, особенно при использовании механизма наследования. Например для разработки интерфейса приложения или бизнес-логики. Эта особенность реализована в SP4PLM и существенно сокращает время разработки приложений.
Примеры моделирования данных и запросов к ним:¶
Сокращенные тестовые данные, использованные в примерах, приведены в конце страницы. Сделано это для удобства
их анализа. Эти тестовые данные надо использовать совместно с файлом онтологии, чтобы получить те результаты
запросов, которые приведены ниже. Полные тестовые данные можно загрузить из файла pizza_data.tll
.
Схематично, сокращенные тестовые данные представлены в виде графа на картинке ниже. Это принципиальная схема того как надо приводить данные к семантическому виду.
рисунок «Схема данных и их связи между собой и классами онтологии.»
1 Запрос о принадлежности заданного «Экземпляра» к «Классу»¶
(1) Запрос¶
prefix pizza: <http://www.co-ode.org/ontologies/pizza/pizza.owl#>
select ?cls ?cls_lbl {pizza:QuattroFormaggi_1 a ?cls .
?cls rdfs:label ?cls_lbl .}
(1) Ответ¶
cls |
cls_lbl |
---|---|
pizza:QuattroFormaggi |
«Quattro Formaggi» |
2 Запрос о том, из чего состоит заданный «Экземпляр»:¶
(2) Запрос¶
prefix pizza: <http://www.co-ode.org/ontologies/pizza/pizza.owl#>
select ?item ?cls {pizza:QuattroFormaggi_1 pizza:hasPart ?item .
?item a ?cls .}
(2) Ответ¶
item |
cls |
---|---|
pizza:base_1 |
pizza:DeepPanBase |
pizza:SweetPepperTopping_1 |
pizza:SweetPepperTopping |
2а Запрос о полном составе, включая части частей по всей цепочке вложенности:¶
(2a) Запрос¶
prefix pizza: <http://www.co-ode.org/ontologies/pizza/pizza.owl#>
select ?item ?cls {pizza:QuattroFormaggi_1 pizza:hasPart* ?item .
?item a ?cls .}
этот запрос отличает от предадущего наличие * после предиката pizza:hasPart
(2a) Ответ¶
item |
cls |
---|---|
pizza:base_1 |
pizza:DeepPanBase |
pizza:SweetPepperTopping_1 |
pizza:SweetPepperTopping |
pizza:QuattroFormaggi_1 |
pizza:QuattroFormaggi |
pizza:oil_1 |
pizza:Food |
pizza:solt_1 |
pizza:Food |
pizza:sugar_1 |
pizza:Food |
3 Запрос о том куда входит заданный «Экземпляр», т.е. кто его «Родитель»:¶
(3) Запрос¶
prefix pizza: <http://www.co-ode.org/ontologies/pizza/pizza.owl#>
select ?parent ?cls {?parent pizza:hasPart pizza:sugar_1 .
?parent a ?cls .}
(3) Ответ¶
parent |
cls |
---|---|
pizza:SweetPepperTopping_1 |
pizza:SweetPepperTopping |
3а Запрос о том куда входит заданный «Экземпляр» до самого верхнего уровня:¶
(3a) Запрос¶
prefix pizza: <http://www.co-ode.org/ontologies/pizza/pizza.owl#>
select ?parent ?cls {?parent pizza:hasPart* pizza:sugar_1 .
?parent a ?cls .}
(3a) Ответ¶
parent |
cls |
---|---|
pizza:SweetPepperTopping_1 |
pizza:SweetPepperTopping |
pizza:sugar_1 |
pizza:Food |
pizza:QuattroFormaggi_1 |
pizza:QuattroFormaggi |
pizza:NamedIndividual_0 |
pizza:Pizza |
pizza:Siciliana_1 |
pizza:Siciliana |
4 Запрос о составе характеристик, которые есть в хранилище для заданного «Экземпляра»:¶
(4) Запрос¶
prefix pizza: <http://www.co-ode.org/ontologies/pizza/pizza.owl#>
select ?cls ?cls_lbl {pizza:QuattroFormaggi_1 pizza:hasAttribute ?att .
?att a ?cls .
?cls rdfs:label ?cls_lbl .}
(4) Ответ¶
cls |
cls_lbl |
---|---|
pizza:Size |
Размер |
pizza:Price |
Цена |
5 Запрос о значениях характеристик, которые есть в хранилище для заданного «Экземпляр໶
(5) Запрос¶
prefix pizza: <http://www.co-ode.org/ontologies/pizza/pizza.owl#>
prefix qudt: <http://data.nasa.gov/qudt/owl/qudt#>
select ?cls ?cls_lbl ?val ?uom_lbl {pizza:QuattroFormaggi_1 pizza:hasAttribute ?att .
?att a ?cls .
?cls rdfs:label ?cls_lbl .
?att pizza:hasAttributeValue ?att_val .
?att_val pizza:value ?val .
?att_val qudt:unit ?uom .
?uom rdfs:label ?uom_lbl .}
(5) Ответ¶
cls |
cls_lbl |
val |
uom |
---|---|---|---|
pizza:Size |
Размер |
310 |
мм |
pizza:Price |
Цена |
1250 |
руб |
6 Запрос на поиск таких «Экземпляров» у которых значениях характеристик, находятся в границах заданных диапазонов¶
(6) Запрос¶
prefix pizza: <http://www.co-ode.org/ontologies/pizza/pizza.owl#>
prefix qudt: <http://data.nasa.gov/qudt/owl/qudt#>
select ?pz_lbl ?cls_lbl ?val ?uom_lbl {
?pz rdfs:label ?pz_lbl .
?pz pizza:hasAttribute ?att .
?att a/rdfs:label ?cls_lbl .
?att pizza:hasAttributeValue ?att_val .
?att_val pizza:value ?val .
?att_val qudt:unit ?uom .
?uom rdfs:label ?uom_lbl .
?pz pizza:hasAttribute ?att_1 .
?att_1 a pizza:Size .
?att_1 pizza:hasAttributeValue / pizza:value ?val_1 . filter (?val_1 > 300 && ?val_1 <370)
?pz pizza:hasAttribute ?att_2 .
?att_2 a pizza:Price .
?att_2 pizza:hasAttributeValue / pizza:value ?val_2 . filter (?val_2 > 1500 && ?val_2 <2000)
} order by ?pz_lbl
(6) Ответ¶
pz_lbl |
cls_lbl |
val |
uom_lbl |
---|---|---|---|
Американо |
Размер |
310 |
мм |
Американо |
Цена |
1500 |
руб |
Каджун 1 |
Размер |
310 |
мм |
Каджун 1 |
Цена |
1700 |
руб |
Пицца Сохо 2 |
Размер |
310 |
мм |
Пицца Сохо 2 |
Цена |
1600 |
руб |
Тестовые данные в формате Turtle¶
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix pizza: <http://www.co-ode.org/ontologies/pizza/pizza.owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix terms: <http://purl.org/dc/terms/> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix qudt: <http://data.nasa.gov/qudt/owl/qudt#> .
@prefix unit: <http://data.nasa.gov/qudt/owl/unit#> .
pizza:QuattroFormaggi_1
a pizza:QuattroFormaggi ;
pizza:hasAttribute pizza:QuattroFormaggi_1_att_price;
pizza:hasAttribute pizza:QuattroFormaggi_1_att_size;
pizza:hasPart pizza:base_1 ;
pizza:hasPart pizza:SweetPepperTopping_1 ;
rdfs:label "Quattro Formaggi" ;
.
pizza:QuattroFormaggi_1_att_price
a pizza:Price ;
pizza:hasAttributeValue [qudt:unit unit:RussianRuble ;
pizza:value "1250"^^xsd:integer] ;
.
pizza:QuattroFormaggi_1_att_size
a pizza:Size ;
pizza:hasAttributeValue [qudt:unit unit:Millimeter ;
pizza:value "310"^^xsd:integer] ;
.
pizza:SweetPepperTopping_1
a pizza:SweetPepperTopping ;
rdfs:label "Sweet Pepper Topping" ;
pizza:hasPart pizza:sugar_1 ;
pizza:hasPart pizza:pepper_1 ;
pizza:hasPart pizza:oil_1 ;
pizza:hasPart pizza:solt_1 ;
.
pizza:sugar_1
a pizza:Food ;
rdfs:label "Сахар" ;
pizza:hasAttribute pizza:sugar_1_att_price;
.
pizza:sugar_1_att_price
a pizza:Price ;
pizza:hasAttributeValue [qudt:unit unit:RussianRuble ;
pizza:value "90"^^xsd:integer] ;
.
pizza:pepper_1
a pizza:Food ;
rdfs:label "Перец" ;
pizza:hasAttribute pizza:pepper_1_att_price;
.
pizza:pepper_1_att_price
a pizza:Price ;
pizza:hasAttributeValue [qudt:unit unit:RussianRuble ;
pizza:value "10"^^xsd:integer] ;
.
pizza:oil_1
a pizza:Food ;
rdfs:label "Масло" ;
pizza:hasAttribute pizza:oil_1_att_price;
.
pizza:oil_1_att_price
a pizza:Price ;
pizza:hasAttributeValue [qudt:unit unit:RussianRuble ;
pizza:value "200"^^xsd:integer] ;
.
pizza:solt_1
a pizza:Food ;
rdfs:label "Соль" ;
pizza:hasAttribute pizza:solt_1_att_price;
.
pizza:solt_1_att_price
a pizza:Price ;
pizza:hasAttributeValue [qudt:unit unit:RussianRuble ;
pizza:value "42"^^xsd:integer] ;
.
pizza:Veneziana_1
a pizza:Veneziana ;
pizza:hasAttribute pizza:Veneziana_1_att_price;
pizza:hasPart pizza:base_2 ;
pizza:hasPart pizza:gorgonzola_top_inst ;
rdfs:label "Veneziana" ;
.
pizza:Veneziana_1_att_price
a pizza:Price ;
pizza:hasAttributeValue [qudt:unit unit:RussianRuble ;
pizza:value "1250"^^xsd:integer] ;
.
pizza:base_1
a pizza:DeepPanBase ;
rdfs:label "Основа в виде глубокой сковороды" ;
.
pizza:base_2
a pizza:ThinAndCrispyBase ;
rdfs:label "Тонкое и хрустящее тесто" ;
.
pizza:gorgonzola_top_inst
a pizza:GorgonzolaTopping ;
rdfs:label "Топпинг с сыром Горгонзоллла" ;
.
pizza:mozarella_top_inst
a pizza:MozzarellaTopping ;
rdfs:label "Топпинг с сыром Моцарелла" ;
.
pizza:tomato_top_inst
a pizza:TomatoTopping ;
rdfs:label "Томатный топпинг" ;
.