• 使用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() + "
     查询失败! 请检查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);
        }
    }
    
    
  • 相关阅读:
    二维图像的DCT变换
    Shell脚本加密--shc/gzexe
    vim python插件--vim python mode
    移动端图片裁剪解决方案
    移动端压缩并ajax上传图片解决方案
    html5拖拽实现
    html5的触摸事件
    js循环添加事件的问题
    h5上传图片
    thinkphp加载第三方类库
  • 原文地址:https://www.cnblogs.com/yes-V-can/p/6838266.html
Copyright © 2020-2023  润新知