week5 LiTianyi - XLab-Tongji/AIOpsConceptualModeling GitHub Wiki
Jena学习笔记
The core RDF API
Core concepts
Model:在Jena中,由RDF三元组的集合所提供的所有状态信息都包含在成为Model的数据结构中。
Graph:这个model表示RDF Graph。它包含RDF nodes(节点),通过有表识的关系互相连接,每种关系仅朝一个方向发展,因此三元组为:
example:ijd foaf:name "Ian"
可以被理解为'resource example:ijd
has property foaf:name
with value "Ian"
'.显然反过来说是不对的。数学上,这使得model成了一个有向图的实例。
在Java语法中, 我们用Model
类来作为包含在一个图里的RDF信息的容器。它有丰富的API,可以有丰富的简化编写基于RDF的教程和应用程序的方法。Model
的另一个角色是提供一个储存RDF节点和关系的抽象。
在内部,Jena使用更简单的抽象Graph
作为底层RDF存储的通用接口。Graph
具有更简单的API,因此更容易针对不同的存储对象重新实现。
总之,JenaRDF容器具有三个不同的概念:
- 图,连接结构中节点之间有向关系的数学视图
Model
,丰富的Java API,为Java应用程序开发人员提供了许多便捷的方法Graph
,一种用于扩展Jena功能的简单Java API。
Nodes: resources, literals and blank nodes
有两种nodes:URI引用和文字。分别表示我们希望对其进行断言的某些resources以及出现在这些断言中的具体数据值。example:ijd
是一个resource,表示一个人,"Ian"
表示该资源的属性值。resource由URI表示,它表示我们想在一个RDF model中想表示的东西。
literal(文字)用来代表一种数据值比如stringten
或是number10
。代表数值的literals可能有一个相连接的datatype,string不用。默认情况下茄丁使用XSD的数据类型,但实际上可以使用任何数据类型URI。
anonymous resource:有空身份(URI)。通常被称为图中有空白身份的节点,blank nodes,缩写为bNodes。
在Jena中,Java接口Resource
既代表普通的URI资源又代表bNodes(对于bNode,该getURI()
方法返回null
,并且该isAnon()
方法返回true)。Java接口Literal
代表文字。由于这两种资源和文字可能显示为在图中的节点,所述公共接口RDFNode
是Resource
和Literal
两者的超类。
三元组
在一个RDF graph中,关系总是连接一个subject resource到另一个resource或者是一个literal,例如:
example:ijd foaf:firstName "Ian".
example:ijd foaf:knows example:mary.
SPO,我们将一个主语,谓语和宾语的陈述称为三元组,自然而然的,triplestore变成一种储存RDF信息的方式。
在Jena中,被用来代表一个三元组的Java类是Statement
。只有resources可以是一个RDF三元组的主语,而宾语可以是一个resource或者literal。提取一个Statement
中元素的主要方法:
getSubject()
returning aResource
getObject()
returning anRDFNode
getPredicate()
returning aProperty
从技术上讲,RDF图对应于一组RDF三元组。这意味着一个RDF resource最多只能是一个具有相同谓词和宾语的三元组的主语(因为集合不包含任何重复项)。
Properties
如上所述,RDF图中两个resource或一个resource与literal之间的连接用该property的identity标记。正如RDF本身将URI用作资源名称一样,最大程度地减少了偶然的名称冲突机会。RDF Properties只是RDF Resources的一个特例。属性在Jena中用Property
对象表示,它是Resources
的一个子类(它本身也是RDFNode
)的一个子类。
properties和resources的一个区别在于RDF不允许匿名的properties,所以不能把一个bNode用在图中的Property
。
Namespaces
每个不同的使用者使用同一个名称时,语义可以互不干扰。一个compact URI
或者curie
可以是一个在namespace和name通过colon来区别的方式:
acme-product:price
emca-catalogue:price
其中 acme-product
可以定义为http://acme.example/schema/products#
,这可以被定义,比如在Turtle中:
@prefix acme-product: <http://acme.example/schema/products#>.
acme-product:widget acme-product:price "44.99"^^xsd:decimal.
数据类型xsd:decimal
是缩略URI的另一个示例。请注意,@prefix
RDF或Turtle均未定义任何规则:RDF内容的作者应确保在使用curie之前定义所有前缀。
Jena OWL
由于Jena从根本上来说是RDF平台,因此Jena对本体的支持仅限于基于RDF之上的本体形式主义。具体来说,这意味着RDFS,OWL的变体。
class层次结构是图二不是树(比如不是像Java里的类继承)。在RDFS中,我们只能命名类,而不能构造用于描述有趣类的表达式。但是,对于许多应用程序来说,陈述基本词汇表就足够了,而RDFS非常适合于此。
在RDFS中,我们可以说laterrlLines
属性的domain是Fish
类,所以RDFS推理程序可以知道Freda一定是鱼。
Ontology languages and the Jena Ontology API
有多种不同的本体语言可用于表示语义网上的本体信息。从最富表现力的OWL Full到最弱的RDFS。通过本体API,Jena旨在为本体应用程序开发提供一致的编程接口,而与程序中使用的本体语言无关。
Jena Ontology API与语言无关:Java类名称并不特定于基础语言。例如,OntClass
Java类可以表示OWL类或RDFS类。为了表示各种表示形式之间的差异,每种本体语言都有一个profile,其中列出了允许的构造以及类和属性的名称。
因此,在OWL概要文件中是它owl:ObjectProperty
,而在RDFS概要文件中是null
因为RDFS没有定义对象属性。
概要文件绑定到本体模型,本体模型是Jena[Model
]类的扩展版本 。该库Model
允许访问RDF数据集合中的语句。 [OntModel
]通过增加对预期存在于本体中的构造类型的支持来扩展此范围:类(在类层次结构中),属性(在属性层次结构中)和个体。
本体API不会更改本体的RDF表示形式。它的作用是添加一组便利类和方法,这些类和方法使您可以更轻松地编写操作基础RDF三元组的程序。
Ontologies and reasoning
Jena推理机的一个共同特征是,他们创建了一个新的RDF模型,该模型似乎包含从推理中得出的三元组以及在基础模型中确定的三元组。但是,此扩展模型仍符合Jena模型的结构。可以在可以使用非推理模型的任何地方使用它。本体API利用了这一功能:本体API提供的便利方法可以查询扩展的推理模型,就像查询普通的RDF模型一样。实际上,这是一种常见的模式,我们为构建本体模型提供了简单的方法,这些本体模型的语言,存储模型和推理引擎在OntModel
创建an时都可以简单地指定。我们将很快显示示例。
Graph
是一个内部Jena接口,它支持RDF三元组的组合。可以从本体文档中读取的声明语句保存在基础图中。推理机或推理引擎可以使用基本图的内容和语言的语义规则来显示更完整的基本和相关三元组。这也通过Graph
界面显示,因此OntModel
仅适用于最外面的接口。这种规律性使我们可以轻松构建带有或不带有推理程序的本体模型。这也意味着基本图可以是内存中的存储,数据库支持的持久性存储或其他某种存储结构(例如LDAP目录),而不会影响本体模型的运行(但要注意,这些不同的方法可能会有非常不同的效率曲线)。
Ontology properties
在本体中,属性表示资源之间或资源与数据值之间的关系的名称。它对应于逻辑表示中的谓词。RDFS和OWL的一个有趣的方面是,属性没有定义为某些封闭类的方面,而是本身具有一流的对象。这意味着本体和本体应用程序可以直接存储,检索和声明属性。因此,Jena具有一组Java类,使您可以方便地操纵本体模型中表示的属性。
本体模型中的属性是核心Jena API类的扩展, Property
并允许访问可以断言的有关本体语言中的属性的其他信息。用于表示Java本体属性的通用API超类为 OntProperty
。同样,使用添加,设置,获取,列出,具有和删除方法的模式,我们可以访问的以下属性 OntProperty
:
Attribute | Meaning subProperty | A sub property of this property; i.e. a property which is declared to be a subPropertyOf
this property. If p is a sub property of q, and we know that A p B
is true, we can infer that A q B
is also true. superProperty | A super property of this property, i.e. a property that this property is a subPropertyOf
domain | Denotes the class or classes that form the domain of this property. Multiple domain values are interpreted as a conjunction. The domain denotes the class of value the property maps from. range | Denotes the class or classes that form the range of this property. Multiple range values are interpreted as a conjunction. The range denotes the class of values the property maps to. equivalentProperty | Denotes a property that is the same as this property. inverse | Denotes a property that is the inverse of this property. Thus if q is the inverse of p, and we know that A q B
, then we can infer that B p A
.
Object and Datatype properties
Jena的Java接口 [ObjectProperty
], [DatatypeProperty
]和AnnotationProperty 是[OntProperty
]子类。但是,它们没有任何特定于自己的行为(方法)。它们的存在使ObjectProperty的更复杂的子类型(传递属性等)在类层次结构中保持分离。但是,当在模型中创建对象属性或数据类型属性时,将具有rdf:type
在基础三元组中声明不同语句的作用 。
More complex class expressions
我们在上面介绍了基本的命名类的处理。这些是RDFS中唯一可用的类描述。但是,在OWL中,有许多其他类型的类表达式,它们允许对概念进行更丰富和更具表达力的描述。附加类表达式有两个主要类别:限制和布尔表达式。我们将依次检查每个。
Restriction class expressions
Restriction定义由参考一个类来包含所述类的成员的个人的属性之一,然后放置在该属性一些约束。例如,从动物分类学的简单角度来看,我们可以说哺乳动物被毛皮覆盖,鸟类被羽毛覆盖。因此,hasCovering
在一种情况下,属性被限制为具有值fur
,在另一种情况下,属性被限制为具有值feathers
。这是有价值限制的。OWL当前定义了六种限制类型:
Restriction type | Meaning has value | The restricted属性正好具有给定的值。all values from | All values of the restricted属性(如果有的话)都是给定类的成员。来自|的一些值 该属性至少具有一个作为给定类成员的值。cardinality | 对于某个正整数n,该属性恰好具有n个值。最小基数| 对于某个正整数n,该属性至少具有n个值。最大基数| 对于某个正整数n,该属性最多具有n个值。
Boolean class expressions
大多数开发人员都熟悉使用布尔运算符来构造命题表达式:合取(和),析取(或)和否定(不)。OWL提供了一种方法,可通过根据构成类成员的一组个人来考虑类描述,从而使用类似的运算符构造描述类的表达式。
假设我们要说一个实例x
具有rdf:type
A
和 rdf:type
B
。这意味着,x
既是该组中的个体的构件A
,并在该组中的个体B
。因此,x
位于类和的交集。如果,另一方面, 或者是具有或,然后必须位于工会 的和。最后,说x并没有具备,它必须位于补的A
B
A
rdf:type
A
B
x ``A
B
rdf:type
A
A
。这些运算,并集,交集和补码是用于构造类表达式的布尔运算符。尽管补数仅包含一个参数,但并集和交集必须包含多个参数。