使用Jena执行SPARQL的Select和ask查询

提供基本的接口和实现类,可在其他代码中直接调用

Select查询

接口

/**
* The interface Select dao.
* 本体模型数据操作 :Sparql的Select查询
*
* @author houzhiwei
* @date 2016年4月18日 下午5:16:26
*/
public interface SelectDao {
/**
* 执行select查询 同一个resultset只能被使用一次
*
* @param sparqlStr the sparql string
* @param model the model
* @return Json格式结果 string
*/
String execSelectJSON(String sparqlStr, Model model); /**
* 执行select查询
*
* @param sparqlStr the sparql string
* @param model the model
* @return result set
* @author houzhiwei at 2016年4月28日下午9:42:48
*/
ResultSet execSelect(String sparqlStr, Model model); /**
* 执行select查询
*
* @param sparqlStr the sparql string
* @param ds the ds
* @return result set
* @author houzhiwei at 2016年4月28日下午9:42:48
*/
ResultSet execSelect(String sparqlStr, Dataset ds); /**
* 获取查询语句中查询变量(subject等)
*
* @param query the query
* @return string [ ]
* @author houzhiwei at 2016年1月15日上午11:43:51
*/
String[] getQueryVars(Query query); /**
* 内部类。为本接口的实现类提供公共代码
*
* @author houzhiwei
*/
class BaseSelect {
/**
* Exec select json string.
*
* @param sparqlStr the sparql string
* @param model the model
* @return the string
*/
public String execSelectJSON(String sparqlStr, Model model)
{
try {
ResultSet results = execSelect(sparqlStr, model);
ByteArrayOutputStream bout = new ByteArrayOutputStream();
ResultSetFormatter.outputAsJSON(bout, results);//将结果输出为Json格式
return new String(bout.toByteArray(), "UTF-8");// 输出为Json字符串
} catch (Exception e) {
e.printStackTrace();
return e.getLocalizedMessage() + "\n 查询失败! 请检查SPARQL!";
}
} /**
* Exec select result set.
*
* @param sparqlStr the sparql string
* @param model the model
* @return the result set
*/
public ResultSet execSelect(String sparqlStr, Model model)
{
Query query = QueryFactory.create(sparqlStr);
QueryExecution queryExec = QueryExecutionFactory.create(query, model);
ResultSet results = queryExec.execSelect();
return results;
} /**
* Exec select result set.
*
* @param sparqlStr the sparql string
* @param ds the Dataset
* @return the result set
*/
public ResultSet execSelect(String sparqlStr, Dataset ds)
{
Query query = QueryFactory.create(sparqlStr);
QueryExecution queryExec = QueryExecutionFactory.create(query, ds);
ResultSet results = queryExec.execSelect();
return results;
} /**
* Get query vars.
* 获取查询变量,若sparql中使用了 ?subject, 则有变量 subject
*
* @param query the query
* @return the string [ ]
*/
public String[] getQueryVars(Query query)
{
List<Var> vars = query.getProjectVars();
String[] varArr = new String[vars.size()];
for (int i = 0, len = vars.size(); i < len; i++) {
varArr[i] = vars.get(i).getVarName();
}
return varArr;
}
}
}

实现类

/**
* @author Houzw
* @Description: 执行SPARQL的Select查询
*/
@Service
public class SelectDaoImpl implements SelectDao
{
@Override
public String execSelectJSON(String sparqlStr, Model model)
{
return new BaseSelect().execSelectJSON(sparqlStr, model);
} @Override
public ResultSet execSelect(String sparqlStr, Model model)
{
return new BaseSelect().execSelect(sparqlStr, model);
} @Override
public ResultSet execSelect(String sparqlStr, Dataset ds)
{
return new BaseSelect().execSelect(sparqlStr, ds);
} @Override
public String[] getQueryVars(Query query)
{
return new BaseSelect().getQueryVars(query);
}
}

Ask查询

接口

/**
* @author Houzw
* @Description 利用SPARQL的ASK操作查询数据
* @date 2016年4月18日 下午4:57:16
*/
public interface AskDao {
/**
* 执行ASK查询
*
* @param sparqlStr
* @param model
* @return T/F
* @Houzw at 2016年4月18日下午5:03:54
*/
boolean execAsk(String sparqlStr, Model model); /**
* 执行ASK查询
*
* @param sparqlStr
* @param ds
* @return T/F
* @Houzw at 2016年4月18日下午5:03:54
*/
boolean execAsk(String sparqlStr, Dataset ds); /**
* 执行ASK查询
*
* @param sub_uri
* @param prop_uri
* @param obj_uri
* @param model
* @return T/F
* @Houzw at 2016年3月30日下午3:22:02
*/
boolean execAsk(String sub_uri, String prop_uri, String obj_uri, Model model); /**
* 实例是否存在
*
* @param uri
* @param model
* @return T/F
* @Houzw at 2016年4月1日下午10:18:23
*/
boolean isIndividual(String uri, Model model);
}

实现类

@Service
public class AskDaoImpl implements AskDao {
@Override
public boolean execAsk(String sparqlStr, Model model)
{
Query query = QueryFactory.create(sparqlStr);
QueryExecution queryExec = QueryExecutionFactory.create(query, model);
return queryExec.execAsk();
} @Override
public boolean execAsk(String sparqlStr, Dataset ds)
{
Query query = QueryFactory.create(sparqlStr);
QueryExecution queryExec = QueryExecutionFactory.create(query, ds);
return queryExec.execAsk();
} @Override
public boolean execAsk(String sub_uri, String prop_uri, String obj_uri, Model model)
{
StringBuilder s = new StringBuilder("ASK { ");
if (StringUtils.isBlank(sub_uri))
s.append("?s ");
else
s.append("<" + sub_uri + "> ");
if (StringUtils.isBlank(prop_uri))
s.append("?p ");
else
s.append("<" + prop_uri + "> ");
if (StringUtils.isBlank(obj_uri))
s.append("?o");
else
s.append("<" + obj_uri + "> ");
s.append(" }");
Query query = QueryFactory.create(s.toString());
QueryExecution queryExec = QueryExecutionFactory.create(query, model);
return queryExec.execAsk();
} @Override
public boolean isIndividual(String uri, Model model)
{
return execAsk(uri, RDF.type.getURI(), OWL2.NamedIndividual.getURI(), model);
}
}

使用Jena执行SPARQL的Select和Ask查询的更多相关文章

  1. 搭建Jena Fuseki并执行SPARQL查询

    1. 下载Jena Fuseki:http://jena.apache.org/download/index.cgi 2. 运行服务 windows解压后双击fuseki-server.bat lin ...

  2. Jena搭建SPARQL查询RDF数据

    1 Jena搭建SPARQL查询RDF数据 1.1 Jena概要 · SPARQL是W3C的RDF数据工作组设计的一种查询语言和协议,用于RDF数据的查询.经过类似于JDK安装时候的配置,可以在命令行 ...

  3. {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析

    MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...

  4. MySQL实战 | 01-当执行一条 select 语句时,MySQL 到底做了啥?

    原文链接:当执行一条 select 语句时,MySQL 到底做了啥? 也许,你也跟我一样,在遇到数据库问题时,总时茫然失措,想重启解决问题,又怕导致数据丢失,更怕重启失败,影响业务. 就算重启成功了, ...

  5. mysql数据库从删库到跑路之select单表查询

    一 介绍 本节内容: 查询语法 关键字的执行优先级 简单查询 单条件查询:WHERE 分组查询:GROUP BY HAVING 查询排序:ORDER BY 限制查询的记录数:LIMIT 使用聚合函数查 ...

  6. select支持多查询,获取分页count

    在我们使用mybatis 时,当我们根据分页去查询数据集时,需要传入的参数有page(页码)和size(每页的条数),而我们期望获取到的数据有,小于或等于size的list数据集,同时我们还需要得到一 ...

  7. SELECT使用子查询

    SELECT使用子查询   SELECT使用子查询,该子查询会执行多次,  次数是由记录数量决定.效率比较低,不推荐使用.  //查询部门编号,工资大于等于2000的人数,  //工资小于2000的人 ...

  8. Mybatis中@select注解联合查询

    前言 在项目中经常会使用到一些简单的联合查询获取对应的数据信息,我们常规都是会根据对应的mapper接口写对应的mapper.xml的来通过对应的业务方法来调用获取,针对这一点本人感觉有点繁琐,就对@ ...

  9. python使用rdflib创建rdf,在jena fuseki上执行SPARQL查询

    建立并启动jena fuseki服务 参考:https://www.cnblogs.com/bincoding/p/11223372.html 使用rdflib创建rdf文件 import rdfli ...

随机推荐

  1. jsp 中变量作用域:pageScope、requestScope、sessionScope、applicationScope

    jsp 中,变量的作用域,一共有4种: pageScope:表示变量只能在本页面使用. requestScope:表示变量能在本次请求中使用. sessionScope:表示变量能在本次会话中使用. ...

  2. bzoj1072排列

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1072 好像是这方面的裸题. 整除k 要想转移需要记录下 达到模k所有余数 的方案数. 为了生 ...

  3. Angular 4 子路由

    子子路由 现在要为产品组件增加两个子组件 1. 创建productDesc和sellerInfo两个组件 ng g component productDesc ng g component selle ...

  4. 出现“安全时间戳无效,因为其创建时间(“2013-10-30T14:42:07.861Z”)是将来的时间。当前时间为“2013-10-30T14:36:23.988Z”,允许的时钟偏差是“00:05:00””的原因

    具体原因是服务器的时间和本地的时间不能超过5分钟,超过5分钟了.只要修改你本地机器的时间,和服务器相差的时间不能超过5分钟,就可以了. 根本原因是windows 系统域认证要求的,所有都一样.

  5. Django安装与介绍

    安装 Django是以Python为语言环境的,所以要先确保计算机上已经安装了Python. Linux ubuntu: sudo pip install Django==1.11.7 安装中指定了版 ...

  6. Windows(x64)编译FFMPEG-2.0.1

    一.引言 公司需要做网络视频传输的相关项目,初步选定用这么几个东西FFMPEG,ORTP,Live555这么几个东东.研究了也有一个月了,把一些心得写出来,这篇文章主要介绍FFMPEG在windows ...

  7. RFID:ISO14443、15693、18000体系分析

    射频标签的通信标准是标签芯片设计的依据,目前国际上与RFID相关的通信标准主要有:ISO/IEC 18000标准(包括7个部分,涉及125KHz, 13.56MHz, 433MHz, 860-960M ...

  8. serialize unserialize

    转自 http://www.cnblogs.com/yeer/archive/2009/03/25/1421161.html php函数serialize()与unserialize()   seri ...

  9. JsonCpp使用方法详解

    JSON全称为JavaScript ObjectNotation,它是一种轻量级的数据交换格式,易于阅读.编写.解析.jsoncpp是c++解析JSON串常用的解析库之一. jsoncpp中主要的类: ...

  10. 纯文本文件 numbers.txt, 里面的内容(包括方括号)如下所示

    from collections import OrderedDict import xlwt with open('student.txt','r') as f: number_list = jso ...