Protege 4.0.1 [1] - свободно распространяемый редактор онтологий, создаваемых для применения в семантическом Web.
На рис. 1 представлено одно из окон редактора с примером простой онтологии. На рисунке видны иерархии классов и их свойств, вводимых пользователем при создании онтологии. Справа виден фрагмент автоматически создаваемого описания онтологии на языке OWL.
Рис. 1.  
Создание онтологии, как правило, является итерационным процессом, выполняемым по нисходящему принципу. Работа начинается с выявления исходного подмножества концептов, иначе классов (Classes). Определение класса состоит из двух частей: название (или ссылка) и список ограничений. Каждое выражение (элемент списка ограничений) уточняет свойства представителей класса, называемых экземплярами или индивидами. Индивиды принадлежат к множеству, являющемуся пересечением указанных ограничений. Далее определяются свойства классов (ObjectProperty и DataProperty), характеристики свойств и конкретные реализации классов, т.е. индивиды.
Создание классов
В редаторе Protege последовательно выбираются: пункт меню "Classes", в левом окне корень иерархии классов Thing, пункт "Add subclass". В появившемся окне набирается имя класса. Добавление новых классов в образующееся дерево: выбор узла дерева, набор имени класса, этот новый класс включается в дерево как подкласс выбранного класса. Можно перемещать узлы дерева из одного положения в другое.
На языке OWL описание класса дается в одном из видов:
<owl:Class rdf:ID="Имя_класса"/> или
<owl:Class rdf:about="Имя_класса"/>
С помощью формы about можно обращаться к классам в распределенной сети онтологий. После того, как класс продекларирован, на него можно ссылаться в виде #Имя_класса.
Формы описания подкласса:
<owl:Class rdf:ID="Имя_подкласса">
  <rdfs:subClassOf rdf:resource="#Имя_класса"/>
или при наличии явно выражаемых ограничений
<owl:Class rdf:ID="Имя_подкласса">
  <rdfs:subClassOf>
    <owl:Restriction>
      <owl:onClass rdf:resource="#Имя_класса"/>
      <owl:minCardinality rdf:datatype="&xsd;nonNegativeInteger">1</owl:minCardinality>
    </owl:Restriction>
  </rdfs:subClassOf>
 </owl:Class>
Ограничение (Restriction) в данном примере заключается в том, что подкласс содержит не менее (minCardinality) одного объекта (тип nonNegativeInteger) из класса "#Имя_класса". Если класс ограничивается наличием свойства, то
 <owl:Class rdf:about="Имя_подкласса">
        <rdfs:subClassOf>
            <owl:Restriction>
                <owl:onProperty rdf:resource="#имя_свойства"/>
                . . . .
            </owl:Restriction>
        </rdfs:subClassOf>
    </owl:Class>
Здесь вместо многоточия может быть конкретное ограничение. Мы видим, что между строками <owl:Class rdf:about="Имя_подкласса"> и </owl:Class> помещаются различные характеристики класса: место в иерархии классов, присущие классу свойства, ограничения на эти свойства.
Элементы onClass и onProperty используются именно в ограничениях.
Создание свойств классов
Свойства в OWL - бинарные отношения. Различают свойства-значения (DataProperty) и свойства-объекты (ObjectProperty).
DataProperty - отношение между индивидами и типами данных (литералами). Для указания типа в Protege в режиме "Data Properties" в окне "Description" выбирается пункт "Domains" и в появившемся окне указываются тип, например, integer, и его Cardinality.
Для ObjectProperty нужно указать классы, связываемые описываемым свойством-отношением. Часто описание ObjectProperty дается в виде:
<owl:ObjectProperty rdf:ID="имя_свойства">
  <rdfs:domain rdf:resource="#Имя_класса"/>
  <rdfs:range rdf:resource="#Имя_класса"/>
</owl:ObjectProperty>
Указываются имена тех классов, к которым относится свойство.
Свойства, как и классы, в процессе их ввода в модель могут связываться друг с другом отношениями "род/вид", образуя иерархическое дерево.
Имеются средства указания характеристик свойств, таких как транзитивность, симметричность, функциональность и др. Например:
<owl:ObjectProperty rdf:ID="имя_свойства">
  <rdf:type rdf:resource="&owl;FunctionalProperty" />
  <rdfs:domain rdf:resource="#Имя_класса" />
  <rdfs:range  rdf:resource="#Имя_класса" />
</owl:ObjectProperty>
Если указано несколько доменов (или диапазонов), то в качестве домена (диапазона) принимается пересечение множеств.
Свойство DataProperty по умолчанию имеет тип String.
Возможны ограничения свойств. Ограничения свойств можно ввести в блок Restriction с помощью строки
<owl:allValuesFrom rdf:resource="#Имя_класса" />
Например:
<owl:Restriction>
      <owl:onProperty rdf:resource="#имя_свойства" />
      <owl:allValuesFrom rdf:resource="#Имя_класса" />
</owl:Restriction>
Здесь allValuesFrom означает, что все значения свойства включают в качестве элемента представителя класса, указанного в строке owl:allValuesFrom. Если вместо allValuesFrom записать someValuesFrom, то это означает, что, по крайней мере, одно из значений свойства должно относиться к указанному классу.
Индивиды
Индивид — элемент класса. Индивиды описываются как подклассы, причем обычно индивидами называют объекты, имеющиеся в одном экземпляре:
  <Имя_класса rdf:ID="Имя_индивида"/>
Если описываются экземпляры определенного класса, то
 <Имя_класса rdf:about="#Имя_индивида">
    <rdf:type rdf:resource="Имя_класса"/>
 </Имя_класса>
У индивидов описание свойств возможно путем записи
<Имя_класса rdf:ID="Имя_индивида">
  <свойство rdf:datatype="&xsd;positiveInteger">значение_свойства</свойство>
</Имя_класса> 
Отношения концептов
Наряду с родо-видовыми отношениями важно иметь возможность использовать отношения, позволяющие связывать (объединять) разные онтологии. Для этого в OWL введены отношения эквивалентности классов, свойств (equivalentClass, equivalentProperty) и индивидов (sameAs). Обратный смысл имеют отношения differentFrom и AllDifferent.
Список литературы
1. Protege. — http://protege.stanford.edu/
2. Н.Ф. Ной, Д.Л. МакГиннесс. Разработка онтологий 101: руководство по созданию Вашей первой онтологии. — http://ryk-kypc2.narod.ru/lab3.html (или noy@smi.stanford.edu и dlm@ksl.stanford.edu)