Моделирование на N3
Содержание:
- Использование префиксов
- Стандартные предикаты
- Дизайн классов и атрибутов
- Переменные
- Правила вывода
- Кортежи
- Вывод структур
Использование префиксов
Определение каждого понятия в документе или указание на каждом элементе полного идентификатора ресурса сделало бы использование RDF N3 очень сложным, поэтому для упрощения используются префиксы и словари для определения префиксов.
Например, в словаре ( http://purl.oclc.org/dc/ ) определено понятие “title”, идентификатор которого ( http://purl.oclc.org/dc/elements/1.1./title ) мы можем заменить с помощью префикса следующим образом:
@prefix dc: <http://purl.oclc.org/dc/elements/1.1./>. < > dc:title “N3 Manual”. |
Обратите внимание на отсутствие угловых скобочек на месте идентификатора для “title”, что тоже упрощает запись выражения. Таким же образом мы можем задать префикс для обозначения текущего документа:
@prefix : <#>. :Sam :age “26”. |
Существует огромное количество словарей, содержащих самые различные префиксы, среди них выделим три, в которых описаны базовые понятия Семантической паутины:
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix owl: <http://www.w3.org/2002/07/owl#> . |
Стандартные предикаты
Ниже описаны основные предикаты пространств имён rdf, rdfs и owl.
- rdfs:Resource
Класс для любых ресурсов.
- rdf:Property
Класс для свойств, является подклассом rdfs:Resource.
- rdfs:Class
Класс классов, подкласс класса rdfs:Resource.
- rdfs:domain, rdfs:range
В rdfs словаре определены два важных свойства свойств: domain и range. Domain определяет класс, которому должны принадлежать субъекты, используемые с данным свойством. Range определяет класс, к которому должны принадлежать объекты, используемые с данным свойством. Таким образом, для domain и для range верны следующие утверждения:
rdfs:domain rdfs:domain rdf:Property; rdfs:range rdfs:Class. rdfs:range rdfs:domain rdf:Property; rdfs:range rdfs:Class. |
- rdf:type
Подкласс rdf:Property, отображает принадлежность объекта в выражении к классусубъекту. («… является экземпляром класса …»
- owl:AnnotationProperty
Класс «семантически слабых» свойств, то есть их формальное определение может незначительно расширять RDF спецификацию.
- owl:FunctionalProperty
Если свойство относится к классу owl:FunctionalProperty, то оно устанавливает взаимооднозначное отношение между объектом и субъектом,
- owl:TransitiveProperty
Если А связан с Б, а Б связа н с В с помощью транзитивного свойства (owl:TransitiveProperty), то А связан с В этим же свойством.
- owl:SymmetricProperty
Если для какого-то свойства :MyProperty a owl:SymmetricPropert.. Мы запишем следующее выражение: :MySybject :MyProperty :MyObject. То верно следущее: :MyObject :MyProperty :MySubject.
- owl:ObjectProperty
Является обобщённым классом для всех свойств объектов – подкласс rdf:Property
- owl:DatatypeProperty
Класс свойств, определяющих дату.
- owl:Class
Подкласс rdfs:Class. Класс классов owl.
- owl:Restriction
Класс ограничений для функций.
Дизайн классов и атрибутов
Для большинства компаний рано или поздно встают проблемы оптимизации использования внутренних и внешних ресурсов, анализа и дизайна бизнес-процессов. Существует множество подходов для решения соответсвующих задач, но большинство из них включают в себя построение модели предметной области. Например, мы хотим описать процесс оформления командировок в нашей компании. Этому процессу соответствует следующая модель.
Диаграмма моделей классов (бизнес-процесс оформления командировки в компании)
Следующим этапом информатизации компании является автоматизация бизнеспроцессов, для этого наша модель данных должна стать машиночитаемой. Так как подобные модели классов, по сути, являются онтологиями соответствующих предметных областей, машиночитаемость которых обуславливается описанием специальными языками, например, с использование RDF N3, то задача сводится к описанию модели классов с помощью RDF N3.
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix owl: <http://www.w3.org/2002/07/owl#> . @prefix : <#>. :Zayavka a rdfs:Class; rdfs:label "Класс заявок на командировку".
:Komandiryemii a rdfs:Class; rdfs:label "Класс командируемых".
rdfs:label "Класс командировок".
rdfs:label "Класс руководителей".
rdfs:label "Имя"; rdf:value [rdf:Datatype "string"]; rdfs:domain :Komandiryemii; rdfs:range rdfs:Resource.
rdfs:label "Имя"; rdf:value [rdf:Datatype "string"]; rdfs:domain :Rukovoditel; rdfs:range rdfs:Resource.
rdfs:label "Фамилия"; rdf:value [rdf:Datatype "string"]; rdfs:domain :Komandiryemii; rdfs:range rdfs:Resource.
rdfs:label "Фамилия"; rdf:value [rdf:Datatype "string"]; rdfs:domain :Rukovoditel; rdfs:range rdfs:Resource.
rdfs:label "Список заявок"; rdf:value [rdf:Datatype "instance"]; rdfs:domain :Komandiryemii; rdfs:range :Zayavka.
rdfs:label "Командировка"; rdf:value [rdf:Datatype "instance"]; rdfs:domain :Zayavka; rdfs:range :Komandirovka.
rdfs:label "Командируемый"; rdf:value [rdf:Datatype "instance"]; rdfs:domain :Zayavka; rdfs:range :Komandiryemii.
rdfs:label "Статус"; rdf:value [rdf:Datatype "enumerated"]; rdfs:domain :Zayavka; rdfs:range ("В работе" "Согласована руководителем" "Отклонена").
rdfs:label "Город командирования"; rdf:value [rdf:Datatype "string"]; rdfs:domain :Komandirovka; rdfs:range rdfs:Resource.
rdfs:label "Начальник отдела, согласующий командировку"; rdf:value [rdf:Datatype "instance"]; rdfs:domain :Komandirovka; rdfs:range :Rukovoditel.
rdfs:label "Поданные заявки на командировку"; rdf:value [rdf:Datatype "instance"]; rdfs:domain :Komandirovka; rdfs:range :Zayavka. |
Отображение данной модели с помощью RDF графа выглядит следующим образом:
Фрагмент RDF графа модели классов текущей предметной области
Переменные
Язык RDF N3 позволяет не только описывать факты выражениями, но и задавать переменные, что необходимо при описании правил.
Существует два типа переменных : @forAll и @forSome:
- @forAll – универсальная переменная, то есть выражение, которое написано с использованием данной переменной, будет верным для любого значения указанной переменной .
В данном случае мы определили переменную :x, потом записали, что для любого :x верно, что :name – “Jack”.
- @forSome – при таком объявлении переменной мы говорим только, о существовании удовлетворяющего условия значения.
Существует такая сущность :x со значением для :color – “red”.
Для объявления переменных существуют упрощения: объявление универсальной переменной реализуется с использованием “?”, а переменная log:forSome объявляется с использованием “_”, таким образом, примеры выше можно переписать в следующем виде:
- @forAll
- @forSome
Правила вывода
Описание правил в RDF N3 реализовано с использованием фигурных скобок. В фигурные скобки заключаются обособленные утверждения, например, в любом документе .n3 есть фигурные скобки, заключающие все выражения, содержащиеся в нём.
Структура данного правила такова:
С использованием упрощений, получаем такую запись:
Попробуем описать более сложное правило:
@prefix log:<http://www.w3.org/2000/10/swap/log#>. {?pers1 :father [:brother :pers2]}=>{:pers1 :uncle :pers2}. |
Описать данное правило можно следующим образом: для любого человека, у отца которого есть брат, он – дядя.
Кортежи
Отображение коллекции в RDF N3 реализовано с помощью списка, который задаётся перечислением в скобках, например:
Тот же самый список можно описать с использование пространства имён rdf с помощью свойств first и rest, с помощью которых определяются первый и остальные элементы списка соответсвтенно. Таким образом, указанный выше список эквивалентен следующему:
nil - список, в котором нет элементов (пустой список), если rest – nil, то больше элементов в списке нет.
Такое представление списка наглядно представлено на RDF графе нашей онтологии:
Список ("В работе", "Согласована руководителем", "Отклонена") реализован с помощью свойства "first" и "rest"
Обратите внимание, что, неявный при записи узел, соответствующий остальной части списка, на графе отображён в явном виде.
Вывод структур
В выражении так же может использоваться сущность без явного указания идентификатора, например, если мы хотим сказать, что у Анны есть две дочери 6 и 5 лет, то записать с помощью нотации 3 можем следующим образом:
- в последнем выражении не сказано, как зовут мать детей – просто использован идентификатор <#Ann>, чтобы присвоить имя, нужно в явном виде указать:
- выражения в квадратных скобках не определяют новый субъект, то есть мы не сможем сослаться на этих дочек 5 и 6 лет в другом месте. Эти выражение отображают только структуру упоминаемого объекта.