티스토리 뷰

Jena Framework를 사용하다보면

Triple 레벨을 사용할 때가 있고 Statement 레벨을 사용할 때가 있다.

Triple, Node, Graph 등은 SPI 인터페이스들이고

Statement, Resource, Model 등은 API 인터페이스들인데

SPI 레벨보다는 API 레벨이 더 활용도가 많을 것이다.

API 레벨의 클래스들을 SPI 레벨로 변경하는건 쉬울 수 있으나

그 반대는 상대적으로 많이 까다롭다.

 

여기서 Triple 클래스는 SPI레벨이고 Statement 클래스는 API레벨인데

Statement에서 Triple로 변경하려면 asTriple() 만 쓰면 끝난다.

하지만 Triple에서 Statement로 변경하려면??

불가능한것이 아니지만 단 한줄로 끝나는 것이 아니라는 것이다.

 

이번 포스팅에서는 Triple 단위를 Statement로 바꾸어보려고 한다.

정확히는 Iterator<Triple> 을 StmtIterator로 변경하는 것이다.

import java.util.Iterator;
import java.util.function.Function;
import org.apache.jena.graph.Triple;
import org.apache.jena.rdf.model.ModelFactory;
import org.apache.jena.rdf.model.Statement;
import org.apache.jena.rdf.model.StmtIterator;
import org.apache.jena.rdf.model.impl.ModelCom;
import org.apache.jena.rdf.model.impl.StatementImpl;
import org.apache.jena.rdf.model.impl.StmtIteratorImpl;
import org.apache.jena.util.iterator.Map1Iterator;

/**
 * Triple 단위를 Statement 단위로 변경
 * @author JoyHong
 *
 */
public class TSModel   {
   protected Function<Triple, Statement> triple2statement;

   @SuppressWarnings("unchecked")
   public TSModel() {
      final ModelCom empty = (ModelCom) ModelFactory.createDefaultModel();
      this.triple2statement = new Function() {
         @Override
         public Object apply(Object paramFrom) {
            return StatementImpl.toStatement((Triple)paramFrom, empty);
         }
      };
   }

   public StmtIterator asStatements(Iterator it) {
      return new StmtIteratorImpl(new Map1Iterator(this.triple2statement, it));
   }
}

asStatements() 메소드에 input으로 Iterator 형을 넣으면  StmtIterator 가 반환되는 것이다.

 

그럼 실제로 되는지 한번 보자.

테스트를 위하여 임의로 Triple 10개를 생성하였다.

import java.util.HashSet;

import org.apache.jena.graph.Node;
import org.apache.jena.graph.NodeFactory;
import org.apache.jena.graph.Triple;
import org.apache.jena.rdf.model.Statement;
import org.apache.jena.rdf.model.StmtIterator;

public class TripleTest {

   public static void main(String[] args) {
      HashSet set = new HashSet();
      Node s, p, o;
      Triple triple;
      for(int i = 0 ; i<10; i++) {
         s = NodeFactory.createURI("http://test.com/a"+i); 
         p = NodeFactory.createURI("http://test.com/name"); 
         o = NodeFactory.createLiteral("a"+i); 
         triple = Triple.create(s, p, o);
         set.add(triple);
      }

      TSModel mm = new TSModel();

      StmtIterator stit = mm.asStatements(set.iterator());
      while(stit.hasNext()) {
         Statement st = stit.next();
         System.out.println(st.getSubject() + "\t" + st.getPredicate() + "\t" + st.getObject());
      }
   }
}

결과:

이렇게 Triple을 Statement로 변경하여 사용할 수 있다.

'O:::Jena 다루기' 카테고리의 다른 글

O_7. Jena TDB에 트리플 적재하기  (0) 2019.12.16
O_6. Jena TDB에 Select하기  (0) 2019.12.16
O_4. TDB 에 적재된 내용 확인  (0) 2019.12.11
O_3. Jena LARQ Test  (0) 2013.01.23
O_2. Jena TDBLoader Test  (0) 2013.01.18
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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
글 보관함