본문으로 건너뛰기
온톨로지 모델러 코스

엔티티 사이에 관계 만들기

모델링 캔버스에서 두 엔티티를 연결하고, 관계 데이터에 필요한 구조 컬럼을 확인한 뒤 파이프라인으로 적재합니다.

12분

엔티티가 객체를 표현한다면 관계는 객체 사이의 연결을 표현합니다. 이번 레슨에서는 iot_sensor를 소스 엔티티로 추가하고, 기존 iot_machine을 대상 엔티티로 연결해 iot_reads_from 관계를 만듭니다. 이어서 실제 관계 행도 Batch 파이프라인으로 적재합니다.

사전 준비

  • 이전 레슨에서 만들고 데이터를 적재한 iot_machine 엔티티
  • iot_machine의 식별 키 id

관계의 소스와 대상 엔티티에는 식별 키가 반드시 있어야 합니다. 식별 키가 없는 엔티티를 선택하면 다음 엔티티에 식별 키가 없어 관계를 만들 수 없습니다라는 메시지가 표시됩니다.

iot_sensor 엔티티와 행 준비하기

  1. 온톨로지 → 모델링에서 실습 컬렉션의 빌더를 엽니다.
  2. 엔티티 → +를 선택하고 다음 기본 정보를 입력합니다.
항목
이름iot_sensor
별칭IoT 센서
설명id로 식별되는 기계 부착 센서입니다.
  1. 속성에서 다음 스키마를 만듭니다.
속성데이터 타입NULL 허용
idText허용하지 않음
machine_idText허용하지 않음
sensor_typeText허용
  1. Identity Keysid로 지정하고 엔티티 만들기를 선택합니다.
iot_sensor 엔티티의 이름과 별칭을 입력한 세부 정보 화면
두 번째 엔티티는 시스템 이름 iot_sensor와 사용자용 별칭 IoT 센서로 만듭니다.
iot_sensor의 id, machine_id, sensor_type 속성과 식별 키를 설정한 화면
id를 식별 키로 지정하고 관계 데이터와 연결할 machine_id와 sensor_type을 추가합니다.
  1. iot_sensor.csv 내려받기를 클릭해 준비된 파일을 저장합니다.

  2. 저장된 IoT 센서 노드를 선택해 데이터 → 업로드에서 CSV를 추가합니다.

  3. 데이터 탭에서 sensor_001 행을 확인합니다.

온톨로지 빌더에 IoT 센서와 IoT 머신 엔티티가 함께 표시된 화면
관계를 만들기 전에 소스와 대상이 될 두 엔티티가 같은 캔버스에 있는지 확인합니다.

관계 방향 먼저 정하기

관계는 소스 엔티티 → 관계 → 대상 엔티티 순서로 읽습니다. 이번 실습의 의미는 다음과 같습니다.

다이어그램을 불러오는 중입니다. Mermaid 원본:

flowchart LR
    accTitle: 센서와 기계 관계 및 관계 데이터 적재
    accDescr: iot_sensor가 iot_reads_from 관계를 통해 iot_machine을 가리키며 sensor_machine_links 데이터셋이 매핑 Code를 거쳐 관계 행을 만드는 구조입니다.
    sensor[iot_sensor<br/>소스 엔티티] -->|iot_reads_from| machine[iot_machine<br/>대상 엔티티]
    dataset[(sensor_machine_links)] --> mapper[map_sensor_machine_links]
    mapper -. 관계 행 적재 .-> relation{iot_reads_from}
    relation -. 소스 .-> sensor
    relation -. 대상 .-> machine

즉, “센서가 기계에 부착되어 그 기계의 값을 측정한다”입니다. 방향을 반대로 만들면 그래프 쿼리와 이웃 확장 결과도 반대로 해석되므로, 만들기 전에 문장으로 읽어 보세요.

모델링 캔버스에서 관계 만들기

  1. 왼쪽 사이드바에서 온톨로지 → 모델링을 엽니다.
  2. 레슨에서 사용 중인 컬렉션을 선택해 빌더 화면을 엽니다.
  3. iot_sensor 노드 오른쪽의 연결점을 iot_machine 노드까지 끌어 놓습니다.
  4. 관계 만들기 창에서 소스 엔티티iot_sensor, 대상 엔티티iot_machine인지 확인합니다.
  5. 다음 기본 정보를 입력합니다.
화면 항목입력값설명
이름iot_reads_from파이프라인과 쿼리에서 사용하는 시스템 이름
별칭센서가 기계에서 측정캔버스와 인스펙터에 표시되는 이름
설명IoT 센서가 부착되어 측정값을 수집하는 IoT 머신을 연결합니다.방향과 의미를 설명하는 문장
관계 만들기 창에서 iot_sensor 소스와 iot_machine 대상을 확인한 화면
관계 이름을 입력하기 전에 소스가 iot_sensor이고 대상이 iot_machine인지 확인합니다.

이름은 1~63자의 소문자, 숫자, 밑줄만 사용할 수 있으며 소문자로 시작해야 합니다. IOT_READS_FROM처럼 대문자가 포함된 이름은 저장되지 않습니다.

관계 속성 추가하기

관계 자체에 속한 값이 있다면 창 아래쪽 속성에서 추가합니다. 이번 관계에는 다음 속성을 추가합니다.

속성 이름데이터 타입NULL 허용의미
installed_atTimestamp허용센서를 기계에 설치한 시각
관계 속성에 installed_at Timestamp를 추가한 화면
관계 자체의 값인 installed_at만 사용자 속성으로 추가합니다. 식별 키와 표시 컬럼은 관계에서 읽기 전용입니다.

속성을 하나라도 추가하면 시스템이 관계 행을 식별하는 id 컬럼을 함께 관리합니다. id와 소스·대상 엔티티를 참조하는 컬럼은 관계의 구조 컬럼이므로 사용자 속성으로 다시 만들지 마세요.

  1. 관계 만들기를 선택합니다.
IoT 센서에서 IoT 머신으로 향하는 관계가 저장된 모델링 캔버스
저장 후 화살표가 IoT 센서에서 IoT 머신으로 향하고 관계 별칭이 연결선에 표시되는지 확인합니다.

저장 결과 확인하기

캔버스에서 별칭 센서가 기계에서 측정이 표시된 선을 선택합니다. 오른쪽 인스펙터에서 다음 항목을 확인합니다.

  • 탭: 개요, 속성, 데이터, 히스토리
  • 이름, 소스 엔티티, 대상 엔티티: 읽기 전용
  • 소스 엔티티: IoT 센서
  • 대상 엔티티: IoT 머신
  • 속성: installed_at

저장 직후 데이터 탭이 비어 있는 것은 정상입니다. 관계 정의를 만드는 것과 실제 관계 행을 적재하는 것은 별도 작업입니다.

파이프라인 출력 컬럼 이해하기

iot_reads_from의 관계 행에는 다음 컬럼이 필요합니다.

출력 컬럼값 예시출처
idsensor_001__machine_001관계 행의 고유 ID
iot_sensor_idsensor_001소스 엔티티 이름 + 소스 식별 키 id
iot_machine_idmachine_001대상 엔티티 이름 + 대상 식별 키 id
installed_at2026-07-01T09:00:00관계 속성

소스와 대상이 서로 다른 엔티티이면 참조 컬럼 이름은 기본적으로 <엔티티 이름>_<식별 키> 형식입니다. 같은 엔티티를 양쪽에 사용하는 자기 참조 관계는 이름 충돌을 피하기 위해 source_<엔티티 이름>_<식별 키>target_<엔티티 이름>_<식별 키>를 사용합니다.

파이프라인으로 관계 데이터 적재하기

먼저 컬렉션에서 항목 추가 → 데이터셋 → 테이블을 선택해 sensor_machine_links 데이터셋을 만듭니다. 네 컬럼은 모두 Text로 만들고 sensor_machine_links.csv 내려받기를 클릭해 준비된 CSV를 업로드합니다.

관계 원본 데이터셋에 위 네 컬럼이 있으므로 앞의 다이어그램처럼 sensor_machine_linksmap_sensor_machine_linksiot_reads_from 순서로 연결합니다.

  1. 데이터 → 파이프라인에서 같은 컬렉션의 Batch 파이프라인을 만듭니다.
  2. 빠른 추가 → 코드 → Python을 캔버스에 추가하고 이름을 map_sensor_machine_links로 입력합니다.
  3. 다음 코드를 입력합니다.
import polars as pl

def run(sensor_machine_links, *, options=None, contexts=None):
    output = sensor_machine_links.with_columns(
        pl.col("id").cast(pl.Utf8),
        pl.col("iot_sensor_id").cast(pl.Utf8),
        pl.col("iot_machine_id").cast(pl.Utf8),
        pl.col("installed_at").str.to_datetime(strict=False),
    )
    return {"iot_reads_from": output}
  1. sensor_machine_links → map_sensor_machine_links → 센서가 기계에서 측정(온톨로지 → 관계에서 선택) 순서로 연결합니다.
  2. Code 노드의 옵션에서 입력 키 sensor_machine_links, 출력 키 iot_reads_from을 확인하고, 쓰기 방식이 병합인지 확인합니다.
  3. 파이프라인을 load_iot_reads_from으로 저장하고 지금 실행을 선택합니다.
  4. 상단 상태 준비됨과 최근 실행 성공을 확인합니다.

Upsert는 같은 id가 다시 들어오면 기존 관계 행을 갱신합니다. 같은 소스와 대상을 연결하더라도 id가 다르면 별도 관계 행으로 저장되므로, 반복 실행 시 안정적으로 같은 값을 만드는 규칙을 사용하세요.

결과 확인하기

  1. 실행 이력에서 파이프라인 실행이 완료됐는지 확인합니다.
  2. 온톨로지 → 모델링으로 돌아가 iot_reads_from 관계를 선택합니다.
  3. 데이터 탭을 새로 고쳐 관계 행과 네 컬럼을 확인합니다.
  4. 그래프 반영은 백그라운드에서 처리되므로 그래프 탐색기에 선이 바로 보이지 않으면 잠시 뒤 다시 확인합니다.

자가 점검

  • 관계가 iot_sensor → iot_machine 방향으로 만들어졌습니다.
  • 이름을 소문자 iot_reads_from으로 입력했습니다.
  • iot_sensorsensor_001 행이 있습니다.
  • 관계 속성으로 installed_at을 추가했습니다.
  • 파이프라인 출력에 id와 두 엔티티 참조 컬럼이 모두 있습니다.
  • 실행 후 관계의 데이터 탭에서 행을 확인했습니다.

다음 레슨

다음 레슨에서는 그래프 탐색기에서 적재된 엔티티와 관계를 확인하고, 실제 이름을 사용한 Cypher 쿼리를 실행합니다.