我需要在我的本体中用 OWL 语法定义类之间的关系。我应该怎么办?
2 回答
我同意 cygri 的观点,与#net
like #Node
this 相关似乎没有意义,并且您可能希望所有的实例#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>
或者你可以使用“双关语”,即使用一个类作为实例,例如:
<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 出现的上下文总是清楚地表明该术语所指的内容。
首先,请注意有两种 XML 语法(除了其他几种非 XML 语法)可用于编写 OWL。您的代码片段采用 RDF/XML 语法。另一种语法是 OWL/XML。OWL Primer有两种语法的例子。
你的片段说:
- URI
<#net>
标识一个类。 - 此类具有标签“网络”(一个字符串)。
- 此类与由 URI 标识的事物处于“hasPart”关系
<#Node>
。
前两件事是有道理的,但最后一点是没有道理的。我想你真正想说的是:
- URI
<#Node>
还标识一个类。 - URI
<#hasPart>
标识连接两个类的个体的属性 (anowl:ObjectProperty
)。 - hasPart 属性的主题是网络(换句话说,hasPart 的域是
#net
)。 - hasPart 属性的对象是节点(换句话说,hasPart 的范围是
#node
)。
查看 OWL Primer 中的示例应该会让您对如何写下这些内容有一个不错的想法。但还要注意,手工编写 RDF/XML 语法既乏味又容易出错。您可能希望使用 TopBraid Composer 之类的 OWL 编辑器或 OWL-API 之类的编程库来创建您的 OWL 文件。如果您真的想手动编写它们,我建议使用 Turtle 语法(同样,Primer 中有示例),因为它更具可读性,并且可以让您抢先学习 SPARQL,它是 OWL 和 RDF 的查询语言。