Перейти к содержанию

Моделирование на 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 "Класс командируемых".



:Komandirovka a rdfs:Class;

rdfs:label "Класс командировок".



:Rukovoditel a rdfs:Class;

rdfs:label "Класс руководителей".



:Name a rdfs:Property;

rdfs:label "Имя";

rdf:value [rdf:Datatype "string"];

rdfs:domain :Komandiryemii;

rdfs:range rdfs:Resource.



:NameRuk a rdfs:Property;

rdfs:label "Имя";

rdf:value [rdf:Datatype "string"];

rdfs:domain :Rukovoditel;

rdfs:range rdfs:Resource.



:Surname a rdfs:Property;

rdfs:label "Фамилия";

rdf:value [rdf:Datatype "string"];

rdfs:domain :Komandiryemii;

rdfs:range rdfs:Resource.



:SurnameRuk a rdfs:Property;

rdfs:label "Фамилия";

rdf:value [rdf:Datatype "string"];

rdfs:domain :Rukovoditel;

rdfs:range rdfs:Resource.



:SpisokZayavok a rdfs:Property;

rdfs:label "Список заявок";

rdf:value [rdf:Datatype "instance"];

rdfs:domain :Komandiryemii;

rdfs:range :Zayavka.



:KomandirovkaRef a rdfs:Property;

rdfs:label "Командировка";

rdf:value [rdf:Datatype "instance"];

rdfs:domain :Zayavka;

rdfs:range :Komandirovka.



:KomandiryemiiRef a rdfs:Property;

rdfs:label "Командируемый";

rdf:value [rdf:Datatype "instance"];

rdfs:domain :Zayavka;

rdfs:range :Komandiryemii.



:Status a rdfs:Property;

rdfs:label "Статус";

rdf:value [rdf:Datatype "enumerated"];

rdfs:domain :Zayavka;

rdfs:range ("В работе" "Согласована руководителем" "Отклонена").



:City a rdfs:Property;

rdfs:label "Город командирования";

rdf:value [rdf:Datatype "string"];

rdfs:domain :Komandirovka;

rdfs:range rdfs:Resource.



:Resp a rdfs:Property;

rdfs:label "Начальник отдела, согласующий командировку";

rdf:value [rdf:Datatype "instance"];

rdfs:domain :Komandirovka;

rdfs:range :Rukovoditel.



:Zayavki a rdfs:Property;

rdfs:label "Поданные заявки на командировку";

rdf:value [rdf:Datatype "instance"];

rdfs:domain :Komandirovka;

rdfs:range :Zayavka. 

Отображение данной модели с помощью RDF графа выглядит следующим образом: 

Фрагмент RDF графа модели классов текущей предметной области

Фрагмент RDF графа модели классов текущей предметной области

Переменные

Язык RDF N3 позволяет не только описывать факты выражениями, но и задавать переменные, что необходимо при описании правил. 

Существует два типа переменных : @forAll и @forSome:

  • @forAll – универсальная переменная, то есть выражение, которое написано с использованием данной переменной, будет верным для любого значения указанной переменной . 
this log:forAll :x.
:x :name “Jack”. 

В данном случае мы определили переменную :x, потом записали, что для любого :x верно, что :name – “Jack”.

  • @forSome – при таком объявлении переменной мы говорим только, о существовании удовлетворяющего условия значения. 
this log:forSome :x.
:x :color “red”. 

Существует такая сущность :x со значением для :color – “red”. 

Для объявления переменных существуют упрощения: объявление универсальной переменной реализуется с использованием “?”, а переменная log:forSome объявляется с использованием “_”, таким образом, примеры выше можно переписать в следующем виде:

  • @forAll 
?x :name “Jack”.
  • @forSome 
_x :color “red”.

 

Правила вывода

Описание правил в RDF N3 реализовано с использованием фигурных скобок. В фигурные скобки заключаются обособленные утверждения, например, в любом документе .n3 есть фигурные скобки, заключающие все выражения, содержащиеся в нём. 

{:outside :temperature :low} log:implies {:battery :temp :high}. 

Структура данного правила такова: 

{формула 1} подразумевает {формулу 2}. 

С использованием упрощений, получаем такую запись: 

{формула 1} =>{формула 2}. 

Попробуем описать более сложное правило: 

@prefix log:<http://www.w3.org/2000/10/swap/log#>.

{?pers1 :father [:brother :pers2]}=>{:pers1 :uncle :pers2}.

Описать данное правило можно следующим образом: для любого человека, у отца которого есть брат, он – дядя.  

 

Кортежи

Отображение коллекции в RDF N3 реализовано с помощью списка, который задаётся перечислением в скобках, например: 

(“John” “Sam” “Anna”). 

Тот же самый список можно описать с использование пространства имён rdf с помощью свойств first и rest, с помощью которых определяются первый и остальные элементы списка соответсвтенно. Таким образом, указанный выше список эквивалентен следующему: 

[ rdf:first “John”;   
rdf:rest [ rdf:first “Sam”; 
                   rdf:rest [ rdf:first “Anna”;   
                                   rdf:rest rdf:nil ]]] 

nil - список, в котором нет элементов (пустой список), если rest – nil, то больше элементов в списке нет.

Такое представление списка наглядно представлено на RDF графе нашей онтологии:

'Список

Список ("В работе", "Согласована руководителем", "Отклонена") реализован с помощью свойства "first" и "rest"

Обратите внимание, что, неявный при записи узел, соответствующий остальной части списка, на графе отображён в явном виде. 

 

Вывод структур

В выражении так же может использоваться сущность без явного указания идентификатора, например, если мы хотим сказать, что у Анны есть две дочери 6 и 5 лет, то записать с помощью нотации 3 можем следующим образом: 

<#Ann> <#daughter> [<#age> “6”], [<#age> “5”]. 

- в последнем выражении не сказано, как зовут мать детей – просто использован идентификатор <#Ann>, чтобы присвоить имя, нужно в явном виде указать: 

<#Ann> <#name> “Ann”. 

- выражения в квадратных скобках не определяют новый субъект, то есть мы не сможем сослаться на этих дочек 5 и 6 лет в другом месте. Эти выражение отображают только структуру упоминаемого объекта.