JenaRDB로 Sparql수행하는 예제

funtheory님의 질문에 포스팅합니다.

우선 온톨로지를 JenaDB로 만들었고, 모델을 가져올 수 있다는 가정하에 함 보죠.
물론 Sparql도 안다는 가정.

OntModel model = getOntModel("모델URI"); //모델을 가져옵니다.

//getOntModel메소드 추가합니다.
private Model getOntModel(String urn){
      PersistentOntology po = new PersistentOntology();

      ModelMaker maker = po.getRDBMaker(s_dbURL, s_dbUser, s_dbPw, s_dbType, false);
     
      Model model = maker.getModel(urn);
 
      return model;
  }


가져온 모델을 이용해 Sparql을 돌려보죠.
(온톨로지에는 Person클래스와 nameOfPerson이라는 String타입의 프로퍼티가 있다고 가정할께요.)

private void runSPAQL(OntModel model){
      //Query query1 = QueryFactory.read("test.rq", "ko");
       //이렇게 파일로 만들어도 되요. 메모장에서 utf-8로 저장해야할겁니다. 가물~
     
      Query query1 = QueryFactory.create("PREFIX dc: <http://purl.org/dc/elements/1.1/#>\n" +
              "PREFIX owl: <http://www.w3.org/2002/07/owl#>\n" +
              "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n" +
              "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n" +
              "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\n" +
              "PREFIX : <http://bklab.snu.ac.kr/ontology.owl#>\n" +
              "" +
              "SELECT ?x\n" +
              "WHERE {\n" +
              "    ?x rdf:type :Person.\n" +
              "    #?x :nameOfPerson \"김광섭\".\n" +
                      "}\n" +
                      "\n");
     
     
      QueryExecution qexec = QueryExecutionFactory.create(query1, model) ;
      ResultSet results = qexec.execSelect() ;
     
      try {
          while ( results.hasNext() ){
              QuerySolution soln = results.nextSolution() ;
              System.out.println(soln.toString());
//이 부분에서 필요한데로 뽑아서 사용하면 되겠네요.
          }
          }
      finally { qexec.close() ; }
  }


코드를 보면 QueryFactor에서 Query를 만드네요. 첫번째 주석처리한것 처럼 Sparql파일을 QueryFactory.read해도 되고요. 두번째 쿼리처럼 QueryFactor.create을 사용해  String을 넣어줘도 됩니다.

그런다음, QueryExecution을 하고 반환여부를 확인하고 while문을 수행합니다.

참고.
[1] http://jena.sourceforge.net/ARQ/documentation.html
[2] http://www-128.ibm.com/developerworks/xml/library/j-sparql/

참고 추가 - persistent ontology
[3] http://jena.sourceforge.net/examples/persistent-ont-model/index.html
[4] http://jena.sourceforge.net/DB/creating-db-models.html

댓글

  1. 역시 예상했던 대로 모델을 가져오는 것이 안 되는군요 ㅜ.ㅜ;

    온톨로지를 JenaDB로 만들었다는 것은...

    Jena의 내부에서 지원하는 DB시스템을 이용해 저장을

    했다는 것으로 이해하면 되겠죠?

    물론 Sparql도 알고 있구요. ARQ를 도스 실행창에서는

    사용을 해봤으니, 대략 어떻게 돌아가는 것인지는 알겠는데

    OntModel model = getOntModel("모델URI");

    라고 짧게 표현하신 부분을 어떻게 해야 할지 모르겠네요.

    OntModel은 인터페이스던데 그럼 위처럼 사용을 하기 위해서는

    따로 뭔가를 구현하셨겠군요.



    밥상을 아예 차려달라고 질문하는 것 같아서, 민망스럽지만

    당장 급한 부분이라서요. 이것 말고 따로 구현해야 하는

    부분도 있기때문에 여유가 없네요. 힌트를 좀 주시면 안될까요?

    실력은 없는데 무리를 해서 논문을 쓰자니 버겁네요 ㅜ.ㅜ;

    쿨럭...

    ----------------------------------------------------

    그리고 한 가지 질문이 더 있는데.

    OWL로 온톨로지를 구현할 때, Class와 Class를 프로퍼티로

    연결해서 관계를 설정하잖아요? 이 프로퍼티 값에 Weight를

    줄 수 있는 방법은 없을까요? DataType프로퍼티를 사용하는 것

    말구요. 자체에 Weight를 설정하는 방법이 없을까요?

    이것저것 해보다가 결국 내린 결론이 DataType프로퍼티를 사용하는

    것이거든요. 쩝~~!!



    아무튼 시맨틱 웹을 한다는 이곳저곳에 물어봤는데,

    아무도 답변을 못해주던 것에 대해 답변을 주신 점 감사드립니다.

    시맨틱웹 첨단연구센터에 있는 사람한테도 질문을 했는데,

    모른다고 하더라구요. ㅡ.ㅡ;

    (저도 허접하지만 우리나라 시맨틱 웹이 갈 길이 멀구나라고

    절실히 느껴지는 부분입니다.)

    그럼 이만 사라지겠습니다. ^^;

    답글삭제
  2. @funtheory - 2007/04/23 21:58
    Property에 대한 답변은 저번 질문밑에 달았어요

    http://bklab.snu.ac.kr/blog/kwangsub/18#comment219



    그리고 getOntModel은 DB에서 Connection따오고 RDBMaker를 만들어 모델 가져오는부분을 모아둔거예요.

    제가 본문에 "참고" 추가 해서 넣은 [3], [4]번 함 보세요.

    그럼 DB에서 모델가져오는 부분을 어떻게 하는 알수 있을거예요.



    전 저걸 조금 수정해서 getOntModel메소드를 만든거구요.

    흠... 본문에 추가 할게요.

    답글삭제
  3. 친절한 광섭씨라는 생각이 문득.. ^^

    funtheory님의 프로퍼티에 대한 weight 질문은

    RDF/S 나 OWL 스펙에는 없구요.

    따로 연구분야가 있는걸로 압니다.



    OWL이 논리기반이라 아직은 가중치 모델이 없군요.

    아마도 검색이나 이런 행위를 할때 온톨로지에 있는 클래스와

    속성에 대한 가중치 모델에 대한 질문이 맞는지요?



    텍사노미상에서 가중치에 대한 베이지안 N/W, Spread activation Tech, Cosine Value 등의 알고리증을 이용한 논문을 본거 같군요.

    답글삭제

댓글 쓰기

이 블로그의 인기 게시물

Protopage.com

Android, MediaPlayer IllegalStateException 상황