使用Jena执行SPARQL的Select和Ask查询
使用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查询的更多相关文章
- 搭建Jena Fuseki并执行SPARQL查询
1. 下载Jena Fuseki:http://jena.apache.org/download/index.cgi 2. 运行服务 windows解压后双击fuseki-server.bat lin ...
- Jena搭建SPARQL查询RDF数据
1 Jena搭建SPARQL查询RDF数据 1.1 Jena概要 · SPARQL是W3C的RDF数据工作组设计的一种查询语言和协议,用于RDF数据的查询.经过类似于JDK安装时候的配置,可以在命令行 ...
- {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析
MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...
- MySQL实战 | 01-当执行一条 select 语句时,MySQL 到底做了啥?
原文链接:当执行一条 select 语句时,MySQL 到底做了啥? 也许,你也跟我一样,在遇到数据库问题时,总时茫然失措,想重启解决问题,又怕导致数据丢失,更怕重启失败,影响业务. 就算重启成功了, ...
- mysql数据库从删库到跑路之select单表查询
一 介绍 本节内容: 查询语法 关键字的执行优先级 简单查询 单条件查询:WHERE 分组查询:GROUP BY HAVING 查询排序:ORDER BY 限制查询的记录数:LIMIT 使用聚合函数查 ...
- select支持多查询,获取分页count
在我们使用mybatis 时,当我们根据分页去查询数据集时,需要传入的参数有page(页码)和size(每页的条数),而我们期望获取到的数据有,小于或等于size的list数据集,同时我们还需要得到一 ...
- SELECT使用子查询
SELECT使用子查询 SELECT使用子查询,该子查询会执行多次, 次数是由记录数量决定.效率比较低,不推荐使用. //查询部门编号,工资大于等于2000的人数, //工资小于2000的人 ...
- Mybatis中@select注解联合查询
前言 在项目中经常会使用到一些简单的联合查询获取对应的数据信息,我们常规都是会根据对应的mapper接口写对应的mapper.xml的来通过对应的业务方法来调用获取,针对这一点本人感觉有点繁琐,就对@ ...
- python使用rdflib创建rdf,在jena fuseki上执行SPARQL查询
建立并启动jena fuseki服务 参考:https://www.cnblogs.com/bincoding/p/11223372.html 使用rdflib创建rdf文件 import rdfli ...
随机推荐
- Oracle 11gR2 RAC 新特性说明
最近接触了一下Oracle 11g R2 的RAC,发现变化很大. 所以在自己动手做实验之前还是先研究下它的新特性比较好. 一. 官网介绍 先看一下Oracle 的官网文档里对RAC 新特性的一 ...
- es 中的 Set 和 Map
Set 函数可以接受一个数组(或者具有 iterable 接口的其他数据结构)作为参数,用来初始化.
- O(n)线性空间的迷宫生成算法
之前所有的迷宫生成算法,空间都是O(mn),时间同样是O(mn),时间上已经不可能更优化, 于是,我就从空间优化上着手,研究一个仅用O(n)空间的生成算法. 我初步的想法是,每次生成一行,生成后立即输 ...
- Jenkins进阶-获取git tags代码(2)
配置Jenkins获取git tag代码的方式其实方法很多,目前我使用比较多的主要是通过Git Parameter 来配置动态的获取最新tags代码,主要我们首先需要安装一下Git Parameter ...
- VBA注释临时
Sub shishi() '按ABCDE为多选题定义答案; 'A.沙利度胺 B.异烟肼 C.利福平 'd.氯法齐明 E.氨苯砜 '46.各型麻风病的首选药物为(D) 'A.沙利度胺 B.异烟肼 C.利 ...
- freemarker 宏嵌套nested 的使用
转载来源:http://blog.sina.com.cn/s/blog_7e5699790100z59g.html 模板页: <#assign basePath = request.contex ...
- Linux设置默认shell脚本效果
效果如图: 实现方法:在当前用户的家目录下新建文件.vimrc [root@nodchen-db01-test ~]# pwd/root [root@nodchen-db01-test ~]# fil ...
- 团队作业(二):ASB
团队作业(二):团队选题 题目四:基于Android的文件加密系统 系统名称:ASB 一.引言 1.1编写目的 (1)学习并熟悉掌握AES/DES加密算法的原理以及算法 (2)学习并熟悉Android ...
- 关于javascript的cookie的封装
/******************cookie*********************/ /* cookie的组成部分: 名称:唯一值,不区分大小写,必须经过URL编码 值:必须经过URL编码 ...
- Unity的JIT和AOT实现
https://myhloli.com/about-il2cpp.html JIT方式: Unity的跨平台技术是通过一个Mono虚拟机实现的.而这个虚拟机更新太慢,不能很好地适应众多的平台. And ...