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 언어

jena-sparql.zip
0.25MB

 

728x90
반응형