Ontology — 공장 지식 그래프
개요
PlantPulse Ontology는 공장의 엔티티와 그 관계를 그래프로 표현한 공장 지식 그래프(Knowledge Graph) 입니다.
"이 설비에 연결된 센서는?", "이 펌프가 멈추면 어디까지 영향이 가나?" 처럼 관계를 따라가야 답할 수 있는 질문을 AI가 정확히 처리하도록 돕습니다. 계층만 필요할 때는 자산 트리로 충분하지만, 영향 전파나 다중 조건 교차에는 그래프가 필요합니다.
온톨로지는 별도 서비스가 아니라 PlantPulse 플랫폼 server-web 안에서 동작합니다. 그래프는 Apache Jena 기반 인메모리 RDF 모델이며, 플랫폼 DB 를 원천으로 주기적으로 다시 만들어집니다. 별도의 그래프 DB 를 설치하거나 운영할 필요가 없습니다.
구 독립 서비스 plantpulse-ontology(:8888)는 아카이브되었습니다. 그 시절의 도구 이름
(ontology_get_stats, ontology_get_graph 등)은 더 이상 존재하지 않습니다.
노드 종류 (11종)
RDF 그래프에 등장하는 클래스입니다.
| 클래스 | 설명 |
|---|---|
Site | 공장/사이트 |
Area | 구역 (제조동, 유틸리티 등) |
Line | 생산 라인 |
Equipment | 설비 (주입기, 포장기 등) |
Asset | 위 계층 노드의 공통 상위 클래스 — 계층을 가리지 않고 자산 전체를 질의할 때 씁니다 |
Tag | 센서 태그 |
AlarmConfig | 알람 설정 |
CommandDef | 설비 명령 정의 |
Statement | 설비 명세서 |
Document | 설비 첨부 문서 |
RegistryEntry | UNS 레지스트리 항목 |
계층 관계: Site → Area → Line → Equipment → Tag
관계 종류 (3종)
계층과 별개로, 자산 사이에는 방향이 있는 관계가 있습니다. 영향 전파 질문은 이 관계를 따라갑니다.
| 관계 | 의미 |
|---|---|
FEEDS | A 가 B 에 공급한다 (상류 → 하류) |
DEPENDS_ON | A 가 B 에 의존한다 |
PRODUCES | A 가 B 를 생산한다 |
그래프 도구 (통합 MCP)
AI 는 아래 세 도구로 그래프에 접근합니다. 이름이 비슷하지만 돌려주는 축이 다릅니다 — 셋을 구분하는 것이 이 문서의 핵심입니다.
| 도구 | 돌려주는 것 | 언제 쓰나 |
|---|---|---|
get_ontology | 한 사이트의 ISA-95 구조 요약 + 트리 (구역/라인/설비, 설비별 태그 개수) | "이 사이트는 어떻게 구성돼 있나", "설비가 몇 대인가" |
query_ontology | 방향성 관계 그래프 (root + nodes[] + edges[]) | "X 가 멈추면 어디까지 영향인가", "무엇이 X 를 먹이나" |
query_sparql | SPARQL SELECT/ASK 결과 행 | 여러 조건을 교차해야 하는 질의 |
순수한 계층만 필요하면 온톨로지가 아니라 get_asset_tree 가 더 적합합니다.
get_ontology 주요 파라미터
| 파라미터 | 설명 |
|---|---|
site_id | 필수. 이름밖에 모를 때는 search_domains 로 먼저 ID 를 해소합니다 |
asset_id | 부분 트리의 루트. 특정 라인/설비만 볼 때 지정합니다 |
depth | 루트 아래 확장 깊이. 사이트 루트 기준 1=구역, 2=라인, 3=설비 |
include_tags | true 면 설비 노드에 태그 이름 목록을 싣습니다. 기본은 개수(tag_count)만 |
total_tag_count 하나만 믿으세요노드별 tag_count 를 더하면 틀립니다. 펼치지 않은 가지의 태그가 빠지기 때문입니다.
응답에 total_tag_count_unknown=true 가 있으면 셀 수 없었다는 뜻이므로 추정하지 말고
범위를 좁혀 다시 조회하세요.
query_ontology 주요 파라미터
| 파라미터 | 기본값 | 설명 |
|---|---|---|
entity_id | (필수) | 탐색 시작 엔티티 |
direction | DOWN | DOWN=하류 영향, UP=상류 원인, BOTH |
relation_type | (전체) | FEEDS / DEPENDS_ON / PRODUCES |
depth | 2 | 탐색 깊이 1~5 |
영향 전파 탐색 예시
"주입기 DJ_M_01_1 이 멈추면 어디까지 영향인가" — direction=DOWN 으로 하류를 따라갑니다.
[Equipment: DJ_M_01_1] ← 시작 노드
│ FEEDS
┌──────┴──────┐
▼ ▼
[Equipment: [Equipment:
건조기] 컨베이어]
│ FEEDS
▼
[Equipment: 포장기]
응답에는 방문한 노드(nodes[])와 이어진 관계(edges[])가 함께 들어옵니다. 깊이 제한에 걸려 더 못 간 경우 truncated 가 표시되므로, 이 값이 true 면 depth 를 올려 다시 조회하세요.
갱신 방식
그래프는 플랫폼 DB 를 원천으로 주기적으로 다시 만들어집니다. 설비를 추가하거나 태그를 바꾸면 다음 갱신 주기에 반영되므로, 방금 등록한 설비가 그래프에 아직 없을 수 있습니다. 갱신 주기는 플랫폼 설정 semantic.graph.refresh.minutes 로 정합니다.
활용 시나리오
| 시나리오 | 어떻게 |
|---|---|
| 공장 구성 파악 | get_ontology 로 구역/라인/설비 구조와 태그 개수를 한 번에 |
| 이상 원인 추적 | query_ontology direction=UP — 이상 설비의 상류에서 원인 후보 찾기 |
| 정지 영향 범위 산정 | query_ontology direction=DOWN — 멈췄을 때 하류로 번지는 범위 |
| 다중 조건 교차 | query_sparql — "알람이 설정된 태그를 가진 3라인 설비" 같은 복합 조건 |