Apache Jena + Spring Boot 온톨로지 SPARQL API [클로드 코드] 정리
2026. 4. 23. 16:58ㆍ업무/데이터과학
728x90
반응형
Apache Jena + Spring Boot 온톨로지 SPARQL API
Apache Jena TDB2를 사용하여 TTL 파일을 온톨로지 저장소에 저장하고,
SPARQL로 질의하는 Spring Boot REST API 프로젝트입니다.
📁 프로젝트 구조
src/main/java/com/example/ontology/
├── OntologyApplication.java # 진입점
├── config/
│ ├── JenaConfig.java # Dataset 빈 설정 (TDB2 / In-Memory)
│ └── GlobalExceptionHandler.java # 전역 예외 처리
├── controller/
│ └── OntologyController.java # REST API 엔드포인트
├── service/
│ └── OntologyService.java # Jena 핵심 로직
└── model/
├── SparqlResult.java # SELECT 결과 DTO
└── OntologyUploadResult.java # 업로드 결과 DTO
src/main/resources/
├── application.properties # 설정
└── ontology/
└── sample.ttl # 초기 샘플 온톨로지
⚙️ 설정 (application.properties)
| 키 | 기본값 | 설명 |
|---|---|---|
jena.tdb.location |
(비어있음) | TDB2 저장 경로. 비우면 인-메모리 사용 |
jena.ontology.init-file |
classpath:ontology/sample.ttl |
시작 시 로드할 TTL 파일 |
jena.ontology.reload-on-startup |
true |
시작마다 TTL 재로드 여부 |
jena.ontology.base-uri |
http://example.org/ontology# |
기본 네임스페이스 URI |
🚀 실행
# 인-메모리 모드 (기본)
mvn spring-boot:run
# TDB2 영구 저장소 사용
mvn spring-boot:run -Dspring-boot.run.jvmArguments="-Djena.tdb.location=./data/tdb2"
📡 API 엔드포인트
온톨로지 관리
TTL 파일 업로드 (multipart)
curl -X POST http://localhost:8080/api/ontology/upload \
-F "file=@myontology.ttl" \
-F "replace=false"
TTL 문자열 직접 저장
curl -X POST http://localhost:8080/api/ontology/load \
-H "Content-Type: text/plain" \
--data-binary @myontology.ttl
현재 모델 Turtle 내보내기
curl http://localhost:8080/api/ontology/export
트리플 수 조회
curl http://localhost:8080/api/ontology/count
모델 초기화
curl -X DELETE http://localhost:8080/api/ontology/clear
SPARQL 질의
SELECT 실행
curl -X POST http://localhost:8080/api/sparql/select \
-H "Content-Type: text/plain" \
-d "PREFIX ex: <http://example.org/ontology#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT ?name ?age WHERE {
?p rdf:type ex:Person ;
ex:name ?name ;
ex:age ?age .
}"
응답 예시:
{
"variables": ["name", "age"],
"bindings": [
{ "name": "홍길동", "age": "30" },
{ "name": "김철수", "age": "25" }
],
"totalCount": 2,
"executedQuery": "..."
}
ASK 실행
curl -X POST http://localhost:8080/api/sparql/ask \
-H "Content-Type: text/plain" \
-d "PREFIX ex: <http://example.org/ontology#>
ASK { ?p a ex:Person }"
INSERT DATA
curl -X POST http://localhost:8080/api/sparql/update \
-H "Content-Type: text/plain" \
-d "PREFIX ex: <http://example.org/ontology#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
INSERT DATA {
ex:newPerson a ex:Person ;
ex:name \"새사람\" ;
ex:age 25 .
}"
빌트인 도메인 질의
| 메서드 | URL | 설명 |
|---|---|---|
| GET | /api/sparql/persons |
모든 Person 조회 |
| GET | /api/sparql/employees |
모든 Employee + 소속 조직 조회 |
| GET | /api/sparql/person/{이름} |
이름으로 Person 검색 |
| GET | /api/sparql/employees/department/{부서} |
부서별 직원 조회 |
curl http://localhost:8080/api/sparql/employees
curl http://localhost:8080/api/sparql/person/홍길동
curl http://localhost:8080/api/sparql/employees/department/Engineering
🔧 핵심 기술
| 기술 | 버전 | 역할 |
|---|---|---|
| Spring Boot | 3.2.4 | 웹 프레임워크 |
| Apache Jena | 5.0.0 | RDF/OWL 처리 엔진 |
| Jena TDB2 | 5.0.0 | 영구 RDF 저장소 |
| Jena ARQ | 5.0.0 | SPARQL 쿼리 엔진 |
| Java | 17 | 언어 |
728x90
반응형
'업무 > 데이터과학' 카테고리의 다른 글
| Time-LLM 정리 (0) | 2026.05.18 |
|---|---|
| 정형 + 비정형 데이터를 활용한 이상 탐지/예측 ML 시스템 아키텍처 설계 [클로드 코드] 정리 (0) | 2026.04.22 |
| LLM as a Judge (0) | 2026.01.16 |
| Self-corrective RAG(control flow) (0) | 2025.12.23 |
| Improving Language Understanding by Generative Pre-Training (0) | 2025.09.12 |