📍 추적 대상: Building
#B-3021 · 한옥마을 21호 (김씨고가) · 1923년 일반목구조 한식기와
LAYER 0
RAW · CSV 한 행
buildings.csv:2
| 컬럼 | CSV 값 | → 매핑 결정 |
|---|---|---|
| bldg_id | #B-3021 | URI :Building/B-3021 |
| name | 한옥마을 21호 (김씨고가) | rdfs:label |
| type | TraditionalCluster | rdf:type :TraditionalClusterMember (subclass) |
| sub_type | 한옥 | :subType :BldgSubType/한옥 |
| year | 1923 | :builtYear "1923"^^xsd:gYear |
| structure | 일반목구조 | :structure :StructureCode/... (URI 정규화) |
| fire_risk_current | 0.85 | :fireRisk "0.85"^^xsd:decimal |
| cluster_id | CL-01 | :memberOf :Cluster/CL-01 (FK→URI) |
| location_addr | 전남 무안군 몽탄면 한옥마을길 21 | 분해 → 시도/시군구/읍면동/도로명/번호 |
매핑 결정 포인트 ① ·
type=TraditionalCluster를 *literal value*로 둘지 *클래스 멤버십*으로 끌어올릴지 — 후자 선택. :Building의 subclass :TraditionalClusterMember로 표현하면 RULE-002의 type == TraditionalCluster 조건이 OWL subsumption으로 평가 가능.
↓
LAYER 1
ENTITY · RDF Triples
.ttl (Turtle)
@prefix : <http://patos.example/ontology#> . @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> . @prefix xsd: <http://www.w3.org/2001/XMLSchema#> . # --- 클래스 계층 (정적 어휘, OWL/RDFS) --- :TraditionalClusterMember rdfs:subClassOf :Building . :Hanok rdfs:subClassOf :TraditionalClusterMember . # --- 인스턴스: 한 행이 entity가 됨 --- :Building/B-3021 rdf:type :Hanok ; rdfs:label "한옥마을 21호 (김씨고가)" ; :builtYear "1923"^^xsd:gYear ; :structure :StructureCode/일반목구조 ; :roof :RoofCode/한식기와 ; :totalArea "158.4"^^xsd:decimal ; :fireRisk "0.85"^^xsd:decimal ; :status :Status/경보 ; :memberOf :Cluster/CL-01 ; :address [ :sido :Region/전라남도 ; :sigungu :Region/무안군 ; :eupmyundong :Region/몽탄면 ; :roadName "한옥마을길" ; :buildingNo "21" ] ; :ownerRole "보존회 위탁운영" ; :adjacentTo :Building/B-3019 , :Building/B-3022 , :Building/B-3025 , :Building/B-3018 , :Building/B-3027 . # --- subsumption으로 자동 도출 (reasoner 또는 query expansion) --- :Building/B-3021 rdf:type :TraditionalClusterMember . # via :Hanok subclass :Building/B-3021 rdf:type :Building . # via :TraditionalClusterMember subclass
↓
LAYER 2
RULE EVALUATION · 4개 룰 평가
rules.yaml
RULE-001
건물 화재위험 임계 초과
FIRED · T+0ms
when: Building.fireRisk > 0.70
eval: 0.85 > 0.70 → true
action: create :Incident/INC-882 (severity=HIGH)
eval: 0.85 > 0.70 → true
action: create :Incident/INC-882 (severity=HIGH)
RULE-002
전통건축물 자원 매칭
FIRED · T+78ms
when: incident.building.type == TraditionalCluster
eval: :B-3021 a :Hanok ⊑ :TraditionalClusterMember → true (subsumption)
match: 폼차×2 + 전통건축팀×1, exclude 화학소방차
→ 자원:
eval: :B-3021 a :Hanok ⊑ :TraditionalClusterMember → true (subsumption)
match: 폼차×2 + 전통건축팀×1, exclude 화학소방차
→ 자원:
VEH-117, VEH-203, TEAM-T1
RULE-003
인접 건물 선제 경보
FIRED · T+112ms
when: incident.severity == HIGH
collect: :B-3021 :adjacentTo ?b WHERE distance < 100
→ 매칭:
→ 제외: #B-3018(135m), #B-3027(210m)
collect: :B-3021 :adjacentTo ?b WHERE distance < 100
→ 매칭:
#B-3019(42m) #B-3022(68m) #B-3025(93m)→ 제외: #B-3018(135m), #B-3027(210m)
RULE-004
외부 기관 통보
FIRED · T+156ms
when: incident.building.type == TraditionalCluster → true
notify: 무안소방서(
notify: 무안소방서(
AG-01) + 국가유산청(AG-02) + 보존회장(AG-03)
매핑 결정 포인트 ② · 룰 4개 중 RULE-001은 임계비교 (산술), RULE-002는 클래스 멤버십 (OWL subsumption), RULE-003은 그래프 traversal + 거리 필터 (SPARQL/SHACL/외부 룰), RULE-004는 다중 entity 조회 + 통지. 같은 yaml 파일 안에 4가지 *서로 다른 종류의 추론*이 섞여 있음. → 룰 엔진은 이 모든 걸 통일된 인터페이스로 처리. OWL DL reasoner는 RULE-002만 처리 가능.
↓
LAYER 3
TRIGGER + ACTION · 200ms 시퀀스
의미 → 행동
5 Dispatches
VEH-1174min
폼차 · 무안소방서
VEH-2036min
폼차 · 일로119
TEAM-T18min
전통건축팀 · 임시거점
AMB-092min
구급차 · 무안소방서
CMD-015min
지휘차 · 무안소방서
6 Notifications
RULE-003
인접 (3건)
#B-3019, #B-3022, #B-3025
"선제대피 권고" · SMS+APP
RULE-004
외부 기관 (3건)
무안소방서 · 국가유산청 · 보존회장
API + SMS + 이메일
200ms 시퀀스 (시스템 시각)
15:14:23.001 RULE-001 fires → Incident INC-882 created 15:14:23.045 graph traversal → cluster, residents, adjacentTo 15:14:23.078 RULE-002 fires → 자원 매칭: VEH-117, VEH-203, TEAM-T1 15:14:23.112 RULE-003 fires → 인접 3건 통보 15:14:23.156 RULE-004 fires → 외부 기관 3건 통보 15:14:23.201 dispatch 실행 → 5 vehicles + 6 notifications
이 4단 추상화가 ruledata #how의 200ms 트리거 시퀀스와 1:1 대응합니다.
단계별 RDF 변환 상세는
단계별 RDF 변환 상세는
abstraction_steps.md 참조.