Jena 操作 RDF 文件
1. RDF 入门
- RDF(Resource Description Framework)是由W3C规定的,描述资源(resource)的数据模型(data model),;
- RDF 使用Web标识符来标识事物,并通过属性和属性值来描述资源;
- 资源:可拥有URI的任何事物,如:http://localhost:8080/JohnSmith
- 属性:拥有名称的资源,如:人的全名(FullName),职位等;
- 属性值:某个属性的值,如:JohnSmith;
/**
* 使用Jena表示上图
*/
// 定义
static String personURI = "http://localhost:8080/JohnSmith";
static String fullName = "John Smith";
// 创建空的Model, 即图(Graph)
Model model = ModelFactory.createDefaultModel();
// 创建资源
Resource johnSmith = model.createResource(personURI);
// 添加属性
johnSmith.addProperty(VCARD.FN, fullName);
/**
* 或者
*/
Resource johnSmith = model.createResource(personURI)
.addProperty(VCARD.FN, fullName);
/**
* 更加复杂的图形表示(资源表示中存在空节点)
*/
public class Tutorial2{
public static void main(String[] args){
String personURI = "http://localhost:8080/JohnSmith";
String givenName = "John";
String familyName = "Smith";
String fullName = givenName + " " + familyName;
// 创建Model
Model model = ModelFactory.createDefaultModel();
// 创建Resource,并添加属性
Resource johnSmith = model.createResource(personURI)
.addProperty(VCARD.FN, fullName)
.addProperty(VCARD.N,
model.createResource()
.addProperty(VCARD.Given, givenName)
.addProperty(VCARD.Family, familyName));
}
}
2. RDF Statements(RDF 陈述)
- 资源,属性和属性值的组合可形成一个陈述;
- 陈述(Statement)包括:
- subject(主体)
- predicate(谓语)
- object(客体)
/**
* 使用Statement,读取RDF内容(使用上面的代码)
*/
StmtIterator iter = model.listStatements();
while(iter.hasNext()){
// 打印 subject,predicate, object
Statement stmt = iter.nextStatement();
Resource subject = stmt.getSubject();
Property predicate = stmt.getPredicate();
RDFNode object = stmt.getObject();
System.out.print(subject.toString());
System.out.print(" " + predicate.toString() + " ");
if(object instanceof Resource){
// 如果为 资源
System.out.print(object.toString());
} else {
// 如果为文本
System.out.print(" \"" + object.toString() + "\"");
}
System.out.println(" .");
}
// 上述代码,可以简写为: model.write(System.out, "N-TRIPLES");
### 输出结果:
735a32cc-f7a3-4be5-b70f-9689fcd5a4b4 http://www.w3.org/2001/vcard-rdf/3.0#Family "Smith" .
735a32cc-f7a3-4be5-b70f-9689fcd5a4b4 http://www.w3.org/2001/vcard-rdf/3.0#Given "John" .
http://localhost:8080/JohnSmith http://www.w3.org/2001/vcard-rdf/3.0#N 735a32cc-f7a3-4be5-b70f-9689fcd5a4b4 .
http://localhost:8080/JohnSmith http://www.w3.org/2001/vcard-rdf/3.0#FN "John Smith" .
3. RDF 的写和读
/**
* RDF XML 格式输出
*/
public class Tutorial2{
public static void main(String[] args){
String personURI = "http://localhost:8080/JohnSmith";
String givenName = "John";
String familyName = "Smith";
String fullName = givenName + " " + familyName;
// 创建Model
Model model = ModelFactory.createDefaultModel();
// 创建Resource,并添加属性
Resource johnSmith = model.createResource(personURI)
.addProperty(VCARD.FN, fullName)
.addProperty(VCARD.N,
model.createResource()
.addProperty(VCARD.Given, givenName)
.addProperty(VCARD.Family, familyName));
// RDF xml 格式输出
model.write(System.out);
}
}
### 输出结果:
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:vcard="http://www.w3.org/2001/vcard-rdf/3.0#">
<rdf:Description rdf:about="http://localhost:8080/JohnSmith">
<vcard:N rdf:parseType="Resource">
<vcard:Family>Smith</vcard:Family>
<vcard:Given>John</vcard:Given>
</vcard:N>
<vcard:FN>John Smith</vcard:FN>
</rdf:Description>
</rdf:RDF>
/**
* 读取 RDF/XML 格式的文件
* 下载地址:http://jena.apache.org/tutorials/sparql_data/vc-db-1.rdf
*/
// 创建空Model
Model model = ModelFactory.createDefaultModel();
// 使用FileManager,获取输入流
String inputFileName = "";
InputStream in = FileManager.get().open(inputFileName);
if(in == null){
throw new IllegalArgumentException(
"File: " + inputFileName + " not found.");
)
}
// 读取 RDF/XML 文件
model.read(in, null);
// 将读取的内容,输出到控制台
model.write(System.out);
4. 操作Model
/**
* 获取Model中存储的信息(接上例)
*/
// 如果存在,直接返回;不存在,则新创建一个,再返回
String johnSmithURI = "http://somewhere/JohnSmith";
Resource vcard = model.getResource(johnSmithURI);
// 获取资源的属性(该属性可能为资源,或者文本)
// 若为资源:
Resource name = vcard.getProperty(VCARD.N)
.getResource();
// 若为文本:
String fullName = vcard.getProperty(VCARD.FN)
.getString();
// 如果存在多个同名属性:
StmtIterator iter = vcard.listProperties("属性名");
while(iter.hasNext()){
System.out.println(iter.nextStatement()
.getObject()
.toString());
}
/**
* 根据属性(Property)搜索Model(接上例)
*/
// 搜索属性名为:VCARD.FN
ResIterator iter = model.listSubjectsWithProperty(VCARD.FN);
if(iter.hasNext()){
System.out.println("The database contains vcards for:");
while(iter.hasNext()){
System.out.println(" " + iter.nextResource()
.getProperty(VCARD.FN)
.getString());
}
} else {
System.out.println("No vcards were found in the database.");
}
// 精细化搜索:属性名为 VCARD.FN, 且属性值以 “Smith” 结尾
// model.listStatements(Selector s)
// Selector selector = new SimpleSelector(subject, predicate, object);
StmeIterator iter = model.listStatements(
new SimpleSelector(null, VCARD.FN, (RDFNode)null){
public boolean selects(Statement s){
return s.getString().endsWith("Smith");
}
}
);
5. RDF 集合(Container)
BAG
:无序集合;ALT
:无序集合,类似于枚举类型;SEQ
:有序集合;
参考资料:- An introduction to RDF and the Jena RDF API
Jena 操作 RDF 文件的更多相关文章
- virtuoso装载大的rdf文件的方法
本文详细介绍了将一个比较大的rdf文件装载到virtuoso数据库的过程.参考virtuoso网站的文档说明,通过实践,将一个大约4.6G左右的nt文件装载到virtuoso数据库中,用了大概6个多小 ...
- Asp.Net 操作XML文件的增删改查 利用GridView
不废话,直接上如何利用Asp.NET操作XML文件,并对其属性进行修改,刚开始的时候,是打算使用JS来控制生成XML文件的,但是最后却是无法创建文件,读取文件则没有使用了 index.aspx 文件 ...
- php多线程操作同一文件-待续
同意文件操作同意文件的问题在于逻辑有些地方不合适,如果多个线程同时写入,在不加锁的情况下,可能导致得到结果不如意,为了安全,和脏读(数据库的词),应该使用排他锁,这就意味着每次只能被一个线程操作.其他 ...
- Java生成和操作Excel文件(转载)
Java生成和操作Excel文件 JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该A ...
- .NET相关操作其他文件的小程序(系列文章)
平时自诩为使用.NET做开发,但是实际上从一开始学习C#直到现在除了做个几个不登大雅之堂的小网站,做过几个winform程序和几个控制台应用程序,真的没有踏踏实实地用.NET开发过某些属于自己的东西. ...
- Java生成和操作Excel文件
JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过 ...
- 在脚本中操作plist文件
终端输入: /usr/libexec/PlistBuddy -c "Print CFBundleIdentifier" /Users/achen/Desktop/testBundl ...
- java 操作excel 文件
JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容.创建新的Excel文件.更新已经存在的Excel文件.使用该API非Windows操作系统也可以通过 ...
- 用javacsv API 来操作csv文件
javacsv是国外开发的一个比较好的操作csv文件的API,这里简单讲一下用法. 先下载javacsv2.0.zip的文件,解压后,把javacsv.jar 添加到项目中. 本站下载地址: htt ...
随机推荐
- 详解 Tomcat 的连接数与线程池(转)
很不错的文章 https://juejin.im/post/5a0bf917f265da432d27a215
- c语言指针笔记
一.int a[20]1. 数组名代表数组首元素的地址,不代表数组的地址2. 对数组名取地址代表整个数组的地址.a和&a代表的数据类型不一样 a代表数组首元素的地址 &a数组类型 in ...
- centos6.4安装GCC
1. Last login: Mon Aug 4 11:46:15 2014 from 10.3.7.128 [jifeng@jifeng04 ~]$ ls hadoop jdk1.7.0_45 ...
- CDN的那些细枝末节
起源: 原本打算系统看看关于axios的介绍,无意中就看见一句"Using cdn",于是百度一下,"cdn"是什么? 名词解释:CDN CDN的全称是Cont ...
- C++程序中调用其他exe可执行文件方法
在编程过程中有个需求,点击某个按钮需要弹出系统的声音控制面板.在网上查了下代码中调用其他exe程序或者打开其他文件的方法. 自己借鉴网上的文章稍微总结下,加深下印象,也给方便自己用. 在代码中调用其他 ...
- 树莓派3b配置耳机音频输出
耳机输出 amixer cset numid=3 1 然后,播放既可,有杂音. hdmi输出 amixer cset numid=3 2
- WP8.1学习系列(第二章)——Toast通知
Toast 通知概述(Windows 运行时应用) 你的应用要想通过 Toast 通知通信,必须在应用的清单文件中声明它支持 Toast.Toast 通知可包含文本,并且 Windows 上的 Toa ...
- 【cs229-Lecture7】支持向量机(SVM)
SVM不错的学习资料: 百度网盘链接: http://pan.baidu.com/s/1hqw0Rnm 密码: asec blog:http://www.blogjava.net/zhenandaci ...
- echarts - 特殊需求实现代码汇总之【柱图】篇
其实包括饼图.线图在内,和柱图都一样的感觉,他们的配置项基本也是对应的那几个,所以想实现某些相似的效果,只要找到对应的属性就可以了. 1.柱图渐变色设置 还记得上篇线图中的实现是在areaStyle的 ...
- Android 屏幕适配:最全面的解决方案
转自:https://www.jianshu.com/p/ec5a1a30694b 前言 Android的屏幕适配一直以来都在折磨着我们Android开发者,本文将结合: Google的官方权威适配文 ...