摘自:http://www.crabone.com/index.php/category/tool/jena
JENA中有一个最底层的接口:RDFNode,它代表RDF这张巨大图中的节点,这个节
点可以是一个资源,可以是一个字符窜或者数字。因此它对应与2个子接口:
interface Literal extends RDFNode
interface Resource extends RDFNode
Literal接口代表了一些原始类型节点,比如:32位整型、布尔型等等。
Resource接口还可以继续衍生出2个重要的接口:
interface Container extends Resource
interface Property extends Resource
Container接口就对应了RDF的容器表达能力,里面有bag,seq,alt
Property接口就是所谓的资源属性了
在RDF的世界中,其实描述资源只有一种方式,那就是三元组,包括:主体
(subject),谓词(predicate),客体(object)。主体和客体就是图中的2个节点,谓词就是一条边。这三元组在JENA中用
Statement接口来描述,该接口中有下面3个方法:
public Resource getSubject();
public Property getPredicate();
public RDFNode getObject();
我们可以发现,主体一定是一种资源,不可能是一个Literal原始类型,因此主体必定属于Resource接口实现,但是客体可以是原始类型,比如:人
有2条腿。人
为主体;有
为谓词;2
为客体。
用一个例子来巩固下:
-
<?
xml
version
=
"
1.0
"
?>
-
<
rdf:RDF
xmlns:rdf
=
"
http://www.w3.org/1999/02/22-rdf-syntax-ns#
"
-
xmlns:s
=
"
http://example.org/students/vocab#
"
>
-
-
<
rdf:Description
rdf:about
=
"
http://example.org/courses/6.001
"
>
-
<
s:students
>
-
<
rdf:Bag
>
-
<
rdf:li
rdf:resource
=
"
http://example.org/students/Amy
"
/>
-
<
rdf:li
rdf:resource
=
"
http://example.org/students/Mohamed
"
/>
-
<
rdf:li
rdf:resource
=
"
http://example.org/students/Johann
"
/>
-
<
rdf:li
rdf:resource
=
"
http://example.org/students/Maria
"
/>
-
<
rdf:li
rdf:resource
=
"
http://example.org/students/Phuong
"
/>
-
</
rdf:Bag
>
-
</
s:students
>
-
</
rdf:Description
>
-
</
rdf:RDF
>
如果要一下子看出这个RDF中有几个三元组,一定不是很方便吧?如果用图来表示:
是不是非常清晰呢?图中有一个主体http://example.org/courses/6.001,它有一条边http://example.org
/students/vocab#students,对应的客体就是那个空节点。同理还有这个空节点所对应的那些三元组。用JENA来解析这个例子:
-
Model
model
=
ModelFactory
.
createDefaultModel
()
;
-
-
model
.
read
(
new
FileInputStream
(
"
student.rdf
"
)
,
null
)
;
-
-
StmtIterator
it
=
model
.
listStatements
()
;
-
-
while
(
it
.
hasNext
())
-
{
-
System
.
out
.
println
(
it
.
next
())
;
-
}
打印的结果如下:
[http://example.org/courses/6.001,
http://example.org/students/vocab#students, -23ba78ea:125e9da42c8:-8000]
[-23ba78ea:125e9da42c8:-8000,
http://www.w3.org/1999/02/22-rdf-syntax-ns#_5,
http://example.org/students/Phuong]
[-23ba78ea:125e9da42c8:-8000,
http://www.w3.org/1999/02/22-rdf-syntax-ns#_4,
http://example.org/students/Maria]
[-23ba78ea:125e9da42c8:-8000,
http://www.w3.org/1999/02/22-rdf-syntax-ns#_3,
http://example.org/students/Johann]
[-23ba78ea:125e9da42c8:-8000,
http://www.w3.org/1999/02/22-rdf-syntax-ns#_2,
http://example.org/students/Mohamed]
[-23ba78ea:125e9da42c8:-8000,
http://www.w3.org/1999/02/22-rdf-syntax-ns#_1,
http://example.org/students/Amy]
[-23ba78ea:125e9da42c8:-8000,
http://www.w3.org/1999/02/22-rdf-syntax-ns#type,
http://www.w3.org/1999/02/22-rdf-syntax-ns#Bag]
在RDF入门的例子中,有这样一幅图:
最中间的那个节点起一个过渡作用,这时,虽然它也是一个资源,但这个资源没有必要标上资源描述符,因为它可能只在应用程序局部使用,作为推理机的一个桥梁
等等作用,换句说,这个资源别人没有必要去引用。这样的节点,我们称之为空节点:
-
Model
model
=
ModelFactory
.
createDefaultModel
()
;
-
-
Resource
blankNode
=
model
.
createResource
(
new
AnonId
(
"
tempNode
"
))
;
-
Property
city
=
model
.
createProperty
(
"
http://www.crabobe.com/city
"
)
;
-
Property
street
=
model
.
createProperty
(
"
http://www.crabobe.com/street
"
)
;
-
blankNode
.
addProperty
(
city
,
"
深圳
"
)
;
-
blankNode
.
addProperty
(
street
,
"
龙岗
"
)
;
-
-
Resource
crab
=
model
.
createResource
(
"
http://www.crabobe.com/crab
"
)
;
-
Property
address
=
model
.
createProperty
(
"
http://www.crabobe.com/address
"
)
;
-
crab
.
addProperty
(
address
,
blankNode
)
;
-
-
model
.
write
(
System
.
out
)
;
注意,包含中文的源码文件必须是UTF-8的,运行结果如下:
-
<
rdf:RDF
-
xmlns:rdf
=
"
http://www.w3.org/1999/02/22-rdf-syntax-ns#
"
-
xmlns:j
.
0
=
"
http://www.crabobe.com/
"
>
-
<
rdf:Description
rdf:about
=
"
http://www.crabobe.com/crab
"
>
-
<
j
.
0:address
rdf:nodeID
=
"
A0
"
/>
-
</
rdf:Description
>
-
<
rdf:Description
rdf:nodeID
=
"
A0
"
>
-
<
j
.
0:street
>
龙岗
</
j
.
0:street
>
-
<
j
.
0:city
>
深圳
</
j
.
0:city
>
-
</
rdf:Description
>
-
</
rdf:RDF
>
RDF作为资源描述框架,有2件事情是它的本职工作,第一,描述资源的唯一性,只有统一了,各种应用才能达成共识,好
比秦始皇那会儿一样。第二,要把资源表述得有条有理。下面,拿出代码来解释。
-
Model
model
=
ModelFactory
.
createDefaultModel
()
;
-
-
Resource
crab
=
model
.
createResource
(
"
http://www.crabobe.com/crab
"
)
;
-
-
model
.
write
(
System
.
out
)
;
上面,我们用jena建立了crab这样一个资源,当然,crab只是java内存中的一
个变量名而已,它真是的标识符号是http://www.crabobe.com/crab
,也即,在这个世界上,这
个资源是唯一存在的。
我们继续添加一个资源
-
Model
model
=
ModelFactory
.
createDefaultModel
()
;
-
-
Resource
crab
=
model
.
createResource
(
"
http://www.crabobe.com/crab
"
)
;
-
Property
numerOfLeg
=
model
.
createProperty
(
"
http://www.crabobe.com/crab#numerOfLeg
"
)
;
-
-
model
.
write
(
System
.
out
)
;
这里我们添加了一个资源numerOfLeg,有人问,它是一个属性(Property)吧?没错,但在RDF中,属性也是一种资源,在JENA
中,Property是Resource的子接口。既然它是一种资源,那必定得有唯一的标识符,这个标识符就是http://www.crabobe.com/crab#numerOfLeg
。
接着我们用numerOfLeg这个属性来描述crab
-
Model
model
=
ModelFactory
.
createDefaultModel
()
;
-
-
Resource
crab
=
model
.
createResource
(
"
http://www.crabobe.com/crab
"
)
;
-
Property
numerOfLeg
=
model
.
createProperty
(
"
http://www.crabobe.com/crab#numerOfLeg
"
)
;
-
crab
.
addProperty
(
numerOfLeg
,
"
8
"
)
;
-
-
model
.
write
(
System
.
out
)
;
运行的结果:
-
<
rdf:RDF
-
xmlns:j
.
0
=
"
http://www.crabobe.com/crab#
"
-
xmlns:rdf
=
"
http://www.w3.org/1999/02/22-rdf-syntax-ns#
"
>
-
<
rdf:Description
rdf:about
=
"
http://www.crabobe.com/crab
"
>
-
<
j
.
0:numerOfLeg
>
8
</
j
.
0:numerOfLeg
>
-
</
rdf:Description
>
-
</
rdf:RDF
>
关于这个结果,虽然很简单,但是里面有个细节需要我们去关注!!同样是资源描述符,资源的
描述符和属性的描述符是不一样的。区别就体现在,资源的描述符仅仅是作为rdf:Description标签的一个属性
,
而属性的描述符却要被用来作为XML标签
。在这点上来看,属性的资源描述符一定要带有相对路径,假如我们这样写:
model.createProperty(”http://www.crabobe.com”);
那么这个属性标签的命名空间就没有了,如果命名空间标示为http://www.crabobe.com,那它自己的名称呢?所以,jena会报错。
所以,我们的写法可以是这样:
http://www.crabobe.com/crab
那么http://www.crabobe.com/就是命名空间,crab就是标签名称
也可以像例子都那样写:
http://www.crabobe.com/crab#numerOfLeg
那么命名空间就是http://www.crabobe.com/crab#,被jena简写成j.0,名称就是numerOfLeg。
现在,我们来验证资源的唯一性:
-
Model
model
=
ModelFactory
.
createDefaultModel
()
;
-
-
Resource
crab
=
model
.
createResource
(
"
http://www.crabobe.com
"
)
;
-
Resource
crab1
=
model
.
createResource
(
"
http://www.crabobe.com
"
)
;
-
Property
numerOfLeg
=
model
.
createProperty
(
"
http://www.crabobe.com/crab#numerOfLeg
"
)
;
-
Property
numerOfLeg1
=
model
.
createProperty
(
"
http://www.crabobe.com/crab#numerOfLeg
"
)
;
-
crab
.
addProperty
(
numerOfLeg
,
"
8
"
)
;
-
crab1
.
addProperty
(
numerOfLeg1
,
"
8
"
)
;
-
-
model
.
write
(
System
.
out
)
;
这里,我们人为写出2个对象,但是资源描述符写成一样,这2个对象分别有各自属性,按照唯
一性,那么内存中即使对象再是多,在RDF规范中,只会认资源描述符,只要资源描述符是一样的,那么就视为一个资源。运行的结果,符合我们的推理。
如果我们改一改:
-
Model
model
=
ModelFactory
.
createDefaultModel
()
;
-
-
Resource
crab
=
model
.
createResource
(
"
http://www.crabobe.com
"
)
;
-
Resource
crab1
=
model
.
createResource
(
"
http://www.crabobe.com
"
)
;
-
Property
numerOfLeg
=
model
.
createProperty
(
"
http://www.crabobe.com/crab#numerOfLeg
"
)
;
-
Property
numerOfLeg1
=
model
.
createProperty
(
"
http://www.crabobe.com/crab#numerOfLeg
"
)
;
-
crab
.
addProperty
(
numerOfLeg
,
"
8
"
)
;
-
crab1
.
addProperty
(
numerOfLeg1
,
"
10
"
)
;
-
-
model
.
write
(
System
.
out
)
;
分享到:
相关推荐
一个简单的Jena使用例子可能涉及以下步骤: 1. **创建Model**: 首先,我们需要创建一个Model对象来存储RDF数据。这通常通过`ModelFactory.createDefaultModel()`完成。 ```java Model model = ModelFactory....
在这个"jena例子"中,我们将深入探讨如何使用Jena进行OWL查询,这对于新手来说是一个很好的学习起点。 首先,我们需要了解什么是OWL。OWL是一种基于XML的语言,用于创建本体,即一种形式化的、结构化的知识表示,常...
对 Jena 的简单理解和一个例子 本文将对 Jena 进行简单的介绍,并提供一个使用 Protégé 创建生物本体的实例,来帮助初学者更好地理解 Jena。 一、Jena 介绍 Jena 是 HP Labs 开发的 Java 开发工具包,用于 ...
标题中的“用jena写的一个家庭族谱例子”揭示了这个项目是利用Jena库来构建一个关于家庭关系的图谱。Jena是Apache软件基金会开发的一个开源Java框架,主要用于处理语义网、链接数据以及知识图谱相关任务。在这个项目...
以下是一个简化版的例子,展示如何使用Jena操作本体: 1. **创建模型**:首先需要创建一个Jena Model对象,用于存储RDF数据。 2. **加载本体**:接着,可以通过读取本地或远程的RDF文件来加载本体到Model中。 3. **...
而Jena是一个由Apache软件基金会开发的开源Java框架,专门处理语义网和链接数据,包括对OWL的支持。本篇文章将深入探讨如何使用Jena库解析.OWL文件,以及相关的技术细节。 首先,我们需要了解Jena如何读取和解析....
首先,我们需要创建一个 RDF 模型,使用 `ModelFactory.createDefaultModel()` 方法可以创建一个默认的 RDF 模型。然后,我们可以使用 `model.createResource()` 方法创建资源,并使用 `addProperty()` 方法添加属性...
这个例子展示了如何创建一个RDF模型,添加和删除数据,以及保存和加载模型。这只是Jena强大功能的冰山一角,深入学习后,你可以构建复杂的数据处理和推理应用,参与到语义网和链接数据的浪潮之中。
一个用jena处理protege生成的owl文件的小例子,可以输出本体类,属性等等,可以借鉴学习一下
1. **创建OntModel实例**:`ModelFactory.createOntologyModel()`创建了一个`OntModel`对象,该对象是处理本体的主要入口。 2. **读取OWL文件**:使用`m.read()`方法将OWL文件加载到内存中。这里需要注意的是,...
Jena是一个开源框架,提供了处理RDF(Resource Description Framework)、RDFS(RDF Schema)和OWL的工具,是实现本体推理的重要库。为了运行这个例子,你需要安装Jena库,配置好Java开发环境,然后将提供的Java代码...
Jena是一个由Apache软件基金会维护的Java框架,它用于构建语义网和链接数据应用。而OWL则是一种强大的本体语言,用于描述、表示和共享复杂知识结构。 在这个"jena_test.zip_jena_jena 输出文本_ontology owl_owl_...
springJena 一个用Spring Boot、Jena、SPARQL构建的简单例子 环境 jdk 1.8 Spring Boot 2.0.3 Jena 3.8.0 示例文本 data.ttl 接口示例 http://127.0.0.1:8080/demo/search/name TODO ……
Apache Jena 是一个由 Apache 软件基金会开发并维护的开源框架,专门设计用于构建语义网路和关联数据应用程序。它提供了丰富的工具和库,使得开发人员能够轻松地处理 RDF(Resource Description Framework)、RDFS...
根据提供的文件信息,本文将对RDF...Jena作为一个功能强大的RDF处理库,提供了丰富的API来简化RDF数据的操作。通过学习RDF的基本概念以及如何使用Jena处理这些数据,开发者可以构建出更加智能和灵活的应用程序。