jena Ontology API와 sparQL을 사용하여 검색시스템 만들기

     

온톨로지 파일을 읽어서 스파클로 쿼리 만들기 


지난번에는 온톨로지를 불러와 그곳에 객체를 추가했습니다. 
그 코드를 조금만 수정해서 파일에 있는 색인어들을 온톨로지에 마구마구 추가하는 코드를 만든다음, 해당 색인어들은 검색하는 코드를 만들어보았습니다. 

(색인어들은 단어로 구성되어있습니다. 단어들은 순서대로 hasNext와 hasPrev로 연결되어 있습니다.)

순서는 온톨로지 모델을 불러온다음 jena API의 Query를 사용하여 해당 모델에 쿼리를 실행시킵니다.


OntModel m = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM_RULE_INF, null );
Query query = QueryFactory.create(queryString) ;
QueryExecution qexec = QueryExecutionFactory.create(query, m) ;


위처럼 QueryFactory.create(String query) 메소드를 사용해 쿼리를 만든다음 QueryExecution 메소드를 사용하여 쿼리를 실행시킵니다. 쿼리의 결과는 ResultSet 클래스를 사용하여 받아옵니다.

ResultSet results = qexec.execSelect() ;

클래스중에 ResultSetFomatter를 사용하면 별다른 명령어 없이 쿼리 결과를 전부 출력할 수
 있습니다. 현재는 주석처리 되어있습니다. 

//Model resultModel = qexec.execConstruct();


이 방법을 사용했더니 인코딩 문제인지 한글이 안나오는 현상이 있더군요. 그래서 각각의 결과값을 get
메소드로 받아오는 코드로 바꿔보았습니다.

      for ( ; results.hasNext() ; )
        {
          QuerySolution soln = results.nextSolution() ;
          RDFNode x = soln.get("x") ;       // Get a result variable by name.
          RDFNode y = soln.get("y") ;
          RDFNode z = soln.get("z") ;
          //Resource r = soln.getResource("y") ; // Get a result variable - must be a resource
          //Literal l = soln.getLiteral("x") ;   // Get a result variable - must be a literal
          System.out.println("result " +x+ " "+y+" " +z);
        }


이 부분은 지난 포스팅에도 있기때문에 넘어가겠습니다.

다음 코드는 이쁜이라는 단어 다음에 아이패드라는 단어를 가지고 있는 리소스를 검색하는 쿼리를
만들어서 실행하는 코드입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import com.hp.hpl.jena.ontology.OntModel;
import com.hp.hpl.jena.ontology.OntModelSpec;
import com.hp.hpl.jena.query.Query;
import com.hp.hpl.jena.query.QueryExecution;
import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QueryFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.query.ResultSetFormatter;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;
import com.hp.hpl.jena.rdf.model.RDFNode;
 
 
public class Main {
    
    public static void main(String[] args){
        OntModel m = ModelFactory.createOntologyModel( OntModelSpec.OWL_MEM_RULE_INF, null );
 
        String NS = "http://www.semanticweb.org/cho/ontologies/2014/4/untitled-ontology-15#";
     
        m.read( "file:c:/test8.owl" );
        
//        m.write(System.out, "N-TRIPLE");
        
        String queryString = "SELECT *  WHERE { ?x ?y ?z  ." +
                "  ?x   <http://www.semanticweb.org/cho/ontologies/2014/4/untitled-ontology-15#hasNext>  <http://www.semanticweb.org/cho/ontologies/2014/4/untitled-ontology-15#아이패드>  ." +
                "  <http://www.semanticweb.org/cho/ontologies/2014/4/untitled-ontology-15#이쁜>  <http://www.semanticweb.org/cho/ontologies/2014/4/untitled-ontology-15#hasNext>  ?z  }" ;
        
        
       Query query = QueryFactory.create(queryString) ;
        
        
       
       
        QueryExecution qexec = QueryExecutionFactory.create(query, m) ;
        //Model resultModel = qexec.execConstruct();
      //  resultModel.write(System.out,"N-TRIPLE");
      try {
        ResultSet results = qexec.execSelect() ;
        //ResultSetFormatter.out(System.out,results,query);
        
        for ( ; results.hasNext() ; )
        {
          QuerySolution soln = results.nextSolution() ;
          RDFNode x = soln.get("x") ;       // Get a result variable by name.
          RDFNode y = soln.get("y") ;
          RDFNode z = soln.get("z") ;
          //Resource r = soln.getResource("y") ; // Get a result variable - must be a resource
          //Literal l = soln.getLiteral("x") ;   // Get a result variable - must be a literal
          System.out.println("result " +x+ " "+y+" " +z);
        }
      } finally { qexec.close() ; }
    }
}
 




결과는 다음과 같습니다.


http://www.semanticweb.org/cho/ontologies/2014/4/untitled-ontology-15#이쁜 http://www.semanticweb.org/cho/ontologies/2014/4/untitled-ontology-15#hasNext http://www.semanticweb.org/cho/ontologies/2014/4/untitled-ontology-15#아이패드



이렇게 sparQL 쿼리를 사용하여 온톨로지를 검색할 수 있습니다. 하지만 아직 sparQL 쿼리에 익숙
하지 않아서, 필요로하는 결과를 얻기위한 쿼리를 만드는게 생각보다 복잡하군요.

검색어를 입력했을때 검색어를 자연어 처리해서 검색 단어들간의 관계를 sparQL로 바꾸어 색인
온톨로지에서 검색하는 프로그램을 만드려하는데 생각보다 복잡합니다. ㅠ


반응형

댓글

Designed by JB FACTORY