一.Java解析rdf文件
1.下载jena库
- 首先,从这里下载 jena 包 apache-jana-2.7.*.tar.gz(我用的是2.7)。解压。
- 打开 Eclipse,新建一个Java Project。
- 右键点击项目->properties->Java Build Path -> libraries。将解压后 lib 目录下的 jar 文件添加到build path 中。
- OK。现在可以在项目里使用 jena 了。
2.jean中的数据结构
在 Jena 中,资源用 Resource 类来表示,其属性用 Property 类来表示。而整体模型用Model 类来表示。一个 Model 对象可以包含多个资源。每一个资源又包括主语subject、谓语predicate、客体object来表示(下面是一个记录车辆移动数据的rdf文件)。
其中整个rdf文件可以看做是一个model,每个rdf标签可以看做是一个subject,每个rdf标签下的obs:hasxxx可以看做是predictate,每个<obs>xxx</obs>中间的xxx看做是object。整个解析类似xml。
3.使用jean
//获取model
public static Model readRDF(String fileName) {
Model model = ModelFactory.createDefaultModel();
InputStream in = FileManager.get().open(fileName);
if (in == null) {
throw new IllegalArgumentException("File: " + fileName
+ " not found");
}
// 读取RDF/XML 文件
return model.read(in, com.hp.hpl.jena.vocabulary.RDF.getURI(), "RDF/XML-ABBREV");
// model.write(System.out);
}
/**
* 获取经纬度以及发送者ID
* @param model 数据
* @param list 存储结果
*/
public static void getWantedItems(Model model,
Map<String, List<Map<String, String>>> senderMap, HashSet<String> nameSet) {
ResIterator subjects = model.listSubjects();
while (subjects.hasNext()) {
Resource subject = subjects.next();
//Property property = model.createProperty();
//System.out.println(subject.getLocalName());
StmtIterator properties = subject.listProperties();
Map<String, String> item = new HashMap<String, String>();
String sender = null;
while (properties.hasNext()) {
Statement stmt = properties.nextStatement();
Property predicate = stmt.getPredicate();
RDFNode object = stmt.getObject();
String val = null;
String name = predicate.getLocalName().trim();
//System.out.println(name);
val = object.toString().split("\\^\\^")[0];
if (name.equals("hasLongitude")) {
item.put("longitude", val);
} else if (name.equals("hasLatitude")) {
item.put("latitude", val);
} else if (name.equals("hasSender")) {
sender = val.trim();
item.put("sender", val);
nameSet.add(sender);
}
//System.out.println();
}
if (senderMap.get(sender)!=null) {
senderMap.get(sender).add(item);
}else {
System.out.println("新车id:"+sender+"创建list成功");
List<Map<String, String>>