노원구 COVID-19 온톨로지 — 20분 walkthrough
covid19 예제에서 import한 9개 데이터셋 위에 **엔티티(Entity)와 관계(Relationship)**를 정의하고, 그래프 탐색기 · 엔티티 지도로 시각 탐색까지 이어가는 후속편입니다. 데이터셋·파이프라인까지가 "표 단위로 다루기"였다면, 온톨로지 레이어는 "동·병원·환자를 노드와 간선으로 다루기"입니다.
- covid19 예제를 끝까지 따라해 컬렉션
노원구 COVID-19 분석에 9개 데이터셋이 import된 상태 - D.Hub 계정 (covid19 예제와 동일 사용자)
시나리오와 사용 데이터셋
본 예제는 covid19에서 import된 9개 데이터셋 중 다음 3개를 엔티티의 backing dataset으로 사용합니다.
| 데이터셋 | 엔티티 | Identity Keys | Display Column |
|---|---|---|---|
clinics | Clinic | clinic_id | clinic_name |
patient | Patient | patient_id | patient_id |
region_dong | Region | sido·sigungu·dong (복합키) | dong |
나머지 6개 데이터셋은 본 예제에서 직접 사용하지 않습니다 — hotspot_result는 본문 마지막 다음 단계에서 추가 모델링 아이디어로 안내합니다.
Step 1. 온톨로지 빌더 진입 (1분)
- 좌측 사이드바에서 온톨로지를 클릭합니다.
- 온톨로지 모델링 리스트에서
노원구 COVID-19 분석컬렉션의 모델링 항목을 선택합니다 (없으면 새 모델링 또는 컬렉션 detail 페이지에서 생성). - 온톨로지 빌더(Ontology Builder) 캔버스가 열립니다.
- 캔버스가 빈 상태로 보입니다(엔티티/관계가 아직 0개).
- 좌측에 템플릿(Person, Organization, Product 등) 네비게이션 패널, 상단에 + Entity 버튼, 우측에 인스펙터(현재는 비어 있음)가 보여야 합니다.
Step 2. 엔티티 3개 정의 (5분)
세 종류의 엔티티를 캔버스에 만듭니다. 각 엔티티는 캔버스에서 + Entity 버튼으로 생성한 뒤, 우측 인스펙터에서 속성·Identity Keys·Display Column을 설정합니다.
2-1. Clinic
- 상단의 + Entity 버튼을 클릭합니다.
- 우측 인스펙터에서 다음을 설정합니다.
- 이름:
Clinic - 설명: 안심병원·선별진료소
- 속성(Properties):
clinic_id (STRING),clinic_name (STRING),clinic_type (STRING),latitude (FLOAT),longitude (FLOAT) - Identity Keys:
clinic_id - Display Column:
clinic_name
- 이름:
- 변경 사항이 자동 저장됩니다.
2-2. Patient
- 다시 + Entity 클릭.
- 인스펙터 설정.
- 이름:
Patient - 설명: 환자 위치·감염일
- 속성:
patient_id (STRING),age_group (STRING),sido (STRING),sigungu (STRING),dong (STRING),infection_date (DATE) - Identity Keys:
patient_id - Display Column:
patient_id
- 이름:
2-3. Region
- + Entity 클릭.
- 인스펙터 설정.
- 이름:
Region - 설명: 동별 인구 통계
- 속성:
sido (STRING),sigungu (STRING),dong (STRING),float_population (INTEGER),residents_population (INTEGER) - Identity Keys (복합키):
sido,sigungu,dong— 세 컬럼을 모두 Identity Keys 패널에 추가합니다. - Display Column:
dong
- 이름:
- 캔버스에
Clinic,Patient,Region세 개의 엔티티 노드가 보입니다. - 각 노드를 클릭하면 우측 인스펙터에 속성 목록과 Identity Keys / Display Column 필드가 채워져 있습니다.
Region인스펙터의 Identity Keys 패널에 세 개의 키 컬럼(sido·sigungu·dong)이 순서대로 나열되어 있어야 합니다.
Step 3. 관계 2개 정의 (4분)
엔티티 간 관계는 별도 버튼이 아니라 노드의 연결 핸들을 다른 노드로 드래그해서 만듭니다.
3-1. Patient lives_in Region
Patient노드의 테두리에 마우스를 올려 연결 핸들(작은 점)을 표시합니다.- 핸들에서 시작해 마우스를 드래그해
Region노드 위에서 놓습니다. - Create Relationship 대화상자가 열립니다.
- 관계 이름:
lives_in - 방향: Patient → Region (드래그 방향대로)
- 관계 이름:
- 저장합니다.
3-2. Clinic located_in Region
Clinic노드 핸들 →Region노드로 드래그.- Create Relationship 대화상자.
- 관계 이름:
located_in
- 관계 이름:
- 저장.
- 캔버스에
Patient → lives_in → Region,Clinic → located_in → Region두 개의 화살표가 그려져 있습니다. Region노드에 두 개의 화살표가 모입니다.- 관계 화살표를 클릭하면 인스펙터에 관계 타입과 방향이 표시됩니다.
Step 4. 각 엔티티에 데이터셋 매핑 (5분)
엔티티는 그 자체로는 스키마이며, 실제 인스턴스는 backing dataset의 행에서 가져옵니다. 각 엔티티의 인스펙터 Data Source 탭에서 데이터셋과 컬럼 매핑을 지정합니다.
4-1. Clinic ← clinics 데이터셋
- 캔버스에서
Clinic엔티티를 선택합니다. - 우측 인스펙터의 Data Source 탭을 엽니다.
- 데이터셋 선택: 동일 컬렉션의
clinics를 선택합니다. - 필드 매핑: 동일 이름의 컬럼이 자동 매핑됩니다 (
clinic_id ← clinic_id,clinic_name ← clinic_name,latitude ← latitude,longitude ← longitude등). - Identity Keys 매핑:
clinic_id가 자동 인식되었는지 확인.
4-2. Patient ← patient 데이터셋
Patient엔티티 선택 → Data Source 탭.- 데이터셋:
patient. - 자동 필드 매핑 확인 (
patient_id,age_group,sido,sigungu,dong,infection_date). - Identity Keys 매핑 확인 (
patient_id).
4-3. Region ← region_dong 데이터셋
Region엔티티 선택 → Data Source 탭.- 데이터셋:
region_dong. - 필드 매핑 확인 — Region 속성
float_population이 데이터셋 컬럼float_population에 매핑되었는지 확인. 컬럼명이 다르면 수동 매핑. - Identity Keys 매핑 (복합키):
sido/sigungu/dong세 컬럼이 모두 매핑되어야 합니다. 하나라도 비면 그래프 적재가 실패합니다.
- 세 엔티티 모두 인스펙터 Data Source 탭에 backing dataset 이름이 표시됩니다.
- 매핑 저장 직후부터 백엔드 sink가 자동으로 그래프 데이터베이스(Neo4j)에 데이터를 적재합니다(별도 Build 버튼 없음).
- 적재가 끝나면 다음 Step의 그래프 탐색기에 노드가 보이기 시작합니다 — 데이터 양에 따라 몇 초~수십 초 걸릴 수 있습니다.
Step 5. 그래프 탐색기로 탐색 (3분)
빌더에서 정의한 엔티티/관계가 실제 그래프로 적재되었는지 시각적으로 확인합니다.
-
사이드바에서 온톨로지 → 그래프 탐색기를 엽니다.
-
좌측 메타데이터 패널의 Labels (Nodes) 항목에
Clinic,Patient,Region이 보이고 각 옆에 노드 개수가 표시됩니다. -
Patient라벨을 클릭하면 자동으로MATCH (n:Patient) RETURN n LIMIT 100같은 쿼리가 실행되어 환자 노드들이 시각화 영역에 펼쳐집니다. -
환자 노드 하나를 더블 클릭하면 연결된
Region노드가 추가로 펼쳐집니다(lives_in관계 활용). -
(선택) 하단 쿼리 에디터에 다음 Cypher를 입력하고 Run을 클릭하면 환자-거주지 관계를 한 번에 시각화합니다.
MATCH (p:Patient)-[:lives_in]->(r:Region)
RETURN p, r
LIMIT 50
- 메타데이터 패널의 Labels (Nodes) 카운트가
Clinic 20,Patient 13,Region 9근사값으로 채워져 있어야 합니다. - 카운트가 0이면 Step 4의 Data Source 매핑이 아직 적재되지 않은 상태입니다 — 30초~1분 기다린 뒤 페이지 새로고침.
- Cypher 쿼리 결과의 노드 색상은 라벨별로 자동 지정됩니다.
Step 6. 엔티티 지도로 안심병원 분포 시각화 (2분)
Clinic 엔티티는 latitude/longitude 속성을 가지므로 지도 위에 직접 표시할 수 있습니다.
- 사이드바에서 온톨로지 → 모델링 리스트에서
Clinic엔티티 항목을 선택합니다. - 엔티티 상세에서 지도 탭을 클릭합니다 (URL은
/ontology/entities/<clinic-id>/map형태). - Clinic의
latitude/longitude속성이 자동 인식되어 노원구 영역에 20개의 마커가 표시됩니다. - 마커 하나를 클릭하면
clinic_name,clinic_type,sample_available등 속성이 팝업으로 표시됩니다.
- 지도 위에 노원구 영역의 20개 안심병원·선별진료소 마커가 보입니다.
Patient엔티티에는latitude/longitude속성이 없어 지도에 직접 표시되지 않습니다. 환자 위치를 지도에 보고 싶다면 본문 다음 단계 표의 hotspot_result 활용 아이디어를 참고하세요.
마치며
축하합니다 — covid19 데이터셋 위에 의미 레이어를 얹어 그래프로 한 단계 끌어올렸습니다. 이번 20분의 산출물:
- ✅ 엔티티 3개 (
Clinic,Patient,Region) + Identity Keys / Display Column 설정 - ✅ 관계 2개 (
lives_in,located_in) - ✅ Data Source 매핑 3건 (clinics / patient / region_dong) → 자동 sink로 Neo4j 적재
- ✅ 그래프 탐색기 시각 탐색 + Cypher 쿼리 1건
- ✅ Clinic 분포 지도 시각화
다음 단계
| 더 깊이 가려면 | 가이드 |
|---|---|
hotspot_result로 환자 접촉 관계(자기참조) 모델링 | 관계 (Relationships) |
| Cypher로 직접 그래프 질의 작성 | Cypher 가이드 |
| 스키마를 JSON 또는 CSV로 일괄 정의 | 스키마 편집기 |
| 같은 흐름을 API/cURL로 자동화 | 개발자 가이드 - API 튜토리얼 |
| 컬렉션·온톨로지를 다른 사용자에게 공유 | 공유 및 권한 |
| 데이터셋·파이프라인 단계로 돌아가기 | covid19 예제 |
문제 해결
| 증상 | 점검 |
|---|---|
| Step 2에서 속성 타입이 자동으로 추론되지 않음 | 인스펙터에서 각 속성을 클릭해 타입을 직접 지정 (STRING / INTEGER / FLOAT / BOOLEAN / DATE) |
| Step 3에서 드래그 시 Create Relationship 대화상자가 안 뜸 | 시작 핸들이 정확히 노드 테두리의 점에서 출발했는지 확인. 노드 내부에서 시작하면 노드 이동으로 인식됨 |
| Step 4 Data Source 탭에서 데이터셋 목록이 비어 있음 | 컬렉션 범위가 일치하는지 확인 (동일 컬렉션의 데이터셋만 노출). 노원구 COVID-19 분석 컬렉션을 선택했는지 점검 |
| Step 5 그래프 탐색기 라벨 카운트가 0 | Step 4 Data Source 저장 직후 sink 작업이 진행 중. 30초~1분 기다린 뒤 페이지 새로고침. 그래도 0이면 Identity Keys 매핑 누락 여부 점검 |
| Step 6 지도에 마커가 보이지 않음 | Clinic의 latitude/longitude가 FLOAT으로 매핑되었는지 확인. 문자열로 매핑되면 좌표로 인식되지 않음. 좌표계는 WGS84 가정 |