使用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. Oracle 11gR2 RAC 新特性说明

    最近接触了一下Oracle 11g R2 的RAC,发现变化很大. 所以在自己动手做实验之前还是先研究下它的新特性比较好. 一.    官网介绍 先看一下Oracle 的官网文档里对RAC 新特性的一 ...

  2. es 中的 Set 和 Map

    Set 函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化.

  3. O(n)线性空间的迷宫生成算法

    之前所有的迷宫生成算法,空间都是O(mn),时间同样是O(mn),时间上已经不可能更优化, 于是,我就从空间优化上着手,研究一个仅用O(n)空间的生成算法. 我初步的想法是,每次生成一行,生成后立即输 ...

  4. Jenkins进阶-获取git tags代码(2)

    配置Jenkins获取git tag代码的方式其实方法很多,目前我使用比较多的主要是通过Git Parameter 来配置动态的获取最新tags代码,主要我们首先需要安装一下Git Parameter ...

  5. VBA注释临时

    Sub shishi() '按ABCDE为多选题定义答案; 'A.沙利度胺 B.异烟肼 C.利福平 'd.氯法齐明 E.氨苯砜 '46.各型麻风病的首选药物为(D) 'A.沙利度胺 B.异烟肼 C.利 ...

  6. freemarker 宏嵌套nested 的使用

    转载来源:http://blog.sina.com.cn/s/blog_7e5699790100z59g.html 模板页: <#assign basePath = request.contex ...

  7. Linux设置默认shell脚本效果

    效果如图: 实现方法:在当前用户的家目录下新建文件.vimrc [root@nodchen-db01-test ~]# pwd/root [root@nodchen-db01-test ~]# fil ...

  8. 团队作业(二):ASB

    团队作业(二):团队选题 题目四:基于Android的文件加密系统 系统名称:ASB 一.引言 1.1编写目的 (1)学习并熟悉掌握AES/DES加密算法的原理以及算法 (2)学习并熟悉Android ...

  9. 关于javascript的cookie的封装

    /******************cookie*********************/ /* cookie的组成部分: 名称:唯一值,不区分大小写,必须经过URL编码 值:必须经过URL编码 ...

  10. Unity的JIT和AOT实现

    https://myhloli.com/about-il2cpp.html JIT方式: Unity的跨平台技术是通过一个Mono虚拟机实现的.而这个虚拟机更新太慢,不能很好地适应众多的平台. And ...