使用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);
    }
}

posted @ 2017-05-10 21:36  yes_V_can  阅读(1852)  评论(0编辑  收藏  举报