본 장에서는 전처리된 해양 사고 및 기상 데이터를 기반으로, 이질적인 정보를 통합하고 거대 언어 모델 기반의 질의응답 시스템을 지원하기 위한 Neo4j 기반의 지식 그래프 구축 과정을 기술한다. 지식 그래프는 사고, 선박, 장소, 기상 등 성격이 다른 개체들을 노드(Node)와 관계(Relationship)의 네트워크 구조로 모델링함으로써, 단순한 표 형태의 관계형 데이터베이스가 제공하기 어려운 데이터 간의 의미론적 맥락을 보존한다. 이는 단편적인 통계 수치를 넘어, 사고 발생 당시의 복합적인 환경 요인과 인과관계를 입체적으로 추론할 수 있는 기반을 제공한다.
3.1 온톨로지 기반 데이터 모델링
해양 사고를 구성하는 다차원적인 정보를 구조화하고 유연한 의미론적 추론을 지원하기 위해, 본 연구는
Fig. 1과 같은 온톨로지 스키마를 설계하였다. 본 모델은 개별 사고 사례를 식별하는
Accident 노드를 기준으로 선박, 위치, 기상 등의 독립적인 정보가 서로 교차하며 거미줄처럼 연결되는 구조를 갖는다. 데이터의 단순 저장을 넘어 개체 간의 계층적 포함 관계와 범주적 특성을 그래프 구조에 직접 반영하였으며, 상세한 노드 정의 및 속성은
Table 2와 같다.
지식 그래프 내에서 Accident 노드는 id, name, date, type, coordinate, death_count 등의 속성을 포함하며, 흩어져 있는 도메인 정보들을 하나의 사건 맥락으로 묶어주는 연결점 역할을 수행한다. 사고의 시공간적 특성 중 시간 정보는 분석의 용이성을 위해 별도의 범주형 노드로 객체화하였다. 계절과 시간대를 담는 Season 및 TimeRange 노드를 설계하여 각각 HAPPENED_IN_SEASON, HAPPENED_DURING 관계로 사고 노드와 연결하였다. 이는 “겨울철 새벽 시간대에 발생한 사고”와 같이 복합적인 시간 조건으로 데이터를 필터링하거나 군집화하는 데 유용하다.
공간 정보는 행정 구역의 포함 관계를 반영하여 Location(local) → Location(mid) → Location(large)의 3단계 계층 구조로 모델링하였다. 각 단계는 PART_OF 관계로 연결되어, 사용자가 “개항 및 진입수로에서 발생한 사고”를 질의할 경우, 하위 지역인 “부산항”의 사고까지 포괄적으로 추론하여 검색할 수 있는 논리적 기반을 제공한다.
사고에 얽힌 Ship 노드는 INVOLVED_IN 관계를 통해 해당 사고 노드와 연결된다. 선박의 특성을 단순 속성이 아닌 별도의 범주형 노드로 분리하여, TonnageClass 노드와는 BELONGS_TO_CLASS 관계를, ShipType 노드와는 IS_VESSEL_TYPE 관계를 맺도록 설계하였다. 이러한 구조는 "5톤 미만 소형 선박"이나 "어선"과 같은 범주형 질의 시, 개별 선박의 속성을 일일이 탐색하지 않고도 그래프 연결성을 통해 즉각적인 군집 분석이 가능하게 한다.
사고 당시의 환경 정보는 관측 주체와 기록을 명확히 분리하여 모델링하였다. 물리적 관측 시설은 Station 노드로, 특정 시점의 관측 수치는 WeatherRecord 노드로 분리하였다. 사고 노드는 OBSERVED_BY 관계를 통해 인접한 WeatherRecord 노드와 연결되며, 이 기록은 MEASURED_AT 관계를 통해 해당 Station 노드로 귀속된다. 또한, Station 노드는 PROVIDED_BY 관계를 통해 데이터를 생산한 Agency 노드와 연결됨으로써, 추후 데이터 오류 발생 시 원천 출처를 즉시 추적할 수 있는 체계를 구현하였다.
더불어, 연속형 수치로 수집되는 기상 관측 데이터를 직관적으로 추론할 수 있도록 기상청의 공식 해상 특보 발효 기준을 차용하여 범주화 작업을 수행하였다. 풍속과 유의파고 수치를 기반으로 '풍랑경보 수준'과 '풍랑주의보 수준'의 WeatherCondition 노드로 생성하였으며, 시정에 대해서도 세계기상기구의 해상기상서비스 매뉴얼 기준을 적용하여 4단계의 WeatherCondition 노드로 세분화하였다(WMO, 2024). 이를 해당 WeatherRecord 노드와 HAS_CONDITION 관계로 연결함으로써, 복잡한 부등호 연산 없이 그래프의 연결 경로만으로 고차원적인 악천후 사고 탐색을 수행할 수 있다.
마지막으로, 의미론적 검색(Semantic Search)을 지원하기 위해 Content 노드를 설계하였다. Content 노드의 데이터는 사고의 전반적인 정황을 포괄하여야 하며, 이는 의미론적 검색을 수행하기 위한 핵심적인 토대가 된다. 그러나 Accident, WeatherRecord 등의 노드에 저장된 개별 속성값들은 독립적인 정형 데이터로 존재하여, 이를 단순히 나열하는 방식으로는 사고의 유기적인 인과관계를 설명하기 어렵다. 예를 들어 ‘5.0m/s’, ‘충돌’, ‘○○호’와 같은 데이터의 단순 나열은 개별 정보의 사실 여부만을 전달할 뿐, 거대언어모델이 사고의 구체적인 맥락을 파악하는 데에는 한계가 존재한다.
데이터 간의 의미적 공백을 메우기 위해, 본 연구에서는 파편화된 정보를 하나의 자연어 설명문으로 통합하는 텍스트 언어화(Text Verbalization) 과정을 수행하였다. 이 과정은 개별 속성들에 문맥적 연결고리를 부여하여 임베딩 모델이 데이터 간의 유기적 관계를 학습하고, 사고의 정황을 벡터 공간에 온전히 반영할 수 있도록 돕는다. 기상 관측 수치의 위험도에 따라 설명문의 형태가 유동적으로 변화하는 동적 생성 로직을 적용하였으며, 생성된 텍스트는 Content 노드에 저장되어 Accident 노드와 HAS_DESCRIPTION 관계로 연결된다.
[자연어 설명문 동적 생성 규칙 및 예시]
⦁ Template: “{date}경, {location}에서 {tonnage}톤급 {ship_type}인 ‘{ship_name}’에 {type} 사고가 발생했습니다. 당시 기상 관측 정보는 {dynamic_weather_context}”
⦁ Rule: {dynamic_weather_context} 영역은 해양 사고의 핵심 환경 요인인 5가지 기상 지표(풍속, 최대순간풍속, 유의파고, 유속, 시정)의 수치를 기반으로 동적 생성된다. 각 지표가 평이한 수준일 경우 “풍속 6.1m/s, 시정 10km 였습니다.”와 같이 단순 수치로 나열된다. 반면, 특정 지표가 위험 임계치를 초과할 경우, 임베딩 모델의 상황 인식률을 높이기 위해 ”풍속이 25.0m/s로 매우 강하게 불었고,“ 혹은 “유의파고가 5.0m로 매우 높게 일었고,”와 같은 정황 묘사형 서술어로 자동 변환되어 유기적으로 결합된다.
⦁ Example: “2024년 12월 1일 1시 25분경, 남해영해에서 2.41톤급 어선인 ‘○○호’에 기관손상 사고가 발생했습니다. 당시 기상 상황은 풍속이 16.5m/s로 강하게 불었고, 순간최대풍속 19.1m/s, 시정 10.34km 였습니다.”
생성된 자연어 설명문은 OpenAI의 텍스트 임베딩 모델인 text-embedding-3-small을 통해 1,536차원의 실수 벡터로 변환되어 Content 노드의 embedding 속성에 저장된다.
또한, 저장된 벡터 데이터의 효율적인 검색을 위해 Neo4j 데이터베이스 내에 벡터 인덱스(Vector index)를 구축하였다. 벡터 인덱스는 사용자의 질의 벡터(Vq)와 Content 노드의 임베딩 벡터(Vc) 간의 유사도를 계산하여 관련성 높은 정보를 추출한다. 본 연구에서는 유사도 측정 지표로 코사인 유사도(Cosine similarity)를 채택하였으며, 이는 식(2)와 같다.
이러한 임베딩 및 색인 체계는 그래프의 구조적 탐색 기능과 유기적으로 결합되어, 자연어 질의에 대해 가장 적합한 사고 사례를 도출하는 기반이 된다.
3.2 지식 그래프 구축 결과
본 연구는 2020년부터 2024년까지의 해양 사고 데이터를 바탕으로 데이터 간의 연관성을 정의하여 Neo4j 지식 그래프로 구축하였다. 최종 완성된 데이터베이스는 총 90,156개의 노드와 214,633개의 관계로 이루어져 있다. 이 네트워크는 개별 사건을 나타내는 Accident 노드(14,700개)와 사고 선박 정보인 Ship 노드(12,817개), 당시 기상 기록인 WeatherRecord 노드(47,657개), 그리고 사고 정황이 자연어로 담긴 Content 노드가 서로 긴밀하게 교차하며 엮여 있다. 여기에 사고 종류를 나타내는 AccidentType 노드(21개), 선박 종류인 ShipType 노드(7개), 기상 관측소인 Station 노드(188개)와 같이 데이터를 체계적으로 묶어주는 범주형 노드들이 더해져 탐색의 효율성을 높인다.
Neo4j를 이용해 시각화 한 결과는
Fig. 2와 같다. 시각화 결과, 단일 사고 노드에서 파생된 정보가 단편적으로 끝나는 것이 아니라, 공통 속성을 지닌 분류용 노드를 매개로 연쇄적으로 확장되는 다중 계층 구조를 띠고 있다. 그 결과, 서로 다른 독립적인 사고들이라도 '겨울'이나 '침수' 혹은 '풍랑경보 수준'과 같은 공통된 속성 노드를 매개로 엮이면서 거대한 정보의 연결망을 형성하게 된다.
이러한 연쇄적인 다단계 연결 구조 덕분에, 특정 사고에 얽힌 선박 정보, 시공간적 계층 정보, 기상 환경의 복합적인 배경을 단 한 번의 그래프 경로 탐색만으로 통합하여 파악할 수 있다. 결과적으로 본 연구에서 구축한 지식 그래프 구조는, 복잡한 검색 조건을 처리하고 데이터의 숨은 맥락을 파악해야 하는 제안 시스템의 검색 신뢰도와 정확성을 담보하는 견고한 기반이 된다.