티스토리 뷰
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
TAG
- sparql
- 스프링부트
- TopBraid Composer
- property graph
- rdfox
- 그래프 데이터베이스
- 사이퍼
- 트리플
- django
- Linked Data
- 지식그래프
- Thymeleaf
- RDF 변환
- 지식 그래프
- 장고
- pyvis
- cypher
- Neo4j
- Knowledge Graph
- 트리플 변환
- 타임리프
- LOD
- RDF
- TDB
- networkx
- stardog
- 온톨로지
- TBC
- Ontology
- neosemantics
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함