jena处理RDF数据入门程序小例子

 jena是提供Java语义开发的一个API,由Apache软件基金会下的Apache Jena来进行维护,目前最新版本为jena-3.0.0,官网地址为:http://jena.apache.org/download/index.cgi。
 程序开发环境:myeclipse2013+jena-3.0.0+jdk1.8
 数据集:dbpedia数据的一个子集,dbpedia是从维基百科词条中抽取出来的结构化的数据,由于数据量十分庞大,达到几千万条,我在使用时只选取了50000条作为训练。50000条数据地址:http://yunpan.cn/cHKe2B4VrG9Ur (提取码:9ca1)
 1、基本流程
 (1).创建模型Model
    Model是对Jena RDF模型的扩展,提供了处理RDF数据的功能,通过Model中所定义的方法可以操作模型,比如获取模型信息,操作属性等。Jena通过Model包中的ModelFactory来创建各种类型的模型,如:Model model=ModelFactory.createDefaultModel();
 (2).创建查询对象
    jena通过Query对象来操作查询,创建如下:
    Query query=QueryFactory.create(queryString);
 (3).创建查询执行对象QueryExecution,将查询对象连接到指定模型上,创建如下:
    QueryExecution qe=QueryExecutionFactroy.create(query,model);
 (4).生成结果集,类似与数据库查询,生成结果集,如下:
    ResultSet rs=qe.execSelect();
  (5).处理结果集
  (6).关闭查询
2.利用训练数据集得出关于dbpedia的类型集合,并用测试集判断是否在该类型集合中的源代码如下:

`import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.apache.jena.query.Query;
import org.apache.jena.query.QueryExecution;
import org.apache.jena.query.QueryExecutionFactory;
import org.apache.jena.query.QueryFactory;
import org.apache.jena.query.QuerySolution;
import org.apache.jena.query.ResultSet;
import org.apache.jena.query.ResultSetFormatter;
import org.apache.jena.rdf.model.Model;
import org.apache.jena.rdf.model.ModelFactory;

public class Test {

private static Set typeSet = new HashSet();// 类型集合,用于保存不同类型值
private static Set errorType = new HashSet();// 用来保存不在类型集中的类型

public Set generateType(String path, String queryString) {

    ResultSet rs = queryResult(path, queryString);
    // 输出结果
    // ResultSetFormatter.out(System.out, rs);
    // 将select出的属性值保存到typeSet中去
    String tp = "";
    while (rs.hasNext()) {
        QuerySolution qs = rs.nextSolution();
        tp = qs.get("type").toString();
        typeSet.add(tp);
    }

    return typeSet;
}

public void testError(String path, String queryString) {
    QuerySolution qs = null;
    String typevalue = "";
    int sum = 0;
    ResultSet rs = queryResult(path, queryString);
    while (rs.hasNext()) {
        qs = rs.nextSolution();
        typevalue = qs.get("typevalue").toString();
        if (!typeSet.contains(typevalue)) {
            System.out.println(typevalue);
            errorType.add(typevalue);
            sum++;
        }
    }

    System.out.println("5000条测试集中不在训练集所产生的属性值中的总数目为:" + sum);
    System.out.println("共包含了"+errorType.size()+"属性值:");
    System.out.println("它们分别是:");
     for(String s : errorType){
             System.out.println(s);
             }
}

public ResultSet queryResult(String path, String queryString) {
    // 创建模型
    Model model = ModelFactory.createDefaultModel();
    model.read(path);

    // 创建查询
    Query query = QueryFactory.create(queryString);

    // 创建查询执行对象
    QueryExecution queryExecution = QueryExecutionFactory.create(query,
            model);

    // 执行查询,生成结果
    ResultSet rs = queryExecution.execSelect();
    return rs;
}

public static void main(String args[]) throws MalformedURLException {
    // 训练集和测试集的文件路径
    String trainPath = "trainUnion.nt";
    String testPath = "testUnion.nt";

    // 创建语句
    String trainString = "PREFIX syntax:"
            + "SELECT   ?type (count(?type) as ?typeValueCount)  "
            + "WHERE{ "
            + "     ?resource  syntax:type  ?type ."
            + " }  GROUP BY ?type  ";
    String testString = "PREFIX syntax:"
            + "SELECT   ?instance ?typevalue  "
            + "WHERE{ "
            + "     ?instance  syntax:type  ?typevalue ." + "   }  ";

    // 调用generateType生成属性值集,testError判别错误
    Test myTest = new Test();
    myTest.generateType(trainPath, trainString);
    myTest.testError(testPath, testString);

}

}
`
3.过程中出现的异常总结
(1).出现了Unsupported major.minor version 51.0
因为使用了过低版本的jdk1.6而出现的问题,换成jdk1.8后问题解决;
(2). 出现了java.net.MalformedURLException: no protocol
因为使用了过低版本的jena2.6.0而出现的问题,换成jena3.0.0后解决问题;
4.结论
还是最好使用比较新的版本,免得不支持,一直报错。。

你可能感兴趣的:(语义Web)