O:::Jena 다루기
O_5. Triple 단위를 Statement 단위로 변경하기
joyHong
2019. 12. 13. 00:08
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로 변경하여 사용할 수 있다.