使用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. hdu 6305 RMQ Similar Sequence——概率方面的思路+笛卡尔树

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=6305 看题解,得知: 0~1内随机取实数,取到两个相同的数的概率是0,所以认为 b 序列是一个排列. 两个 ...

  2. mySQL教程 第1章 数据库设计

    E-R设计 很多同学在学SQL语句时,觉得非常困难,那是因为你在学一个你根本不了解的数据库,数据库中的表不是你设计的,表与表之间的关系你不明白.因此在学SQL语句之前,先介绍一下数据库设计. 下面举例 ...

  3. hosts,No web site is configured at this address.

    解决办法: IIS管理器->右击网站->属性->网站——>IP地址一项->选择全部未分配-> 确定关闭 问题解决.

  4. 跟老齐学Django 项目实战笔记

    创建项目 mysite 创建应用 blog mysit/settings.py配置app INSTALLED_APPS = [ 'django.contrib.admin', 'django.cont ...

  5. protobuf 协议 windows 下 C++ 环境搭建

    1. 下载protobuf https://code.google.com/p/protobuf/downloads/list Protocol Buffers 2.5.0 full source - ...

  6. freemarker 宏嵌套nested 的使用

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

  7. [C#]反射遍历对象属性

    /// <summary> /// C#反射遍历对象属性 /// </summary> /// <typeparam name="T">对象类型 ...

  8. [UE4]射中机器人

  9. nodejs基础: 如何升级Noejs版本

    Node.js的开发非常活跃,它的最新稳定版本也频繁变化,你不时会发现,一个模块不能在你当前的Node版本上使用,此时你需要升级Node 幸运的是,可以用一种非常简单的方法来管理你的Node版本,即使 ...

  10. mysql5.6修改字符编码,ERR:Illegal mix of collations for operation 'concat'

    mysql5.6修改字符编码,ERR:Illegal mix of collations for operation 'concat' 1.问题起因:搭建环境初始化mysql的时候看到mysql配置文 ...