Создание отношений между классами на языке веб-онтологий (сова)
Мне нужно определить отношения между классами в моей онтологии в синтаксисе OWL. что я должен делать?
2 ответа
Во-первых, обратите внимание, что есть два синтаксиса XML (в дополнение к нескольким другим синтаксисам, отличным от XML), которые вы можете использовать для написания OWL. Ваш фрагмент в синтаксисе RDF/XML. Другой синтаксис - OWL/XML. Учебник по OWL содержит примеры обоих синтаксисов.
Ваш фрагмент говорит:
- URI
<#net>
идентифицирует класс. - Этот класс имеет метку "сеть" (строка).
- Этот класс находится в отношении "hasPart" с чем-то, что идентифицируется URI
<#Node>
,
Первые две вещи имеют смысл, но последняя не совсем. Я думаю, что вы действительно хотите сказать:
- URI
<#Node>
также идентифицирует класс. - URI
<#hasPart>
идентифицирует свойство, которое связывает людей двух классов (owl:ObjectProperty
). - Субъектами свойства hasPart являются сети (другими словами, домен hasPart
#net
). - Объекты свойства hasPart являются узлами (другими словами, диапазон hasPart равен
#node
).
Изучение примеров в OWL Primer должно дать вам хорошее представление о том, как записать эти вещи. Но также обратите внимание, что написание синтаксиса RDF/XML вручную является утомительным и подверженным ошибкам. Возможно, вы захотите использовать редактор OWL, например, TopBraid Composer, или библиотеку программирования, например, OWL-API, для создания ваших файлов OWL. Если вы действительно хотите писать их вручную, я рекомендую использовать синтаксис Turtle (опять же, у Primer есть примеры), потому что он гораздо более читабелен и дает вам преимущество в изучении SPARQL, языка запросов для OWL и RDF.
Я согласен с Cygri, что в отношении #net
в #Node
как будто это не имеет смысла, и, вероятно, вы хотели бы, чтобы все случаи #net
иметь часть или некоторые части, которые являются примерами #Node
, Для этого вы можете написать:
<owl:Class rdf:ID="Node"/>
<owl:Class rdf:ID="net">
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="#hasPart"/>
<owl:someValuesFrom rdf:resource="#Node"/>
</owl/Restriction>
</rdfs:subClassOf>
</owl:Class>
Вы все еще можете определить свойства, которые соединяют два класса напрямую. Например:
<#Node> <#isSimilarTo> <#Vertice> .
Чтобы сделать это в OWL, вы можете определить owl:AnnotationProperty
:
<owl:AnnotationProperty rdf:about="isSimilarTo"/>
<owl:Class rdf:ID="Node">
<isSimilarTo rdf:resource="#Vertice"/>
</owl:Class>
Или вы можете использовать "punning", то есть использовать класс в качестве экземпляра, например:
<owl:ObjectProperty rdf:about="isSimilarTo"/>
<owl:Class rdf:ID="Node">
<rdf:type rdf:resource="&owl;Thing"/>
<isSimilarTo>
<owl:Thing rdf:about="#Vertice"/>
</isSimilarTo>
</owl:Class>
Обратите внимание, что в OWL DL все экземпляры должны быть явно напечатаны. Вот, #Node
объявлен как класс и экземпляр owl:Thing
, Это не значит что owl:Thing
может содержать классы, но это означает, что #Node
ссылаются на две разные вещи: класс и экземпляр. В OWL DL контекст, в котором появляется IRI, всегда проясняет, к чему относится этот термин.