【问题标题】:In jena: How can i load an ontology once?在耶拿:我怎样才能加载一次本体?
【发布时间】:2017-11-16 08:45:27
【问题描述】:

我只需要在 Jena 中加载一次本体。我的包含 SPARQL 查询的方法也包含

Model model = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM );
model =  FileManager.get().loadModel("c:/jena/ICD.owl");

除了每次进行查询时,该方法都会重新加载本体,这一切都很好。 我需要只加载一次本体,并在方法中“看到”“模型”变量。如果我将两个模型语句移到主类中,则该方法看不到“模型”。 Java 中没有全局变量。

代码如下:

 class store {          
        Model model = ModelFactory.createOntologyModel(     OntModelSpec.OWL_MEM );
         public void myQuery() {
                String pattern = "\\#(.*)$";
                model =  FileManager.get().loadModel("c:/jena/ICD.owl");
                String singleQueryWord1="VEnTRICULAR FIBRILLATION";
                String firstQueryWord2="pedestrian";
                String secondQueryWord2="car";
                String queryPattern1="("+singleQueryWord1+"(.*))";
                String queryPattern2="("+firstQueryWord2+"(.|\\n)*"+secondQueryWord2+")|("+secondQueryWord2+"(.|\\n)*"+firstQueryWord2+")";

                Pattern r = Pattern.compile(pattern);


                String queryString = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\r\n" + 
                        "PREFIX afn:<http://jena.apache.org/ARQ/function#>\r\n"+
                        "PREFIX owl: <http://www.w3.org/2002/07/owl#>\r\n" + 
                        "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\r\n" + 
                        "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\r\n" + 
                        "PREFIX dc: <http://purl.org/dc/elements/1.1/>\r\n" + 
                        "SELECT DISTINCT ?subject ?object\r\n" + 

                        "   WHERE {\r\n"+

                         "?subject dc:title ?object \r\n" +

                        "FILTER regex(?object,\""+ queryPattern1 +"\",\"i\")\r\n" + 
                        //"FILTER regex( ?object,\"( pedestrian (.|\\n)* car )|( car (.|\\n)* pedestrian )\",\"i\")\r\n"+
                        "}"
                         ;

                  Query query = QueryFactory.create(queryString) ;
                  try (QueryExecution qexec = QueryExecutionFactory.create(query, model)) {
                        ResultSet results = qexec.execSelect() ;
                        if(!results.hasNext()) {
                            System.out.println("No results");
                        }else
                        for ( ; results.hasNext() ; )
                        {

                            QuerySolution soln = results.nextSolution();
                            Resource subj = (Resource) soln.get("?subject");

                            String subStr = subj.toString();
                            Matcher m = r.matcher(subStr);

                                if(m.find()) {
                            Literal obj = (Literal) soln.get("?object");
                            System.out.println(m.group()+" ........ "+obj);
                            }

                            m.reset();

                        }  


                  } catch(Exception e) { 
                        System.out.println(e.getMessage());
                         }
                }                                       
    }

非常感谢您的任何建议。 菲尔

【问题讨论】:

  • 在构造函数中加载本体不起作用,为什么?请显示执行查询的方法!
  • "Java 中没有全局变量" -> 什么?
  • 感谢 ASKW 的回复。根据 David Flannigan 的说法,在“简而言之 java”中,没有全局变量。 Instread,变量在类中声明并构成该类的一部分。我试图将构造函数放在 Main 类中。但是,我想我可能已经通过声明一个名为“store”的新类并将方法“my query”放入其中来解决它。这只是一点学习的乐趣。这是代码:
  • 我已将代码放入上面的原始问题中。
  • 你之前是怎么调用这个方法的?我的意思是,在 Java 中你有类和对象,它们都可以有变量。

标签: sparql jena ontology


【解决方案1】:

我想我明白了。我只能在 main 方法中加载本体一次。然后我将模型传递给 myQuery 方法。我应该能够使用 getter 和 setter 访问 myQuery,而不必每次进行查询时都加载本体。

public class SPARQLVeriations {
static private String singleQueryWord1="ventricular fibrillation";
static private String firstQueryWord2;
static private String secondQueryWord2;
static private Model model;
SPARQLVeriations sv = new SPARQLVeriations();

public static void main(String[] args) {

     model = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM );
    model = FileManager.get().loadModel("c:/jena/ICD.owl");


     myQuery(model,singleQueryWord1,firstQueryWord2,secondQueryWord2);   


}

private static void myQuery(Model model,String singleQueryWord1,String firstQueryWord2,String secondQueryWord2) {
    String pattern = "\\#(.*)$";

   // String singleQueryWord1="VEnTRICULAR FIBRILLATION";
    //String firstQueryWord2="pedestrian";
    //String secondQueryWord2="car";
    String queryPattern1="("+singleQueryWord1+"(.*))";
    Pattern r = Pattern.compile(pattern);


    String queryString = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\r\n" + 
            "PREFIX afn:<http://jena.apache.org/ARQ/function#>\r\n"+
            "PREFIX owl: <http://www.w3.org/2002/07/owl#>\r\n" + 
            "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\r\n" + 
            "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\r\n" + 
            "PREFIX dc: <http://purl.org/dc/elements/1.1/>\r\n" + 
            "SELECT DISTINCT ?subject ?object\r\n" + 

            "   WHERE {\r\n"+

             "?subject dc:title ?object \r\n" +

            "FILTER regex(?object,\""+ queryPattern1 +"\",\"i\")\r\n" + 
            //"FILTER regex( ?object,\"( pedestrian (.|\\n)* car )|( car (.|\\n)* pedestrian )\",\"i\")\r\n"+
            "}"
             ;

      Query query = QueryFactory.create(queryString) ;
      try (QueryExecution qexec = QueryExecutionFactory.create(query, model)) {
            ResultSet results = qexec.execSelect() ;
            if(!results.hasNext()) {
                System.out.println("No results");
            }else
            for ( ; results.hasNext() ; )
            {

                QuerySolution soln = results.nextSolution();
                Resource subj = (Resource) soln.get("?subject");

                String subStr = subj.toString();
                Matcher m = r.matcher(subStr);

                    if(m.find()) {
                Literal obj = (Literal) soln.get("?object");
                System.out.println(m.group()+" ........ "+obj);
                }

                m.reset();

            }  


      } catch(Exception e) { 
            System.out.println(e.getMessage());
             }

}
public void setQuery1() { }

}

【讨论】:

  • 我不明白你为什么不使用Java中的面向对象编程......例如,SPARQLVeriations sv = new SPARQLVeriations();在这里是什么意思?有一个自身的实例作为对象变量?!
猜你喜欢
  • 1970-01-01
  • 2014-05-15
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 1970-01-01
  • 2017-08-30
相关资源
最近更新 更多