2017-11-16 2 views
0

私はJenaで一度だけオントロジーを読み込む必要があります。 SPARQLクエリが含まれている私の方法は、また、それはすべての行動を毎回除いても方法はオントロジーをリロードするクエリを作品jenaの場合:オントロジーを一度ロードするにはどうしたらいいですか?

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

が含まれています。 私は一度だけロードされるオントロジとメソッドで '見られる' 'モデル'変数を必要とします。 2つのモデルステートメントをメインクラスに移動すると、メソッドは 'モデル'を見ることができません。 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()); 
         } 
       }          
    } 

感謝します。 フィル

+0

そしてコンストラクタでオントロジーをロードすることは、なぜ動作しませんか?クエリを実行するメソッドを表示してください! – AKSW

+0

"Javaにはグローバル変数はありません" - 何? – AKSW

+0

お返事ありがとうございます。返信ASKW。 David Flanniganによると、「Java in a nutshell」には、グローバル変数はありません。 Instread、変数はクラス内で宣言され、そのクラスの一部を形成します。私はMainクラスにコンストラクタを配置しようとしていました。しかし、私はそれを "store"という新しいクラスを宣言し、そのメソッドの中にメソッド "my query"を置くことで解決したと思います。それは単なる学習の楽しみです。ここにコードです: – Phil

答えて

0

私はそれを考え出したと思う。私はメインメソッドのオントロジを一度だけロードすることができます。次に、モデルを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() { } 

}

+0

Javaでオブジェクト指向プログラミングを使わない理由は分かりません。たとえば、 'SPARQLVeriations sv = new SPARQLVeriations();の意味は?オブジェクト変数としてのインスタンスを持っていますか? – AKSW

+0

あなたは間違いなく私の間違いです。 – Phil

関連する問題