week5 WuYue - XLab-Tongji/AIOpsConceptualModeling GitHub Wiki
Jena 是一个使用Java编程语言的编程工具包,主要是通过编写Java程序来使用。 Jena从根本上来说是一个RDF平台,Jena的本体支持仅限于建立在RDF之上的本体形式。具体而言,是RDFS和OWL的一些变种。
RDFS是Jena支持的最弱的本体语言,RDFS允许构建简单的概念层次结构和属性层次结构。RDFS无法表达一种约束,如一种东西既不是植物又不是动物。 本体的一种用途是让我们填充关于个体的缺失信息。
OWL允许表达RDFS允许的一切,以及更多。OWL能表达更复杂的类。在 RDFS 中,属性可以通过属性层次结构进行关联。OWL扩展了这一点,它允许将属性表示为传递的、对称的或函数的,并允许将一个属性声明为另一个属性的逆属性(inverse)。OWL还对以个体(RDF资源)作为范围的属性和以数据值(RDF术语中称为文字)作为范围的属性进行了区分,分别是object properties和data propert。只有object properties具有传递和对称。
OWL语言又分:OWL Lite, OWL DL, OWL Full. OWL DL不允许OWL Full中允许的一些构建,OWL Lite具有OWL DL的所有约束以及更多的约束.OWL DL旨在能够被描述逻辑推理器有效地处理。OWL Lite旨在通过各种相当简单的推理算法进行处理.
在Jena中我们采用的是以rdf为中心的观点,这种观点将RDF三元组作为OWL形式的核心。另一种观点是将OWL看作独立的语言,这种视角使用RDF作为序列化语法。
通过本体API, Jena旨在为本体应用程序开发提供一直的编程接口,与使用的本体语言无关。
Jena本体API与语言无关。为表示各种表示之间的差异,每种本体语言都有一个概要文件,其中列出了允许的构造以及类和属性的名称。
在OWL配置文件中是: owl:ObjectProperty (short for http://www.w3.org/2002/07/owl#ObjectProperty)
在RDFS文件中是空的,RDFS没有定义对象属性。
概要文件绑定到本体模型,它是Jena的模型类的扩展版本。基本模型允许访问RDF数据集合中的语句。本体模型通过添加对预期存在于本体中的各种构造的支持来扩展这一点:类(在类层次结构中)、属性(在属性层次结构中)和个体。
在使用Jena中的本体时,所有状态信息都保留为RDF模型中存储的RDF三元组(作为Jena语句访问)。本体API不会改变本体的RDF表示。它所做的是添加一组方便的类和方法,使得编写操作底层RDF三元组的程序更为容易。
在本体语言中定义的谓词名称对应于API中Java类上的访问器方法。例如,一个本体类有一个列出它的超类的方法,它对应于RDF表示中属性的子类的值。这一点值得再次强调:没有信息存储在本体类对象本身中。当您调用OntClass listSuperClasses()方法时,Jena将从底层RDF三元组中检索信息。类似地,向本体类添加子类可以断言额外的RDF三元组,通常在模型中使用谓词rdfs:subClassOf。
构建基于本体的应用程序的一个关键好处是使用一个推理器来获得关于您正在建模的概念的额外事实。
Jena推理机创建了一个新的RDF模型,该模型似乎包含了从推理中派生出来的三元组,以及在基本模型中断言的三元组。
raph是一个内部Jena接口,支持RDF三元组集合的组合。
创建模型最简单的方法:
OntModel m = ModelFactory.createOntologyModel();
这将创建具有默认设置的本体模型。
要为特定语言创建本体模型,但保留所有其他值的缺省值,您应该将本体语言的URI传递给模型工厂。各种语言配置文件的URI字符串是:
Ontology language URI | |
---|---|
RDFS | http://www.w3.org/2000/01/rdf-schema# |
OWL Full | http://www.w3.org/2002/07/owl# |
OWL DL | http://www.w3.org/TR/owl-features/#term_OWLDL |
OWL Lite | http://www.w3.org/TR/owl-features/#term_OWLLite |
这些URI用于从ProfileRegistry查找语言配置文件。 若要创建具有给定规范的模型,应调用如下:ModelFactory
OntModel m = ModelFactory.createOntologyModel( <model spec> );
OWL本体语言包括一些用于创建模块化本体的工具,这些本体可以以类似于软件模块的方式重用。特别是,一个本体可以导入另一个本体。Jena通过自动处理本体模型中的导入语句,帮助本体开发人员使用模块化的本体。
我们将以与普通Jena模型相同的方式,使用read方法将本体文档加载到本体模型中。read有几个变体,用于处理文档源中的差异(从可解析的URL读取,或者直接从输入流或读取器读取),用于解析源文档中任何相关URI的基URI,以及序列化语言。
read( String url )
read( Reader reader, String base )
read( InputStream reader, String base )
read( String url, String lang )
read( Reader reader, String base, String Lang )
read( InputStream reader, String base, String Lang )
本体API中表示本体值的所有类都将本体资源作为一个公共超类。这使得OntResource成为为所有此类类放置共享功能的好地方,并为一般方法提供方便的公共返回值。Java接口本体资源扩展了Jena的RDF资源接口,因此任何接受资源或RDFNode的通用方法也将接受本体资源,从而也将接受任何其他本体值。 通过本体资源的方法表示的本体资源的一些常见属性如下:
Attribute | Meaning |
---|---|
versionInfo | A string documenting the version or history of this resource |
comment | A general comment associated with this value |
label | A human-readable label |
seeAlso | Another web location to consult for more information about this resource |
isDefinedBy | A specialisation of seeAlso that is intended to supply a definition of this resource |
sameAs | Denotes another resource that this resource is equivalent to |
differentFrom | Denotes another resource that is distinct from this resource (by definition) |
简单类在 Jena 中由OntClass 对象表示
OntClass paper = m.getOntClass( NS + "Paper" );
getOntClass方法将使用给定的URI检索资源,并尝试获取本体类面。如果这两个操作中的任何一个失败,getOntClass()将返回null。将此与createClass方法进行比较,如果可能的话,createClass方法将重用现有资源,如果不可能,则创建一个新的类资源:
OntClass paper = m.createClass( NS + "Paper" );
OntClass bestPaper = m.createClass( NS + "BestPaper" );
您可以使用create class方法来创建一个匿名类——一个没有关联URI的类描述。在OWL中构建更复杂的本体时,经常使用匿名类。它们在RDFS中用处不大。
OntClass anonClass = m.createClass();
一旦有了本体类对象,就可以通过在本体类上定义的方法开始处理它。类的属性的处理方式与上面的本体资源的属性类似,使用一组方法来设置、添加、获取、测试、列出和删除值。以这种方式处理的类的属性有:
Attribute | Meaning |
---|---|
subClass | A subclass of this class, i.e. those classes that are declared subClassOf this class. |
superClass | A super-class of this class, i.e. a class that this class is a subClassOf. |
equivalentClass | A class that represents the same concept as this class. This is not just having the same class extension: the class ‘British Prime Minister in 2003’ contains the same individual as the class ‘the husband of Cherie Blair’, but they represent different concepts. |
disjointWith | Denotes a class with which this class has no instances in common. |
因此,在我们的示例本体中,我们可以打印一个艺术品的子类列表,如下所示:
OntClass artefact = m.getOntClass( NS + "Artefact" );
for (Iterator<OntClass> i = artefact.listSubClasses(); i.hasNext(); ) {
OntClass c = i.next();
System.out.println( c.getURI() );
}
在RDFS和OWL语义下,每个类都是自己的子类(自反的)。虽然在语义上是这样,但Jena用户报告说它不方便。因此,listSubClasses和listSuperClasses便利方法从迭代器返回的结果列表中删除了反射。但是,如果您使用普通模型API来查询三元组的rdfs:子类,假设使用了推理器,那么反射三元组将出现在推论的三元组中。