ONTOLOGY Pinetree Partners · Data Science Team
ONTOLOGY · INTERACTIVE

온톨로지란 무엇인가
AI 시대, 데이터에 의미를 부여하는 구조

AI/데이터 직군 신입을 위한 인터랙티브 학습 자료입니다. 온톨로지의 정의부터 RDF·LPG 데이터 모델 비교, OWL 추론, GraphRAG까지 실무에서 부딪히는 맥락을 잃지 않도록 단계별로 풀어 정리했습니다.

22 Topics · 6 Chapters · 인터랙티브 시각화 / 비교 탭 / 추론 시뮬레이터
CHAPTER 00 · OVERVIEW

학습의 큰 그림

본 자료의 목표는 직접 코드를 짜는 엔지니어가 아니라, "우리 지식그래프(Knowledge Graph) 스키마를 어떻게 설계하지?"라는 실무 대화에서 맥락을 잃지 않고 의사결정에 기여하는 사람을 길러내는 것입니다.

Topic 01 · 정의

온톨로지란 무엇인가

온톨로지는 데이터의 형식(format)이 아니라, 그 안에 담긴 의미(semantics)를 형식 논리로 다루는 구조입니다.

온톨로지는 한 마디로 "세상을 어떻게 쪼개고, 그것들이 서로 어떻게 연결되는가"를 기계가 이해할 수 있는 형태로 적어둔 약속입니다. 단순한 분류표(taxonomy)가 아니라 클래스·인스턴스·관계·제약·추론 규칙까지 함께 다룬다는 점이 핵심입니다.

🧭 멘탈 모델
검색엔진의 색인은 '단어'를 다루지만, 온톨로지는 '의미'를 다룹니다. 같은 'Apple'이 과일인지 회사인지 구분하는 일은 색인이 아닌 온톨로지의 책임입니다.
한 단계 더 — 왜 'AI 시대'에 다시 주목받는가

LLM이 빠르게 발전하면서 "모델만 좋으면 된다"는 인상이 강해졌지만, 실무에서 부딪히는 문제는 대부분 "데이터의 의미가 불분명해서" 생깁니다. 같은 단어가 부서마다 다르게 쓰이고, 같은 사실이 시스템마다 다르게 저장되어 있을 때, 모델이 아무리 강력해도 "무엇이 옳은가"를 결정할 수 없습니다.

온톨로지는 이 "의미의 표준"을 데이터의 일부로 만드는 도구입니다.

자주 묻는 질문 (FAQ)
온톨로지와 지식그래프는 같은 말인가요?
아닙니다. 온톨로지는 "스키마·규칙"이고 지식그래프는 "그 스키마 위에 채워진 실제 데이터"입니다. 온톨로지 없이도 지식그래프를 만들 수는 있지만, 의미 일관성·추론·정합성 보장이 어려워집니다.
⚠ 실무 함정
온톨로지를 "잘 그린 ERD"로 오해하지 마십시오. ERD가 저장 구조를 정의한다면, 온톨로지는 의미와 추론 규칙을 정의합니다.

학습 체크리스트

  • 온톨로지가 단순 데이터 모델이 아닌 "의미 구조"라는 점을 이해했다
  • LLM 시대에 온톨로지가 다시 주목받는 이유를 한 문장으로 말할 수 있다
  • 이 자료가 무엇을 가르치고 무엇을 가르치지 않는지 인지했다
Topic 02 · 4가지 현장 미리보기

온톨로지가 빛나는 4가지 현장 — 여러분이 합류할 곳

정의는 추상적이지만, 현장은 구체적입니다. 이 자료가 끝날 때 "아, 이건 그래프로 풀어야 하는 문제구나"를 첫 5분 안에 알아채는 사람이 되는 것 — 그것이 이 자료의 목표입니다.

📍 일상에서 매일 쓰는 그래프 — 인스타·넷플릭스·쿠팡·구글이 작동하는 방식과 똑같은 일을 산업 규모·정밀도로 자동화한 영역입니다.

"친구의 친구가 산 것"이나 "같은 X를 산 사람이 함께 본 Y" 같은 질문이 그 자체로 쿼리가 되는 영역입니다. 사용자–상품–속성을 그래프로 묶어 두면, 자연어 질문이 그대로 그래프 탐색이 되고, cold-start 문제를 보완하는 데도 강합니다.

💡 일상 비유로 확인하기 — 클릭해서 하나씩 펼쳐 보세요

📍 의사가 머릿속에서 "이 약 ─ 이 단백질 ─ 이 부작용"을 잇는 일을, 수십만 개 노드 규모로 자동화한 영역입니다.

약물·표적 단백질·대사 경로·질병·부작용을 다단계로 연결한 지식그래프 위에서, 신약 재창출(drug repurposing)과 임상 의사결정 지원이 이루어집니다. 사실상 표준 인프라로 자리 잡았습니다.

💉 실사례 — 위고비(Wegovy)는 노보 노디스크가 만든 비만 치료제로, 2021년 FDA 승인을 받았습니다. 그런데 이 약은 원래 당뇨 치료제로 개발된 약이었습니다.

  1. 당뇨 치료제로 출발했습니다 (2017년). 세마글루타이드(Semaglutide)라는 약물은 GLP-1 수용체를 자극해서 인슐린 분비를 늘리고 혈당을 조절합니다. 처음에는 "오젬픽(Ozempic)"이라는 이름의 당뇨 치료제로 출시되었습니다.
  2. "부작용"이 발견됐습니다. 임상시험 과정에서 환자들의 체중이 평균 10~15% 줄어드는 현상이 관찰되었습니다. 이유는 같은 GLP-1 수용체가 뇌의 식욕 중추위장 운동에도 관여하기 때문입니다. 표적 단백질의 "다른 역할"이 의도치 않게 나타난 것이지요.
  3. 그래프로 체계적으로 검증했습니다. GLP-1 수용체가 어떤 경로들과 연결돼 있는지 사전에 탐색하고, 다른 GLP-1 작용제들에서도 같은 체중 감량 효과가 일관되게 나타나는지 확인했습니다.
  4. 임상 1~3상을 빠르게 통과했습니다. 이미 안전성이 검증된 약이었기 때문에 독성·약동학 시험을 처음부터 다시 할 필요가 없었고, 비만 적응증에 대한 임상만 추가로 진행했습니다.
  5. 2021년에 비만 치료제 위고비(Wegovy)로 출시되었습니다. 같은 약물·다른 적응증·새 브랜드라는 전형적인 신약 재창출 사례입니다.

💡 핵심. "표적 단백질의 다른 역할"을 그래프로 미리 탐색하는 것이 신약 재창출의 본질입니다. 신약 1개를 개발하려면 평균 10년·1조 원이 들지만, 재창출은 이 시간과 비용을 1/3~1/5 수준으로 줄여 줍니다.

🏢 GLP-1 수용체를 중심으로 본 위고비의 그래프 구조
★ 신약 재창출 (Drug Repurposing) — 원래 적응증을 새 적응증으로 확장 활성 췌장 β세포 → 인슐린 분비 ↑ 🎯 당뇨 치료 (원래 적응증) → 오젬픽 (2017) 신약 재창출 (Repurposing) 활성 🧠 뇌 식욕중추 + 위장 운동 ↓ 🎯 비만 치료 (★ 신약 재창출) → 위고비 (2021) 💉 세마글루타이드 (Semaglutide) 위고비 · 오젬픽 자극 (targets) 🧬 GLP-1 수용체 표적 단백질 (두 가지 역할!) ① 의도한 경로: 약물 → GLP-1 → 췌장 → 인슐린 → 혈당 ↓ → 당뇨 치료 (오젬픽 · 원래 효과) ② 부작용 경로: 같은 GLP-1 → 뇌·위장 → 식욕 ↓ → 체중 감량 → 비만 치료 (위고비 · 재창출)

표적 단백질 GLP-1 수용체가 두 가지 회로에 모두 관여하기 때문에 같은 약물이 당뇨와 비만 두 가지를 치료할 수 있습니다.
그래프에서 이 "다른 역할"을 미리 발견할 수 있다면, 신약 1개의 가치가 곱절이 됩니다.

📍 "왜 이렇게 결정했는지 종이 한 장으로 증명해 달라"는 요청을 매일 받는 영역입니다.

"왜 이 결정을 내렸는가"를 노드엣지 단위로 거꾸로 추적해 규제기관에 입증하는 일이 이 영역의 핵심입니다. 출처(Provenance)가 곧 비즈니스 가치인 도메인이고, 청크 ID로는 풀 수 없는 문제입니다.

🏦 실제 시나리오 — 은행의 자동 대출 심사

은행이 AI 시스템으로 고객의 대출 신청을 자동으로 심사한다고 가정해 보겠습니다. AI가 "거절"을 내렸을 때, 고객·금융감독원·내부 감사 모두 이렇게 물어봅니다 — "왜 거절했나요? 다음 달에 다시 신청하면 어떻게 되나요?"

그래프 기반 시스템은 다음 순서로 답합니다:

  1. "거절"이라는 결정에 어떤 근거가 사용됐는지 찾습니다.
    → 세 가지 근거가 나옵니다: ① 신용점수 580점(기준선 미달), ② 최근 1년 연체 3회, ③ 부채비율 75%(한계 초과).
  2. 각 근거가 어디서 왔는지 다시 추적합니다.
    → ① 신용점수는 신용평가사(KCB)의 점수 데이터에서, ② 연체 기록은 카드사·캐피탈의 결제 시스템에서, ③ 부채비율은 은행 내부의 거래·잔액 기록에서 가져온 것입니다.
  3. 1년 후에도 같은 답이 나오는지 검증할 수 있습니다.
    → 모든 노드와 관계에 타임스탬프가 붙어 영구 보존되기 때문에, 같은 시점의 데이터로 재현하면 같은 결정이 나옵니다. 감사관 앞에서 "이 데이터가 그때 정확히 사용된 근거입니다"라고 증명할 수 있습니다.

📌 Vector RAG와의 결정적 차이. Vector RAG는 "관련된 문서 청크"까지만 추적할 수 있습니다. 그 청크가 어떤 추론 체인을 거쳐 거절 결정에 이르렀는지는 사라져 버립니다. 그래프는 추론 체인 자체가 데이터이기 때문에, 결정에서 출발해 근거와 원본까지 한 번의 그래프 탐색으로 도달할 수 있습니다.

🏢 AI 의사결정의 출처 트리 (대출 심사 예시)
🔎 "왜 이 고객의 대출을 거절했나요?" 💼 AI 결정: "대출 거절" 고객 A · 2026-05-13 14:22 근거 1 근거 2 근거 3 📊 신용점수 580점 (기준선 650 미달) 2026년 4월 평가 기준 ⏰ 최근 1년 연체 3회 (허용 한도 2회 초과) 2025-08, 2025-11, 2026-02 💰 부채비율 75% (한계선 60% 초과) DTI 기준 출처 출처 출처 📄 신용평가사 KCB 신용점수 데이터베이스 (매월 1일 자동 갱신) 📄 카드사·캐피탈 결제 연체 이력 (실시간 연동) 📄 은행 내부 시스템 계좌·대출 잔액 기록 (원장 DB) ↑ 모든 노드와 관계가 영구 보존되므로 1년 후에도 같은 답을 재현할 수 있습니다

결정에서 시작해 근거 → 원본 데이터까지 한 번에 추적할 수 있습니다.
"왜?"라는 질문에 정확히 어떤 근거·어떤 데이터·어떤 시점이 사용됐는지 답할 수 있어야 규제와 감사를 통과할 수 있습니다.

📍 5단계 페이퍼컴퍼니 뒤에 숨은 실제 주인을 찾는 일 — 추리소설을 데이터로 푸는 영역입니다.

5~6단계의 페이퍼컴퍼니와 차명계좌를 거치는 자금 흐름을 그래프 한 줄로 따라가서 실소유자(UBO)를 찾는 일이 핵심입니다. RDB의 N번 JOIN으로는 사실상 불가능한 작업입니다.

💰 자금세탁의 전형 패턴 — "자기 돈을 자기 자신에게 보내기"

자금세탁의 핵심 트릭은 의외로 단순합니다. 같은 사람이 사실상 송금자이자 수취자인 경우가 많습니다. 다만 표면적으로는 "Mr. X(한국)" → "ShellCo A(BVI)" → "ShellCo B(파나마)" → ... → "수취자 R(케이맨)"처럼 5~6단계의 페이퍼컴퍼니를 거쳐서, 마치 다른 사람에게 보낸 것처럼 보이게 만듭니다. 마지막 수취자 R도 사실은 Mr. X 본인이거나 그의 가족·차명 회사인 경우가 많습니다.

그래프가 잘 잡는 이유는 이것입니다. 노드(법인·계좌)에 실소유주(UBO) 정보가 속성으로 붙어 있으면, "송금자.UBO = 수취자.UBO"라는 조건 한 줄로 의심 거래를 잡아낼 수 있습니다. 경로 길이가 5단계든 10단계든 상관없습니다.

🏢 Cypher 쿼리 한 줄 vs RDB 6번 JOIN
MATCH path = (sender)-[:TRANSFERS*1..6]->(receiver)
WHERE sender.ubo = receiver.ubo     // ① 송금자와 수취자의 실소유주가 같음 (자기 돈 돌리기)
   OR receiver.risk > 0.9            // ② 또는 수취자 위험점수가 0.9 초과 (제재대상·PEP 등)
RETURN path                       // 1~6단계 자금흐름 경로를 통째로 반환

※ risk 점수란? KYC 단계에서 고객·법인에 자동으로 산정되는 0~1 사이의 위험점수입니다. 0.9 이상이면 ⓐ OFAC·UN 등 제재 대상 명단에 올라 있거나, ⓑ PEP(Politically Exposed Person, 정치적 노출 인물)이거나, ⓒ 고위험 관할(FATF 회색·흑색 명단 국가)에 해당해서, 자동으로 의심거래 후보가 됩니다.

자금은 6개의 페이퍼컴퍼니를 거쳐 우회되지만, 실소유주는 동일한 1명입니다 ★ sender.UBO = receiver.UBO (같은 Mr. X) 송금자 Mr. X 100억원 (출발) UBO: Mr.X ShellCo A 🌴 BVI 99.8억 ShellCo B 🌴 Panama 99.5억 ShellCo C 🌴 Cayman 99.2억 ShellCo D 🇺🇸 Delaware 98.8억 ShellCo E 🇱🇺 Lux. 98.6억 수취자 R (차명회사) 98.5억 도착 UBO: Mr.X (동일!) ⚠ RDB로 같은 질의를 짜면? SELECT … FROM tx t1 JOIN tx t2 ON t1.to=t2.from JOIN tx t3 ON … JOIN tx t6 ON … ← 6번 JOIN WHERE t1.sender_ubo = t6.receiver_ubo AND … ← 단계가 늘수록 SQL 길이와 실행시간이 비선형으로 증가 ✓ 그래프 한 줄 vs RDB 수백 줄 — 그래프 DB가 AML에서 사실상 표준이 된 이유입니다.

표면적으로는 6단계의 우회처럼 보여도, 송금자와 수취자의 실소유주(UBO)가 같은 Mr. X라는 사실이 노드 속성으로 보존돼 있으면 한 줄 쿼리로 즉시 잡힙니다.

🎯 여러분의 미션
이 4가지 중 어느 한 곳에 여러분이 들어가게 됩니다. 지금은 "이런 일이 있구나"만 잡아도 충분합니다. 다음 슬라이드부터는 왜 LLM·RAG만으로는 안 되는지, 그리고 그래프가 어떻게 그 빈자리를 메우는지를 차근차근 풀어 가겠습니다. Chapter 6에서 다시 만나면 "아, 그때 그 시나리오"가 되어 있어야 합니다.
한 단계 더 — 어떤 도메인이 그래프와 잘 맞는가 (체크리스트)

아래 항목 중 두 개 이상에 해당한다면 그래프·온톨로지의 ROI가 큽니다.

  • "X의 Y의 Z" 같은 다중 홉 관계 질문이 의사결정에 자주 나옵니다.
  • 같은 용어를 부서마다 다르게 써서 의미 정렬 비용이 큽니다.
  • 답의 출처를 노드·엣지 단위로 입증해야 하는 규제·감사 환경입니다.
  • 엔티티가 명확(사람·회사·약물·계좌 등)하고 관계 자체가 분석 대상입니다.
⚠ 한 가지 솔직한 이야기 — 은총알이 아닙니다
그래프·온톨로지·GraphRAG는 모든 문제의 정답이 아닙니다. 비정형 텍스트 검색(논문·매뉴얼·FAQ)은 여전히 Vector RAG가 비용 효율 면에서 우위입니다. 이 강의의 진짜 목표는 "엔티티가 명확하고 관계가 핵심인 문제"를 식별해 그래프로 푸는 안목을 기르는 것입니다.
Topic 03 · 학습 흐름

6개 챕터로 보는 학습의 큰 그림

전반부 1~3장에서는 "왜 온톨로지인가, 무엇인가"를 다루고, 후반부 4~6장에서는 "이것으로 무엇을 어떻게 할 것인가"를 풀어갑니다.

1

왜 온톨로지인가

LLM·RAG의 한계와 GraphRAG의 부상

2

온톨로지 기초

정의·구성요소·RDF 트리플·Taxonomy 비교

3

데이터 모델 비교

RDB / RDF / LPG / SPARQL·Cypher

4

추론과 표현력

OWL · HermiT · 가변 길이 경로

5

EKG × GraphRAG

엔터프라이즈 지식그래프와 LLM 연결

6

실무 적용·로드맵

활용 시나리오·도구 스택·다음 단계

KEY POINT 코드는 Cypher·SPARQL·Turtle을 한두 줄씩만 다루고, 실행보다 "이렇게 생겼구나"라는 감각을 잡는 데 집중합니다. 그 다음은 자가학습 로드맵(Chapter 6)으로 손에 익히는 단계입니다.
CHAPTER 01 · 도입

왜 지금, 다시 온톨로지인가

LLM이 똑똑해질수록 환각·출처 부재·의미 불일치 문제는 오히려 커지며, 이를 받쳐줄 "사실의 뼈대"로서 온톨로지가 다시 엔터프라이즈 AI의 핵심 인프라로 떠오르고 있습니다.

Topic 04 · 문제정의

LLM의 세 가지 벽 vs 온톨로지의 세 가지 답

기업 환경에서 LLM을 그대로 쓸 때 어떤 한계에 부딪히는지, 그리고 온톨로지 기반 지식그래프가 그 빈자리를 어떻게 메우는지 살펴봅니다.

🚧 LLM의 한계

환각 (Hallucination)

그럴듯한 답을 자신있게 내놓지만 사실이 아닐 수 있습니다. 학습한 텍스트의 확률적 패턴으로 답하기 때문에, 같은 질문도 프롬프트가 조금 달라지면 답이 흔들립니다.

→ "이 답의 근거는 무엇인가요?"에 정확히 답하기 어렵습니다.

추론 깊이의 한계

"A 회사 → 자회사 → 손자회사 → 거래 상대"처럼 관계를 여러 단계 타고 들어가는 질문에서 일관성이 무너집니다. 단계가 깊어질수록 문맥적으로 추정할 뿐, 단계마다 정확히 따라가지 못합니다.

다중 홉 관계가 핵심인 AML·지분 추적·공급망 영역에서 치명적.

도메인 컨텍스트 부재

사내 용어·내부 규정·예외 처리는 모델이 학습한 적이 없습니다. 답을 바꾸려면 매번 프롬프트를 새로 짜거나 재학습이 필요합니다.

→ 우리 회사의 "사실"은 모델 바깥에 있다는 뜻입니다.

🧭 지식그래프가 메우는 방식

출처 추적 (Provenance)

답이 어떤 데이터에서, 어떤 관계를 거쳐 도출됐는지 노드·엣지 단위로 기록됩니다. 감사관 앞에서 "이 근거 체인(traceability)으로 이 결정을 내렸다"고 그대로 보여줄 수 있습니다.

→ 환각 카드의 "근거가 안 보임" 문제에 정면으로 답합니다.

다중 홉 추론을 쿼리로

5단계·10단계의 관계 추적도 가변 길이 경로 쿼리 한 줄로 그래프를 따라가며 직접 계산합니다. 같은 데이터·같은 규칙이면 언제 물어도 같은 답이 나옵니다.

→ 깊이가 늘어도 일관성이 유지됩니다.

도메인 의미 명시화

사내 용어·규칙·제약을 명확한 구조로 적어두면, 모델 교체나 프롬프트 변화와 무관하게 답이 흔들리지 않습니다. 새 규칙이 생기면 그래프에 관계를 추가하는 방식으로 점진 확장합니다.

→ 매번 재학습할 필요 없이, 사실 한 줄을 더하면 끝.

🔗 3가지 한계 ↔ 3가지 답 — 1:1로 짝이 맞습니다
🚧 LLM의 한계 🧭 지식그래프의 답 한계 1 환각 (Hallucination) 답 1 출처 추적 (Provenance) 해결 한계 2 추론 깊이의 한계 답 2 다중 홉 추론을 쿼리로 해결 한계 3 도메인 컨텍스트 부재 답 3 도메인 의미 명시화 해결 한계마다 정확히 짝지어진 답이 있습니다 — 상세 설명은 위 카드, 운영 비교는 아래 표 참고
🧠 멘탈 모델
LLM은 "잘 외운 학생"에 가깝습니다. 외운 게 충분하면 정답을 맞히지만, 모르는 영역에선 작화합니다. 온톨로지는 그 학생에게 "검증 가능한 사실 시트"를 쥐여주는 일입니다.
한 눈에 비교 — LLM 중심 접근 vs 온톨로지 기반 지식그래프 접근

두 접근의 성격을 8가지 관점에서 나란히 놓고 보면, "무엇에 강하고 어디서 흔들리는지"가 한 표에 들어옵니다.

구분🤖 LLM 중심 접근🧭 온톨로지 기반 지식그래프 접근
핵심 역할언어 생성·요약·추론의미 구조화·관계 모델링·정합성 관리
강점자연어 이해·문서 요약·대화정확한 관계 추적·규칙 기반 추론
지식 표현확률적 패턴명시적 의미 구조
일관성프롬프트에 따라 흔들릴 수 있음동일 규칙이면 동일 결과
환각(Hallucination)존재 가능구조·제약 기반으로 낮음
변경 대응재학습·프롬프트 수정 필요관계·규칙 추가로 점진 확장
규제·감사 대응근거 추적 어려움근거 체인(traceability) 제공 가능
복잡한 영향 분석문맥적으로 추정그래프 탐색으로 직접 계산 가능

결국 둘은 경쟁 관계가 아니라 서로 다른 일을 잘하는 도구입니다. LLM은 사람의 말을 알아듣고 자연스럽게 답하는 데 강하고, 지식그래프는 "이 사실이 맞다·아니다"를 구조로 보장하는 데 강합니다. 이 둘을 묶어 쓰는 방식이 GraphRAG이며, 다음 토픽에서 자세히 다룹니다.

자주 묻는 질문 (FAQ)
그냥 LLM을 더 좋은 걸로 바꾸면 되지 않나요?
모델 성능이 올라가도 "우리 회사의 사실"은 모델 안에 없습니다. 미세조정(fine-tune)은 비용이 크고 갱신이 어렵습니다. 지식그래프는 "사실의 외부 메모리"로서 모델 교체와 무관하게 유지됩니다.
환각이 모델 크기를 키우면 줄어들지 않나요?
어느 정도는 줄지만 사라지지 않습니다. 학습 데이터에 없거나 모순된 영역에서 환각은 모델 크기와 무관하게 발생합니다. 외부 사실 메모리가 항상 필요합니다.
⚠ 실무 함정
온톨로지를 만능 해결책으로 포장하면 PoC 단계에서 깨집니다. 지식그래프는 관계가 핵심인 도메인에서 ROI가 가장 큽니다. 단순 FAQ 챗봇에는 과한 도구입니다.
Topic 05 · Vector RAG vs GraphRAG

벡터 RAG만으로는 부족하다

벡터 검색은 임베딩 공간의 유사도(similarity)를 기준으로 답을 찾지만, 그것이 곧 도메인의 의미(semantics)와 일치한다는 보장은 없습니다.

방식. 사용자의 질문을 임베딩하고, 벡터 DB에서 가까운 문서 청크(top-k)를 찾아 LLM에 컨텍스트로 넘긴다.

약점 4가지

  • 관계가 희미해진다 — 청크 단위로 잘리면서 엔티티 간 연결이 끊어진다.
  • 근거 추적이 어렵다 — "청크 17번"이 출처인데 무슨 사실의 어디인지 불명확.
  • 의미 충돌 — 동음이의어, 부분일치에 약하다.
  • 정합성 보장 X — 모순된 청크가 함께 검색된다.

방식. 질문 속 엔티티를 지식그래프의 노드에 매핑하고, k-홉 이내의 관계 경로를 따라가 컨텍스트를 구성한 뒤 LLM에 넘긴다.

강점 4가지

  • 관계 그대로 — 다중 홉 추론을 쿼리로 표현한다.
  • 출처 명시 — 노드·엣지 단위 근거를 답변에 첨부.
  • 스키마 기반 — 도메인 규칙·제약을 강제.
  • 정합성 — OWL 추론으로 모순 검출 가능.

4가지 차원에서 두 방식이 어떻게 다른지 — 버튼을 눌러 비교해보세요.

Q. 데이터를 어떤 조각으로 잘라서 다루는가?
📄 Vector RAG
chunk 1 chunk 2 chunk 3 chunk 4
문서 청크 (Chunks)

긴 문서를 길이 기준으로 자른 텍스트 조각. 의미 단위가 아닌 글자 수 단위로 분할됩니다.

VS
🔗 GraphRAG
근무 동료 관리 멘토 Tom 회사 동료 멘토 팀장
노드 + 엣지 (Nodes & Edges)

엔티티(사람·회사·제품)는 노드로, 관계는 엣지로 명시. 의미 단위로 구조화됩니다.

핵심 차이. 청크는 자르는 순간 엔티티 간 연결이 끊깁니다. 그래프는 관계를 핵심 데이터 단위로 보존합니다 — 그래서 "Tom의 회사의 팀장이 누구냐?" 같은 질문에 강합니다.
Q. 관련성을 무엇으로 판단하는가?
📄 Vector RAG
chunk 3 chunk 5 chunk 12 query
코사인 유사도

질문과 청크를 벡터로 변환 → 거리가 가까운 top-k를 가져옵니다. "비슷해 보이는 것"을 찾는 검색.

VS
🔗 GraphRAG
PURCHASED FRIEND User tom Product coffee Friend mia
그래프 패턴 매칭

User-[:PURCHASED]->Product 같은 명시적 관계 패턴을 찾습니다. "정확히 그 관계인 것"을 찾는 검색.

핵심 차이. 유사도"비슷해 보이는 것", 패턴 매칭"정확히 그 관계인 것"을 찾습니다. 동음이의어("Apple"이 과일/회사)는 유사도가 약하고 패턴 매칭이 강합니다.
Q. 3단계 떨어진 관계를 추적할 수 있는가?
📄 Vector RAG
A B C D ? ? ? 홉이 깊어질수록 신호 약해짐
약함 — 홉이 깊어질수록 끊김

청크 단위로 잘려 있어 "A의 자회사의 자회사" 같은 다단계 질문엔 답하기 어렵습니다.

VS
🔗 GraphRAG
1홉 2홉 3홉 A B C D (a)-[:REL*1..3]->(d)
강함 — 가변 길이 경로 한 줄

*1..3 표기로 1~3홉의 모든 경로를 한 번에 탐색합니다.

핵심 차이. 자금세탁(5~6홉)·소유 구조 추적(3~4홉)·약물 경로 분석다중 홉이 도메인 가치의 핵심인 영역에서 그래프는 RDB·Vector RAG가 못 푸는 문제를 한 줄로 풉니다.
Q. 답변의 출처를 어디까지 추적할 수 있는가?
📄 Vector RAG
출처 chunk #017 document_v3.pdf ? 청크 안 어느 사실인지 다시 읽어야 함
청크 ID

"문서 X의 청크 17번"이 출처입니다. 그 청크 안 어느 문장이 근거인지는 다시 읽어야 압니다.

VS
🔗 GraphRAG
PURCHASED 2024-01-15 14:32 $25.00 User #123 Product #456 정확한 사실 + 시점 + 메타데이터
노드/엣지 ID + 메타데이터

"User#123이 2024-01-15에 Product#456을 구매" — 정확한 사실 + 시점 + 추가 메타까지 추적 가능.

핵심 차이. 컴플라이언스·KYC·감사·규제 보고추적 가능성이 핵심인 도메인에서 결정적 차이가 됩니다. "왜 이 답이 나왔는가"를 노드·엣지 단위로 입증할 수 있는 것이 GraphRAG의 운영상 가장 큰 장점입니다.
💡 실전 결론
하이브리드(벡터 + 그래프)가 표준입니다. 비정형 텍스트는 벡터로, 엔티티 관계는 그래프로 — 두 방식을 결합하는 것이 실무 GraphRAG의 정석입니다.
🧠 멘탈 모델
벡터 RAG는 사서가 "비슷한 주제의 책 5권"을 찾아주는 일입니다. GraphRAG는 사서가 "이 책의 저자가 쓴 다른 책, 그 다른 책의 인용 관계까지" 따라가는 일입니다.
한 단계 더 — GraphRAG는 RAG의 상위호환이 아니다

비정형 텍스트(논문, 매뉴얼, 기사) 위주 검색은 여전히 벡터 RAG가 비용 효율이 높습니다. GraphRAG는 "엔티티가 명확하고 관계가 핵심"인 도메인에서 빛납니다 — 금융 거래, 약물 상호작용, 사내 조직·프로젝트 지식그래프, 규제 문서 추적.

실전 GraphRAG 시스템은 거의 항상 "벡터 검색 + 그래프 탐색" 하이브리드로 구성됩니다.

⚠ 4가지 함정
  • "GraphRAG가 RAG보다 항상 낫다"는 단정은 위험.
  • 엔티티 링킹 정확도가 낮으면 GraphRAG도 환각.
  • 지식그래프가 부실하면 RAG보다 못한 성능.
  • 하이브리드(벡터+그래프)가 표준이라는 점을 놓치면 도구 선택이 양극화.
CHAPTER 02 · 기초

온톨로지의 빌딩블록

온톨로지는 클래스·인스턴스·속성·관계의 네 가지 빌딩블록으로 구성되어 RDF 트리플로 표현되며, 계층 분류만 가능한 Taxonomy와 달리 관계·제약·추론까지 형식적으로 모델링할 수 있는 의미 구조입니다.

Topic 06 · 온톨로지의 본질적 역할

"같은 회사인데 왜 매출 숫자가 다르지?"

조직 내에서 의미가 합의되지 않으면 같은 데이터도 부서마다 다르게 해석돼 결국 데이터가 거짓말을 하게 됩니다. 이 의미 불일치 문제를 푸는 것이 온톨로지의 본질적 역할입니다.

📊 흔한 사내 충돌 — 매출 정의가 부서마다 다르다
데이터팀은 매출을 "계약서에 도장 찍힌 시점"으로 잡습니다 (수주 기준).
재무팀은 매출을 "실제 현금이 들어온 시점"으로 잡습니다 (수금 기준).
같은 "매출 120억"이라고 적혀 있는데 가리키는 게 다릅니다. 분기 보고서를 합칠 때마다 회의가 한 번 더 잡히는 이유 — "매출"의 의미가 합의되지 않아서입니다.

온톨로지는 이런 문제를 푸는 도구입니다. 1993년 컴퓨터과학자 Tom Gruber"진짜 작동하는 온톨로지"는 4가지 조건을 동시에 만족해야 한다고 했습니다 — 그 4가지가 어떻게 위 매출 충돌을 해결하는지 봐 보겠습니다.

Formal 기계가 읽을 수 있게 Explicit 암묵 → 명시로 Shared 팀 합의된 모델 Conceptualization 데이터 아닌 의미 모델 ONTOLOGY 4가지가 모두 맞물릴 때

하나라도 빠지면 위 매출 충돌은 풀리지 않습니다 — 네 조건이 중심으로 모여야 작동합니다.

F

Formal

기계가 알아듣는 형식으로. 사람만 이해하는 메모·구두 합의는 인정 안 됨.

→ 매출 정의를 코드·논리식으로 표현해 시스템이 자동 검증.

E

Explicit

암묵을 모두 명시로. "당연하지 않냐"는 함정 — 다른 팀에는 당연하지 않음.

→ "매출 = 수주 시점"인지 "수금 시점"인지 문서에 박아둠.

S

Shared

관련 팀이 합의한 모델. 한 팀의 사전이 아니라 회사 전체의 약속.

→ 데이터·재무·영업이 같은 매출 정의를 쓴다는 공식 합의.

C

Conceptualization

데이터가 아닌 의미 모델. "Tom의 매출 기록"이 아니라 "매출이라는 개념".

→ 매출 데이터가 아니라 "매출"이라는 개념 자체를 정의.

CORE 4가지 중 가장 어려운 건 단연 Shared입니다. 코드는 1주면 짜지만, 데이터팀과 재무팀이 "매출"의 정의에 합의하는 데는 6개월이 걸립니다 — 그래서 온톨로지 작업의 90%는 코드가 아니라 도메인 전문가와의 대화입니다.
한 단계 더 — Gruber 1993 원전 정의와 어원

1993년 Tom Gruber는 논문 "A Translation Approach to Portable Ontology Specifications"에서 온톨로지를 "공유된 개념화에 대한 형식적·명시적 명세 (a formal, explicit specification of a shared conceptualization)"로 정의했습니다. 30년이 지난 지금도 산업계의 표준 정의입니다.

어원적으로 ontology는 그리스어 onto-(존재) + logia(학)의 합성어로, 철학에서는 "세상에 무엇이 존재하며 어떻게 분류되는가"를 묻는 한 갈래입니다. 컴퓨터과학으로 옮겨오면서 "기계가 처리 가능한 형태로 그 분류를 표현한다"는 의미가 더해졌습니다.

FAQ
온톨로지와 데이터 모델(스키마)의 차이는?
스키마는 저장 구조에 가깝습니다(테이블·컬럼). 온톨로지는 의미 구조 — "Person은 정확히 한 명의 biologicalMother를 갖는다" 같은 제약과, "hasParent의 transitive closure는 hasAncestor" 같은 추론 규칙까지 포함합니다.
도메인 전문가가 없으면 만들 수 없나요?
기술적으로는 가능하지만 "사용되는 온톨로지"가 되지 못합니다. 데이터 모델은 도구지만, 의미 모델은 합의입니다.
매출 정의 충돌 같은 건 데이터 카탈로그(Collibra·Atlan 등)로도 해결되지 않나요?
데이터 카탈로그는 "이 컬럼이 무엇을 의미하는지 적어두는 곳"입니다 — 위 4조건 중 Explicit·Shared는 잘 다루지만, Formal(논리 기반 추론)은 약합니다. 카탈로그는 사람이 읽는 메타데이터, 온톨로지는 기계가 추론하는 의미 모델 — 두 도구는 보완 관계입니다.
Topic 07 · 4가지 빌딩블록

매출 정의를 "어떻게" 적어둘 것인가 — 4개 빌딩블록

레고 4종류만 있으면 가족·조직·금융·의료 어떤 도메인도 조립할 수 있습니다.

① Class — "어떤 종류가 있는가"

개념의 범주를 선언합니다. "이런 종류의 것이 세상에 있다"는 카탈로그.

예: Person, Company, Revenue, Contract

📊 매출 모델: Revenue·Contract·Payment 클래스를 먼저 선언해 "이런 개념들이 다뤄진다"를 정함.

② Instance — "그 종류의 실제 사례"

Class가 "사람이라는 개념"이라면, Instance는 "바로 그 Tom". 구체적인 개별 개체입니다.

예: :TomPerson의 인스턴스, :Q3계약001Contract의 인스턴스.

📊 매출 모델: :Q3계약001(Contract), :Q3입금001(Payment) 같은 실제 거래 한 건 한 건이 인스턴스.

③ Object Property — "개체와 개체를 잇는 관계"

두 개체 사이를 잇는 "동사"입니다. Tom이 worksAt 회사, 계약이 generates 매출처럼.

예: :Tom :worksAt :Pinetree, :Q3계약001 :generates :Q3매출001

📊 매출 모델: recognizedAt(매출이 어느 시점에 잡혔는가), paidBy(누가 지불했는가) 같은 관계.

④ Datatype Property — "개체의 속성·값"

개체에 붙는 "형용사·숫자·날짜"입니다. 다른 개체가 아니라 단순한 데이터값을 가리킵니다.

예: :Tom :age "34", :Q3매출001 :amount "120000000"

📊 매출 모델: amount(금액), contractDate(계약일), paymentDate(입금일) 같은 값.

조립 예시 — 매출 한 건을 4 빌딩블록으로 표현

아래는 "Q3 계약 한 건이 매출 1.2억을 만들어내고, 11월 15일에 입금됐다"를 4개 빌딩블록만으로 표현한 모습입니다.

🧾 코드 읽는 법 — 외울 필요 없습니다
아래 코드는 Turtle(터틀)이라는 표기법입니다. RDF 트리플(주어·술어·목적어)을 사람이 읽기 쉽게 줄여 쓴 포맷이고, 다음 4가지만 알면 흐름이 잡힙니다.
  • @prefix : <...> .  —  "이 문서에서 :는 저 URL의 줄임말로 쓴다"는 약속 (네임스페이스).
  • :Q3계약001 a :Contract  —  a"~의 인스턴스다 (rdf:type)"의 줄임말.
  • ; 세미콜론  —  "같은 주어를 또 쓰지 않고 다음 속성을 이어 쓴다"는 약속.
  • "120000000"^^xsd:int  —  따옴표 안 값의 데이터 타입을 명시 (여기선 정수).
  • owl:Class  —  OWL(Web Ontology Language)은 W3C 표준 온톨로지 언어. ":Contract는 클래스다"를 선언하는 표준 표기. 자세한 OWL 문법은 Topic 16에서 다룹니다 — 지금은 "클래스를 선언하는 공식 방식" 정도로만 알고 가면 충분합니다.

지금은 외우지 마십시오. 4종류 빌딩블록(Class·Instance·Object·Datatype)이 한 곳에 어떻게 어우러지는지만 눈으로 따라가시면 충분합니다.

@prefix : <http://pp.com/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

# ① Class 선언 — "이런 종류가 있다"
:Contract  a owl:Class .
:Revenue   a owl:Class .
:Payment   a owl:Class .

# ② Instance — "구체적인 한 사례"
:Q3계약001  a :Contract  ;
            :amount "120000000"^^xsd:int ;     # ④ Datatype: 금액
            :contractDate "2026-09-30"^^xsd:date ;
            :generates :Q3매출001 .            # ③ Object: 매출과 연결

:Q3매출001  a :Revenue   ;
            :recognizedAt "2026-09-30"^^xsd:date ;  # ④ 데이터팀 기준(수주)
            :paidBy :Q3입금001 .               # ③ 입금 인스턴스와 연결

:Q3입금001  a :Payment   ;
            :paymentDate "2026-11-15"^^xsd:date .   # ④ 재무팀 기준(수금)
🧠 멘탈 모델 — 한 줄로
Class = 명사의 종류,  Instance = 그 명사의 한 사례,   Object Property = 두 개체를 잇는 동사,  Datatype Property = 개체에 붙는 형용사·수치·날짜.

위 코드는 결국 "Q3계약001(Instance) ─generates(동사)→ Q3매출001(Instance)"처럼 명사를 동사로 잇고, 그 명사들에 형용사(금액·날짜)를 붙인 것뿐입니다. 새 도메인을 만나도 "명사가 뭐고, 동사가 뭐고, 형용사가 뭔가"만 정리하면 됩니다.
한 단계 더 — Object vs Datatype 경계의 함정

예: 회사의 "산업 분야(sector)"를 문자열로 저장하면 datatype property, 산업 분류 인스턴스로 저장하면 object property. 후자가 훨씬 강력합니다 — 같은 sector를 가진 회사들이 자동 그룹되고, sector 자체에 계층(소비재 → 식품 → 음료)을 줄 수 있습니다.

처음에 datatype으로 시작했다가 나중에 object property로 "승격"하는 마이그레이션이 흔합니다. 사전에 비용을 평가하세요.

⚠ 함정 — Class와 Instance 경계를 도중에 바꾸지 마십시오

같은 개념을 "종류(Class)"로 둘 것인지, "사례(Instance)"로 둘 것인지 — 이 결정은 모델링 첫 단계에서 정해두고 가야 합니다. 도중에 뒤집으면 그 위에 쌓아 올린 쿼리와 대시보드가 한꺼번에 깨집니다.

일상 비유 — "산업 분야(Sector)"를 어떻게 둘 것인가

컴퓨터 폴더 구조에 비유해 보십시오.

  • (A) Class로 두는 방식 = "Sector는 폴더 종류이고, 음식·금융·헬스케어는 그 하위 폴더"  →  ":Food:Sector의 하위 종류"
  • (B) Instance로 두는 방식 = "Sector는 태그 목록이고, 음식·금융·헬스케어는 목록 안의 항목"  →  ":Food:Sector의 한 사례"

무엇이 깨지는가. 처음에 A로 짜놓고, 다른 팀이 "Sector별 매출 합계"를 보는 대시보드를 만들었다고 칩시다. 그 안에는 "Sector의 하위 종류를 전부 찾아 매출을 집계"하는 쿼리가 들어 있습니다. 그런데 어느 날 모델을 B로 바꾸면 — 그 쿼리는 빈 결과를 돌려줍니다. 더 이상 "하위 종류"가 아니라 단순 태그 목록이기 때문입니다. 대시보드·리포트·데이터 파이프라인을 전부 다시 짜야 합니다.

처음에 어떻게 고르나. 그 개념이 (1) "카운트하거나 합계 낼 대상이 되는가"면 → Instance에 가깝습니다. (2) "앞으로 하위 분류가 더 늘어날 가능성이 있는가"면 → Class에 가깝습니다. 둘 다 해당된다면 — 더 자주 쓰일 방향을 먼저 고르고, 나머지는 별도 속성으로 보조하는 게 안전합니다.

Topic 08 · 가족 관계도 (인터랙티브)

가족 관계도로 이해하는 온톨로지

익숙한 도메인으로 클래스·관계·상속·추론을 한눈에 — 토글하며 확인하세요.

hasParent hasParent isMarriedWith hasParent hasParent Sue Female Mia Female Tom Male Yuna Female Ken Male

초록 화살표 = 명시한 사실 / 노란 점선 = OWL 공리(transitive·symmetric)에 의해 자동 도출된 사실.

# 가족 관계 (그림과 일치)
:Sue  a :Female .
:Mia  a :Female ; :hasParent :Sue .
:Tom  a :Male   ; :hasParent :Mia ; :isMarriedWith :Yuna .
:Yuna a :Female .
:Ken  a :Male   ; :hasParent :Tom ; :hasParent :Yuna .

# 공리(axiom) — 추론 엔진이 점선 화살표를 자동으로 만들어냄
:isMarriedWith a owl:SymmetricProperty .   # 양방향 자동 도출
:hasAncestor   a owl:TransitiveProperty .  # A→B, B→C ⇒ A→C 자동 도출
:hasParent     rdfs:subPropertyOf :hasAncestor .

이 한 장이 보여주는 것

  • Class 계층 — Person → Male / Female
  • Object Property — isMarriedWith, isParentOf, hasSibling
  • Datatype Property — name, birthDate, nationality
  • 제약 — Person은 정확히 한 명의 biologicalMother
  • 추론 — isParentOf의 transitive closure → hasAncestor

왜 가족 도메인인가

규칙이 단순하지만 추론이 풍부합니다. 부모-자식 한 가지 관계만 있어도 transitive closure로 "조상-후손" 전 계보가 도출됩니다. 실제 지식그래프에서도 같은 패턴이 작동합니다 — "isOwnedBy" 한 관계에서 회사 소유 구조 전체가 추론됩니다.

⚠ 함정
hasParent를 직접 transitive로 두면 안 됩니다 — "부모의 부모"도 "부모"가 되어 의미가 붕괴합니다. 추이적 관계는 hasAncestor 처럼 별도 속성으로 두는 게 표준 패턴입니다.
Topic 09 · RDF Triple

RDF Triple — 지식의 최소단위

모든 사실은 (Subject, Predicate, Object) 한 줄로 표현된다.

S · Subject (주어)
:Tom
P · Predicate (술어)
:worksAt →
O · Object (목적어)
:PinetreePartners

하나의 Triple = (:Tom, :worksAt, :PinetreePartners) — 사실 한 줄의 최소 단위

@prefix : <http://pp.com/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

# (S, P, O) 트리플들
:Tom :worksAt :PinetreePartners ;
     :age "34"^^xsd:int ;
     :hasSkill :Python , :Cypher .  # 한 주어에 여러 객체

균일성

임의 도메인을 같은 (주어(Subject)-술어(Predicate)-목적어(Object)) 형식으로 표현

합성성

트리플 모음 = 그래프 (자연 합성)

전역 식별

URI로 데이터셋 간 결합

한 단계 더 — 시맨틱 웹의 비전

RDF의 결정적 강점은 "균일한 표현"입니다. 어떤 도메인의 어떤 사실이든 (S, P, O) 한 형식이므로 데이터 통합 비용이 낮습니다. 사내 CRM의 트리플과 외부 LinkedIn의 트리플을 그대로 합쳐도 형식 충돌이 없습니다. URI를 통한 전역 식별이 이 통합을 안전하게 만듭니다.

참고: DBpedia ≈ 30억 트리플, Wikidata ≈ 150억 트리플. 사내 지식그래프는 보통 수백만~수억 트리플 규모로 시작합니다.

⚠ 함정
URI에 한글·공백을 넣지 마십시오. 인코딩 문제로 도구마다 깨집니다.
Topic 10 · Taxonomy vs Ontology

분류는 시작일 뿐 — 관계와 제약이 들어와야 진짜 모델

Taxonomy에서 Ontology로 진화하는 흐름은, 거의 모든 지식그래프 프로젝트가 실무에서 거치는 표준적인 발전 경로입니다.

💡 둘 다 RDF로 표현됩니다 — 무엇이 다른가
Taxonomy도 Ontology도 같은 RDF 트리플 위에서 살아갑니다. 차이는 사용하는 어휘의 풍부함입니다. Taxonomy는 rdfs:subClassOf 관계 하나만 씁니다. Ontology는 그 위에 사용자 정의 관계(preys-on, lives-in 등)와 제약·추론 규칙(owl:disjointWith, owl:TransitiveProperty 등)을 더 얹습니다. 즉 Taxonomy ⊂ Ontology — 표현 매체(RDF)는 같고, 어휘가 풍부해질수록 Ontology에 가까워집니다.

Taxonomy — 분류 트리

"~의 한 종류이다(is-a)" 관계로만 위·아래를 잇는 단순 계층. 화살표는 자식이 부모를 가리킴(rdfs:subClassOf 방향).

Animal Mammal Bird Tiger Deer Rabbit Eagle is-a is-a is-a is-a is-a is-a
@prefix : <http://x/> .
:Mammal rdfs:subClassOf :Animal .
:Tiger  rdfs:subClassOf :Mammal .
:Deer   rdfs:subClassOf :Mammal .
:Rabbit rdfs:subClassOf :Mammal .
:Eagle  rdfs:subClassOf :Bird .

답할 수 있는 질문: "Tiger는 어느 상위 분류에 속하는가?"

답할 수 없는 질문: "Tiger는 무엇을 잡아먹는가?", "어디에 사는가?", "어떤 동물과 천적 관계인가?"

Ontology — 분류 + 가로 관계 + 추론

같은 트리에 "포식·서식·소유" 같은 가로 관계(preys-on 방향)와 제약·추론 규칙이 얹힌 그래프

Animal Mammal Bird Tiger Deer Rabbit Eagle is-a is-a is-a is-a is-a is-a preys-on preys-on
@prefix :    <http://x/> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
# (위 Taxonomy의 subClassOf 트리플은 그대로 유지)
:preysOn a owl:ObjectProperty .
:Tiger :preysOn :Deer .
:Eagle :preysOn :Rabbit .

추가로 답할 수 있는 질문: "어떤 동물이 어떤 동물을 먹는가?"

추론까지 가능: "포식자에게 위협받는 종은?" → Tiger·Eagle의 prey 집합이 자동 도출 → Deer, Rabbit

TaxonomyOntology
형태계층적 is-a 트리풍부한 그래프 (트리 + 다양한 관계)
관계오직 is-a (subClassOf)preys-on, owns, treats 등 자유
제약없음disjoint, functional, cardinality
추론불가transitive, symmetric, inverse
예시도서관 분류, 상품 카테고리의약품 지식그래프, 금융 거래 지식그래프
🧭 멘탈 모델
Taxonomy = 가족의 가계도. Ontology = 가계도 + 결혼·후견·동업·고용 등 모든 사회적 관계. 가계도만 봐서는 가족이 어떻게 살아가는지를 알 수 없습니다.
한 단계 더 — 마이그레이션 비용을 1/10로 줄이는 법

Taxonomy 단계에서도 식별자(URI)를 단단히 잡아두면, ontology 확장 시 마이그레이션 비용이 극적으로 줄어듭니다. 처음부터 "이건 나중에 관계로 확장된다"는 가정 아래 URI 패턴만 단단히 정해두십시오.

⚠ 함정
Taxonomy 위에 BI 대시보드를 잔뜩 만들어두면 ontology로 옮겨갈 때 깨집니다. "분류만으로 답할 수 없는 질문"이 나오기 시작하면 이미 ontology가 필요합니다.
CHAPTER 03 · 데이터 모델

RDB · RDF · LPG · SPARQL · Cypher

다중 홉 관계 질의에서 RDB의 JOIN 폭증 한계가 드러나고 그래프 DB가 이를 한 줄 패턴으로 해결하며, RDF와 LPG는 각각 "의미 합의"와 "분석 효율"이라는 서로 다른 책임을 지는 보완적 데이터 모델입니다.

Topic 11 · RDB의 한계

RDB는 왜 한계에 부딪히는가

RDB에서는 관계를 추적할 때마다 JOIN이 누적되기 때문에, "3홉 관계"를 묻는 순간 쿼리 비용이 기하급수적으로 폭발합니다.

Q. 거래 A → B → C → … → A 처럼 3홉 안에 자기 자신으로 돌아오는 자금세탁 패턴을 찾으려면?

-- RDB: 3홉 self-loop 탐지 (다중 JOIN)
SELECT t1.src
FROM transfers t1
JOIN transfers t2 ON t1.dst = t2.src
JOIN transfers t3 ON t2.dst = t3.src
WHERE t3.dst = t1.src;

k홉마다 한 번씩 더 JOIN. 4홉, 5홉으로 가면 쿼리 가독성·인덱스 설계·성능이 동시에 무너집니다.

// Graph DB (Cypher): 가변 길이 경로 한 줄
MATCH (a)-[:TRANSFERS*1..3]->(a)
RETURN a;

*1..3은 1~3홉 안의 모든 경로를 한 번에 탐색합니다. RDB의 다중 JOIN을 한 줄로 압축하는 셈입니다.

🧠 멘탈 모델
RDB는 "문서 캐비닛"입니다 — 폴더 사이를 연결하려면 매번 인덱스 카드(JOIN)를 들고 다녀야 합니다. Graph DB는 "메모 보드"입니다 — 핀과 실로 직접 연결되어 있어 따라가기만 하면 됩니다.
한 단계 더 — 평균 degree와 비용

평균 degree(노드당 이웃 수)가 5인 그래프에서 3홉 쿼리는 RDB는 5³=125건의 JOIN 후보를 평가하지만, Graph DB는 평균 125개 이웃 노드만 방문합니다. 평균 degree 50이면 RDB는 12.5만 후보, Graph DB는 12.5만 노드 — 같은 일이지만 Graph DB는 인덱스 점프가 훨씬 효율적입니다.

다만 "슈퍼노드"(degree 1만+)가 끼면 Graph DB도 무너집니다. 이건 도메인을 잘 설계해 회피하는 영역입니다.

⚠ 함정
기존 RDB의 데이터를 "그대로" Graph DB에 옮기면 효과가 없습니다. 관계가 핵심이 되도록 모델을 다시 설계해야 합니다.
Topic 12 · Graph DB

Graph DB — 관계를 노드처럼 직접 다루는 모델

그래프 DB에서는 노드와 엣지 자체가 데이터의 기본 단위이며, 관계 질의는 JOIN이 아니라 그래프 탐색(traversal)으로 처리됩니다. 엣지가 노드와 동등하게 속성·타입을 가질 수 있어, 관계 자체에 정보를 매달 수 있습니다.

// 커피를 산 사용자
MATCH (u:User)-[:PURCHASED]->(p:Product {category:'Coffee'})
RETURN u.name, p.name;

// 친구의 친구가 산 상품 (2홉)
MATCH (me:User {id:'tom'})
      -[:FRIEND]->(:User)
      -[:FRIEND]->(:User)-[:PURCHASED]->(p)
RETURN DISTINCT p.name LIMIT 10;

엣지가 곧 데이터

관계 자체가 타입과 속성을 가짐 (구매 시각·금액·역할 등). 엣지가 노드 못지않은 정보 단위.

탐색 비용

전체 데이터 크기가 아닌 "이웃 수"에 비례. 2-3홉 질의가 RDB JOIN보다 압도적으로 저렴.

모델-우선 설계

중요한 관계를 먼저 그리고 노드·엣지를 정의. 도메인 사고가 그대로 그래프 모델.

한 단계 더 — 'first-class citizen' 개념과 Graph DB

함수형 언어에서 "함수가 first-class citizen"이라는 표현은 함수를 숫자·문자열 같은 일반 값처럼 변수에 담고 인자로 넘길 수 있다는 뜻입니다. Graph DB의 "관계가 first-class"도 같은 맥락 — 관계를 노드처럼 자유롭게 다룰 수 있다는 의미입니다. 관계 자체에 속성을 매달고, 관계의 타입을 동적으로 바꾸고, 관계 위에 또 관계를 만들 수 있습니다(메타 그래프). 이 표현력이 RDB가 따라잡기 어려운 영역입니다.

⚠ 함정
엣지에 너무 많은 속성을 박지 마십시오. 자주 갱신되는 속성은 별도 노드로 분리하는 게 유지보수에 유리합니다.
Topic 13 · RDF vs LPG

RDF (시맨틱 그래프) vs LPG (속성 그래프)

RDF와 LPG는 서로 경쟁하는 모델이 아니라 보완 관계에 있으며, 의미 표현력과 분석 효율 사이의 트레이드오프를 각각 다른 방향에서 해결합니다.

방식. 모든 사실을 트리플 (Subject, Predicate, Object) 한 줄로 분해합니다. 모든 식별자는 URI로 글로벌 고유성을 보장 — 그래서 회사 A의 :Customer와 회사 B의 :Customer를 안전하게 병합할 수 있습니다.

rdf:type Person schema: schema:name "Tom Lee" :worksAt :Pinetree ex:Pinetree :Tom ex:Tom

3개의 트리플(S–P–O)로 분해 — 각 사실이 별도의 한 줄. 모든 노드·관계가 URI로 식별돼 외부 데이터셋과 안전하게 병합 가능합니다.

@prefix : <http://example.org/> .
@prefix schema: <http://schema.org/> .

:Tom  a            schema:Person ;
      schema:name  "Tom Lee" ;
      :worksAt     :Pinetree .
:Pinetree a        schema:Organization .

강점 4가지

  • 시맨틱 추론OWL + Reasoner로 명시된 사실에서 새로운 사실을 자동 도출.
  • 표준 어휘 재사용schema.org·FOAF·DrugBank 같은 공개 온톨로지를 그대로 가져와 사용.
  • OWA 의미론 — "모른다 ≠ 거짓"으로 처리하기 때문에, 데이터가 점진적으로 채워지는 환경(외부 데이터 통합)에 적합.
  • 모순 검증 — Reasoner가 클래스 제약·정의 충돌을 자동 검출 (예: 한 사람이 동시에 :Employee이면서 :Competitor일 수 없다).

약점 3가지

  • 분석 쿼리 작성·실행이 무겁다 — SPARQL은 표현력은 높지만 분석 워크로드(중심성, 커뮤니티 탐지 등)에 비효율적.
  • 엣지에 속성을 직접 부착할 수 없다 — Reification이나 RDF-star가 필요해 모델이 복잡해진다.
  • 운영 인력 풀이 좁다 — SPARQL/OWL 숙련자가 Cypher 대비 채용 시장에서 희소.
USE CASE 데이터 통합·표준 어휘·규제 의미 합의가 중심인 영역 — 제약(약물 온톨로지), 헬스케어(SNOMED CT), 정부·공공 데이터, 도서관·박물관 메타데이터.

방식. 노드와 엣지 둘 다 라벨(타입) + 키-값 속성을 갖습니다. Cypher 한 줄이 곧 그래프 패턴 — ASCII 화살표 모양 그대로 쿼리로 적습니다.

:Person Tom properties name: "Tom" age: 35 dept: "AI" :WORKS_AT since: 2021 role: "Analyst" :Org Pinetree properties name: "Pinetree" industry: "Cons." founded: 2020

1개 패턴 + 속성 번들 — 노드·엣지에 키-값 속성을 직접 부착. 엣지에 since·role 같은 관계 메타데이터를 직접 매다는 것이 LPG의 1급 기능입니다.

// 노드 + 엣지 + 속성 한 번에
CREATE (t:Person {name:'Tom Lee'})
       -[:WORKS_AT {since:2021, role:'Analyst'}]->
       (p:Organization {name:'Pinetree'});

강점 4가지

  • 엣지에 속성WORKS_AT {since, role, dept}처럼 관계 자체에 메타데이터를 매단다. RDF는 Reification 없이는 불가능.
  • 분석 성능GDS 라이브러리로 PageRank·커뮤니티 탐지·임베딩 학습을 In-Database로 실행.
  • 쿼리 직관성(a)-[:KNOWS]->(b)가 곧 그림. 비개발자도 패턴을 읽고 쓸 수 있다.
  • 운영 친화 — 단일 엔진(Neo4j) 안에 OLTP·OLAP·시각화·드라이버 생태계가 통합. 채용·교육 자원이 풍부.

약점 3가지

  • 표준 추론 미지원 — 클래스 계층·동치성·제약 추론은 외부에서 처리하거나 직접 구현해야 함.
  • CWA 의미론 — "DB에 없으면 거짓". 외부 데이터 통합에는 의미 손실이 발생.
  • 표준 어휘 부재 — schema.org 같은 공유 모델이 없어, 회사마다 라벨·속성 명명 규칙이 갈라진다(거버넌스 부담).
USE CASE 관계 탐색·실시간 분석·추천이 중심인 영역 — 금융 사기 탐지, 자금세탁(AML), 추천 시스템, 통신·SNS 그래프, 공급망 추적.
Q. "Tom이 2021년부터 Pinetree에서 분석가로 근무" — 이 사실을 두 모델로 표현하면?
📐 RDF (Triple Store) — Reification 패턴
:Tom Person :worksAt ① 트리플 1 _:b1 blank node "근무 사실" :org ② 트리플 2 :Pinetree Organization :since ③ 트리플 3 "2021" :role ④ 트리플 4 "Analyst" ∑ 트리플 4개 + blank node 1개 — 사실 1건의 분해
관계 메타데이터 = 트리플 폭증

RDF의 트리플 구조(S–P–O)는 본질상 엣지에 속성을 직접 매달 수 없습니다. "Tom이 2021년부터 Analyst로 근무" 같은 관계 메타데이터를 표현하려면, 근무 사실 자체를 하나의 객체(blank node)로 승격시키고 그 노드에 속성을 다시 트리플로 매달아야 합니다 — 이를 Reification이라 합니다. 결과적으로 사실 1건이 트리플 4개 + blank node 1개로 분해되어 저장량·쿼리 비용은 늘어나지만, 모든 정보가 표준 트리플로 표현되어 도메인 간 의미 통합·표준 어휘 호환·OWL 추론이 가능해지는 것이 RDF의 진짜 강점입니다.

:Tom :worksAt _:b1 .         # ① 트리플1
_:b1 :org    :Pinetree ;     # ② 트리플2
     :since  "2021" ;        # ③ 트리플3
     :role   "Analyst" .     # ④ 트리플4
VS
🔗 LPG (Property Graph) — 속성 번들 패턴
:Person Tom node properties name: "Tom" age: 35 id: 12345 :WORKS_AT edge properties since: 2021 role: "Analyst" :Org Pinetree node properties name: "Pinetree" industry: "Cons." founded: 2020 = 1 노드 + 1 엣지(속성 번들) + 1 노드
관계 메타데이터 = 속성 번들

LPG에서는 엣지가 노드와 동등한 데이터 단위라 :WORKS_AT 엣지에 {since: 2021, role: "Analyst"} 같은 속성 번들을 직접 매달 수 있습니다. 같은 사실이 1개 엣지 + 속성 번들로 콤팩트하게 표현되어 저장량·쿼리 비용 모두 유리하고, Cypher의 (a)-[:R {prop}]->(b) 패턴이 그림과 일대일로 대응돼 직관성도 높습니다 — 대신 표준 어휘·OWL 추론은 LPG가 기본으로 지원하지 않아 외부 도구나 별도 모델링으로 보완해야 합니다.

CREATE (t:Person {name:'Tom', age:35})
       -[:WORKS_AT {since:2021, role:'Analyst'}]->
       (o:Org    {name:'Pinetree', industry:'Cons.'});
핵심 차이. 같은 사실 1건이 RDF에서는 "트리플 5개 + blank node", LPG에서는 "1 엣지 + 속성 번들". 표현력과 효율의 trade-off — 어느 한 쪽이 우월하지 않습니다.
📊 상세 비교 매트릭스 — 10개 차원 텍스트 표 (펼치기/접기)
구분📐 RDF (Semantic Graph)🔗 LPG (Property Graph)
철학지식 표현(Knowledge Representation)탐색·분석 효율
단위Triple (S-P-O)Node + Edge + Property
식별자URI (글로벌 고유)내부 ID + 라벨 (그래프 로컬)
엣지 속성직접 불가 — Reification 또는 RDF-star 필요네이티브 지원 (1급 기능)
가정Open World Assumption (OWA)Closed World Assumption (CWA)
쿼리SPARQLCypher / Gremlin / GQL(ISO 표준, 2024)
추론OWL + Reasoner (HermiT, Pellet)기본 미지원 (외부 처리)
분석/GDS외부 도구 필요In-Database GDS (PageRank·Louvain 등)
대표 도구Protégé · Apache Jena · GraphDB · StardogNeo4j · TigerGraph · Amazon Neptune (LPG 모드)
강점 도메인제약·헬스케어·공공·메타데이터금융·SNS·추천·공급망

구분 항목별 시각 비교 — 10개 차원

표의 각 행을 큰 도식으로 풀어, 두 모델의 구조적 차이를 한눈에 비교할 수 있도록 시각화했습니다.

01

철학 (Philosophy)

"무엇을 위해 만들어졌는가"
📐 RDF — 지식 표현
개념·관계의 의미를 합의된 형식으로 기술 (Knowledge Representation)
Thing subClassOf Person Organization Patient Employee Hospital 의미를 합의하는 어휘·계층 schema.org · FOAF · SNOMED · DrugBank

핵심. 클래스·속성을 표준 어휘로 정의해 도메인 간 의미 합의를 만든다.

VS
🔗 LPG — 탐색·분석 효율
노드·엣지의 빠른 횡단(traversal)·실시간 분석을 위해 설계
A B C D E F k-홉 횡단 · 실시간 분석 PageRank · Louvain · Shortest Path

핵심. 관계 횡단(traversal)이 O(degree)에 가까운 속도로 동작 — 분석·서빙 워크로드 최적화.

요약. RDF는 "의미가 먼저", LPG는 "속도가 먼저". 동일 문제를 보는 시선이 다르다.
02

단위 (Atomic Unit)

"가장 작은 사실의 단위는 무엇인가"
📐 RDF — Triple (S–P–O)
하나의 사실 = 한 줄의 트리플 (Subject, Predicate, Object)
S :Tom P :worksAt O :Pinetree Turtle 표기 :Tom :worksAt :Pinetree . 1 사실 = 1 트리플 (3-튜플) 균일한 직선 구조 — 통합·조인에 강함

구조. 모든 사실이 같은 모양의 3-튜플. RDB의 정규화처럼 균일성이 강점.

VS
🔗 LPG — Node + Edge + Property
노드·엣지에 키-값 속성 번들을 직접 부착
:Person Tom properties name: "Tom" age: 35 :WORKS_AT since:2021 · role:"Analyst" :Org Pinetree properties name: "Pinetree" industry: "Cons."

구조. 노드·엣지·속성이 모두 데이터 단위. 관계 메타데이터를 엣지에 그대로 매단다.

요약. 같은 사실 "Tom이 2021년부터 Pinetree에서 분석가" — RDF는 ~5개 트리플 + blank node, LPG는 1개 엣지 + 속성 번들로 표현된다.
03

식별자 (Identifier)

"리소스를 어떻게 가리키는가"
📐 RDF — URI (글로벌 고유)
웹 URL을 식별자로 — 도메인을 넘어 안전하게 병합 가능
GLOBAL 회사 A http://a.com/Tom 회사 B http://b.com/Tom schema.org schema:Person FOAF foaf:knows 하나의 URI = 전 세계 어디서나 동일 의미

이점. 회사 A의 :Tom과 회사 B의 :Tom이 동일 URI면 자동 병합 — 외부 데이터 통합의 기반.

VS
🔗 LPG — 내부 ID + 라벨 (로컬)
그래프 인스턴스 내부에서만 고유 — 글로벌 식별자 아님
Neo4j Instance · A :Person id=37 :Org id=12 name:"Tom" label = :Person (내부 ID만 고유) Neo4j Instance · B :Person id=37 :Org id=12 name:"Tom" label = :Person (id 37 ≠ A.id 37) 동일 인물? 외부에서 알 수 없음 — 별도 키 매핑 필요

한계. 두 DB의 같은 인물도 자동 병합 불가. 외부 키 매핑/MDM 인프라가 별도로 필요하다.

요약. URI는 "인터넷의 주민번호", 내부 ID는 "한 건물의 호수". 도메인을 넘는 통합에서 차이가 결정적이다.
04

엣지 속성 (Edge Properties)

"관계에 메타데이터를 어떻게 매다는가"
📐 RDF — Reification 필요
트리플 자체에 속성을 부착할 수 없어, blank node로 우회
:Tom Subject _:b1 blank node :Pinetree Object "2021" since "Analyst" role :worksAt ▼ ① :org :since :role 총 4~5개 트리플 + 익명 blank node

문제. 트리플 수가 4~5배로 폭증, 익명 blank node가 모델을 어렵게 한다. RDF-star가 완화 시도 중.

VS
🔗 LPG — 네이티브 지원 (1급)
엣지 자체에 속성 번들을 직접 부착
:Person Tom :WORKS_AT { properties } since:2021, role:"Analyst" :Org Pinetree 1개 엣지 + 속성 번들 동일 사실을 깔끔하게 표현 CREATE (t)-[:WORKS_AT {since,role}]->(p)

이점. 엣지가 노드와 동등한 단위. 관계 자체의 메타데이터(시점, 역할, 가중치 등)를 자연스럽게 기록.

요약. 같은 관계 메타데이터를 RDF는 "증명서 + 부속 서류 한 묶음", LPG는 "본문 한 줄"로 처리한다.
05

가정 (Logical Assumption)

"DB에 없는 사실은 어떻게 해석하는가"
📐 RDF — OWA (Open World)
명시되지 않은 사실 = 미지(unknown). 거짓이 아님.
⬆ 열려 있음 — 외부 사실 추가 가능 ⬆ 알려진 사실 :Tom :worksAt :PP . :Tom :age "35" . "Tom의 배우자는?" ? DB에 없다 → 답: "모름" 데이터가 점진적으로 채워지는 환경(웹·외부 통합)에 적합

적합. "세상의 모든 사실이 DB에 들어 있을 수 없다"는 전제 — 외부 데이터 통합·연구·공공 데이터에 자연스럽다.

VS
🔗 LPG — CWA (Closed World)
명시되지 않은 사실 = 거짓. SQL의 기본 가정과 동일.
⬇ 닫혀 있음 — DB가 세계의 전부 ⬇ DB의 모든 사실 (Tom)-[:WORKS_AT]->(PP) Tom.age = 35 "Tom의 배우자는?" DB에 없다 → 답: "없음(거짓)" NOT EXISTS / 부정 패턴이 직관적 트랜잭션 시스템·운영 DB에 적합

적합. 내부 운영 DB처럼 "DB가 단일 진실원"인 환경에서 NOT EXISTS, 부정 쿼리가 직관적.

요약. 같은 데이터에 "배우자가 없다"는 답이 RDF는 "모른다", LPG는 "거짓"으로 갈라진다 — 두 모델을 섞을 때 가장 큰 함정.
06

쿼리 언어 (Query Language)

"그래프에 어떻게 질문하는가"
📐 RDF — SPARQL (트리플 패턴)
선언적 트리플 패턴 매칭. W3C 표준 (2008).
SPARQL PREFIX : <http://pp.com/> SELECT ?name WHERE { ?u :purchased ?p . ?p :category :Coffee . ?u :name ?name . } ↑ 트리플 3개의 집합으로 패턴 기술

방식. 세 줄의 트리플 패턴 — 집합(set) 의미론. SQL-like한 SELECT/WHERE 구조.

VS
🔗 LPG — Cypher / GQL (ASCII 패턴)
화살표가 곧 쿼리. 2024년 ISO 표준 GQL로 통합.
Cypher MATCH (u:User) -[:PURCHASED]-> (p:Product {category:'Coffee'}) RETURN u.name; 그림처럼 보이는 ASCII 패턴 — 화살표가 곧 관계

방식. (a)-[:REL]->(b)가 곧 그래프. 시각적 패턴 매칭으로 비개발자도 접근 가능.

요약. SPARQL은 "논리식", Cypher는 "그림". 표현력은 비슷하지만 가독성·학습곡선이 다르다.
07

추론 (Reasoning / Inference)

"명시되지 않은 사실을 자동으로 도출할 수 있는가"
📐 RDF — OWL + Reasoner
공리(axiom)에서 새로운 사실을 논리적으로 도출
입력 (Axioms) Father ⊑ Parent Parent ⊑ Person hasFather ⊑ hasParent ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ :John :hasFather :Tom Reasoner HermiT · Pellet 도출된 사실 ⤵ :John :hasParent :Tom :Tom a :Parent :Tom a :Person :John a :Person + 모순 검출 + 클래스 분류 (자동 도출)

원리. 명시된 공리(axiom) — 클래스 계층, 역방향(inverse), 전이성(transitive), 동치성(equivalent) — 와 입력 사실을 결합해, 명시하지 않은 사실까지 논리적으로 자동 도출합니다. 위 다이어그램에서는 공리 3개 + 사실 1개를 입력하면 4개의 새 사실이 자동 유도됩니다 (예: :John :hasParent :Tom, :Tom a :Person 등).

이점. SQL이나 Cypher에서는 사람이 직접 룰을 짜야 하는 다단계 함의(implication)·역방향·전이 추론을 추론 엔진이 한 번에 처리합니다. 동시에 일관성 검증(consistency check)으로 모순된 데이터(예: 같은 개체가 두 disjoint 클래스에 속함)도 자동 감지합니다.

활용 도메인. 의약(SNOMED CT, ICD-11), 법률·규제 컴플라이언스, 헬스케어처럼 "명시되지 않은 의미까지 끄집어내야 하는" 영역에서 결정적인 가치를 가집니다.

VS
🔗 LPG — 기본 미지원 (외부 처리)
추론은 DB 밖에서 — Cypher 룰, 트리거, 외부 코드로 구현
Neo4j (LPG) John Tom :FATHER_OF 사실만 저장 (추론 X) export 외부 처리 // 룰 직접 구현 MATCH (a)-[:FATHER_OF] ->(b) CREATE (a)-[:PARENT_OF] ->(b) 함의·일관성은 직접 검증 ⚠ 룰을 사람이 일일이 작성·관리

설계 철학. LPG는 데이터 모델만 제공하고 논리 엔진은 외부에 두는 구조입니다 — "DB는 빠르게 저장·탐색, 추론은 별도 도구"라는 분리(separation of concerns).

외부 처리 방식. 추론이 필요하면 보통 다음 셋 중 하나로 구현합니다: (1) Cypher 룰 직접 작성MATCH ... CREATE ... 패턴으로 함의 사실을 명시적으로 생성, (2) 그래프 트리거 — 이벤트 기반으로 자동 도출, (3) 외부 룰 엔진(Drools, Neosemantics + OWL Reasoner)에 export 후 결과 import.

한계. 룰의 완전성·일관성·종결성은 모두 작성자가 책임집니다. 룰이 수십~수백 개로 누적되면 거버넌스 부담(서로 충돌하는 룰, 변경 시 영향 분석, 무한 루프 방지)이 RDF/OWL보다 훨씬 큽니다.

그러나. 추론을 거의 안 쓰는 대규모 분석·실시간 탐색 워크로드에서는 LPG의 단순함이 오히려 성능·운영 이점이 됩니다.

요약. RDF는 "논리 엔진이 내장된 백과사전", LPG는 "빠른 그래프 캐시". 의사결정 기준은 도메인 성격에서 갈립니다 — "명시되지 않은 사실을 자동 도출해야 한다"면 RDF/OWL이 압도적 우위, "주어진 사실을 빠르게 탐색·집계한다"면 LPG가 단순·빠름. 실무에서는 두 패턴을 결합하는 게 표준입니다: 의미 모델·추론은 RDF로, 분석·서빙은 LPG로, 두 모델 사이를 표준 브릿지(예: Neosemantics)로 연결.
한 단계 더 — OWL Reasoner는 정확히 무엇을 자동 계산하는가

OWL Reasoner(HermiT, Pellet 등)는 Description Logic이라는 형식 논리를 기반으로 4가지 핵심 작업을 자동으로 수행합니다 — 사람이 알고리즘을 짤 필요 없이, 논리 공리만 정의하면 다음을 결과로 받습니다:

  • Subsumption (포함 관계 추론) — "Father ⊑ Parent ⊑ Person" 같은 클래스 계층을 입력받아 어떤 클래스가 어떤 클래스의 부분집합인지 자동 계산.
  • Classification (클래스 분류) — 모든 클래스 사이의 관계를 정리해 완성된 클래스 계층 트리를 만듭니다. 정의로부터 도출되는 클래스 동치성·서로소 관계도 함께 발견.
  • Consistency Check (일관성 검증) — 공리들이 서로 모순되는지 확인. 예: X ⊑ YX ⊑ ¬Y가 동시에 선언되면 모순으로 보고. 실무에서는 "오타·잘못된 모델링"을 잡아내는 안전장치 역할.
  • Realization (개체 분류 추론) — 개별 인스턴스가 어떤 클래스에 속하는지 자동 도출. 예: :John :hasFather :Tom + hasFather ⊑ hasParent에서 :John :hasParent :Tom을 유도하고, 더 나아가 :Tom a :Parent까지 도출.

이 4가지 작업 모두 "사람이 코드로 짜지 않아도 형식 논리가 보장하는 결과"로 도출됩니다 — 이것이 OWL이 단순한 데이터 모델이 아니라 "추론 가능한 지식 표현 언어"로 분류되는 이유입니다.

실무 함정. OWL 2 DL은 결정 가능(decidable)하지만 최악의 경우 지수 시간 복잡도를 가집니다. 수십만 개 이상의 공리·인스턴스 규모에서는 추론 시간이 폭증할 수 있어, 보통 OWL 2 EL/QL 프로파일처럼 표현력을 제한한 서브셋을 사용합니다.

08

분석 / GDS (Graph Data Science)

"PageRank · 커뮤니티 탐지 · 임베딩을 어디서 돌리는가"
📐 RDF — 외부 도구 필요
분석은 RDF 밖에서 — SPARQL 결과를 Spark·Python에 export
Triple Store GraphDB · Stardog SPARQL SELECT ... 사실 조회만 빠름 CSV·RDF export 외부 분석 환경 Spark GraphX Python NetworkX PyG DGL · GNN PageRank · Louvain · Node2Vec ⚠ ETL 비용 · 동기화 부담 2단계 파이프라인 — 데이터 이동 + 변환 필요

한계. Triple Store는 분석 엔진이 아니다. ETL → 외부 클러스터 → 결과 재적재의 비용이 발생.

VS
🔗 LPG — In-Database GDS
분석 알고리즘이 DB에 통합. 데이터 이동 없이 즉시 실행
Neo4j (LPG · GDS 라이브러리) 그래프 (사실) gds.pageRank.stream gds.louvain.write gds.node2vec.train 60+ 알고리즘 · 결과 즉시 노드 속성으로 저장 In-Database — ETL 없음 · 즉시 실행 · 결과 재사용

이점. 저장 = 분석 = 서빙이 한 엔진. 운영 시스템에서 추천·사기 탐지를 실시간 처리.

요약. RDF는 분석에 "공장으로 운반해서 가공", LPG는 "공장 안에서 바로 가공". 운영 리얼타임 분석은 LPG의 압도적 우위.
09

대표 도구 (Ecosystem)

"어떤 제품·라이브러리가 표준인가"
📐 RDF 진영
학계·표준 출신, 도메인 온톨로지에 특화
Protégé Stanford · 무료 온톨로지 모델링 GUI 데스크톱 앱 Apache Jena Java 라이브러리 RDF/SPARQL 파싱·쿼리 서버사이드 SDK GraphDB Ontotext · 상용 Triple Store + Reasoner 기업 SPARQL 엔드포인트 Stardog 상용 · Knowledge Graph SPARQL + GraphQL + Reasoner Data Fabric 플랫폼 + Apache RDF4J · Virtuoso · AllegroGraph · Anzo

특징. W3C 표준·학계 기반. 모델링(Protégé) → 저장(GraphDB) → 추론(Reasoner)의 분업 체인.

VS
🔗 LPG 진영
상용·운영 중심, 단일 엔진에 OLTP·OLAP·시각화 통합
Neo4j 시장 점유 1위 · 2007~ Cypher · GDS · APOC · Bloom 사실상 표준 TigerGraph 2017~ · 상용 GSQL · 병렬 분산 처리 대용량·고성능 Amazon Neptune AWS 관리형 (LPG+RDF) Gremlin · openCypher · SPARQL 멀티 모델 Memgraph · NebulaGraph In-Memory · 분산 실시간 분석 특화 신생 진영 + JanusGraph · ArangoDB · Dgraph · CosmosDB Gremlin

특징. Neo4j가 사실상 표준. 단일 엔진에서 모델 + 분석 + 시각화 + 드라이버를 통합 제공.

요약. RDF는 "학문적·표준화된 도구 체인", LPG는 "상용 통합 플랫폼". Neo4j 채용 시장이 압도적으로 큰 이유.
10

강점 도메인 (Sweet Spot)

"어느 산업·문제에서 우위를 갖는가"
📐 RDF — 표준·합의가 중요한 영역
제약 · 헬스케어 · 공공 · 메타데이터
💊 제약 / 신약 DrugBank · UniProt · ChEMBL 표적 단백질·약물 상호작용 ↳ 표준 어휘 필수 🏥 헬스케어 / 의료 SNOMED CT · ICD-11 · LOINC 진단·검사 코드 합의 ↳ 의미적 일관성 핵심 🏛️ 공공 / 정부 data.gov · DBpedia · Wikidata 개방·연결 데이터 (LOD) ↳ 기관 간 통합 📚 메타데이터 / 출판 Dublin Core · BIBFRAME 도서관·박물관 카탈로그 ↳ 영구 식별자 필요

공통점. 도메인 표준 어휘가 이미 RDF로 제공되고, 의미 일관성·외부 통합이 분석 속도보다 중요한 영역.

VS
🔗 LPG — 실시간·관계 탐색이 중요한 영역
금융 · SNS · 추천 · 공급망
💰 금융 / AML 사기 탐지 · 자금 세탁 k-홉 거래 경로 추적 ↳ 실시간 응답 필수 👥 SNS / 소셜 친구 추천 · 커뮤니티 탐지 LinkedIn · Facebook · Twitter ↳ 수억 노드 횡단 🎯 추천 시스템 이커머스 · 콘텐츠 유사 사용자·아이템 탐색 ↳ 그래프 임베딩 🚚 공급망 / 물류 부품·공급자 다단계 추적 단절·위험 노출 분석 ↳ 변경 영향 시뮬레이션

공통점. 관계 횡단 속도가 본질. 표준 어휘보다 분석 알고리즘·실시간 응답이 비즈니스 가치를 만든다.

요약. RDF의 강점은 "의미 합의가 가치"인 곳, LPG의 강점은 "관계 탐색이 가치"인 곳. 실무는 두 영역을 모두 다룬다.
💡 한 줄 요약
RDF는 "의미를 합의하는 언어", LPG는 "관계를 분석하는 엔진". 둘은 동일 레이어가 아니라 다른 책임을 진다 — 그래서 실무는 보통 두 개를 동시에 운영합니다.
PATTERN 실전 패턴 — RDF로 의미 모델링 → LPG로 분석/서빙. 둘을 잇는 표준 브릿지가 Neosemantics입니다.
한 단계 더 — 의약품 지식그래프의 표준 사례

DrugBank·UniProt 같은 외부 표준은 RDF/OWL로 제공되고, 사내 분석은 Neo4j로 진행합니다. 매주 RDF 덤프를 가져와 Neosemantics로 LPG에 임포트하고, 신약 후보 탐색은 Cypher로 빠르게 돌립니다.

"표준 어휘는 RDF, 운영은 LPG"가 황금 비율입니다.

⚠ 함정
  • 두 형식 사이를 오갈 때 reification(트리플의 메타데이터)이 폭증할 수 있다.
  • OWL의 OWA를 LPG의 CWA로 단순 변환하면 의미가 미묘하게 바뀐다.
Topic 14 · SPARQL vs Cypher

SPARQL vs Cypher

트리플 패턴(선언적·집합적) vs 그래프 패턴(시각적·직관적) — 도메인이 선택을 결정합니다.

SPARQL — 트리플 패턴

PREFIX : <http://pp.com/>
SELECT ?name WHERE {
  ?u :purchased ?p .
  ?p :category :Coffee .
  ?u :name ?name .
}

표현 단위 = 트리플 (선언적·집합적)

Cypher — 화살표 패턴

MATCH (u:User)
      -[:PURCHASED]->
      (p:Product {category:'Coffee'})
RETURN u.name;

표현 단위 = 그래프 패턴 (시각적·직관적)

🧠 멘탈 모델
SPARQL은 "문장으로 사실을 묻는 일". Cypher는 "화이트보드에 그림을 그려 묻는 일". 같은 질문이지만 다른 사고 방식이 필요합니다.
한 단계 더 — 어느 쪽으로 시작할까

Cypher는 SQL 개발자가 즉시 전이 가능할 만큼 문법이 직관적이라, 처음에는 Cypher로 시작하는 것을 권장합니다. 시맨틱 웹·생명과학·도서관학 쪽은 SPARQL이 표준이고, 산업·금융·소셜 네트워크는 Cypher가 표준입니다. SPARQL은 OWL 추론 결과까지 함께 질의할 수 있다는 점이 강점입니다.

⚠ 함정
Cypher의 가변 길이 경로(*1..3)는 너무 큰 k에서 폭발합니다. 항상 상한을 두고, EXPLAIN으로 쿼리가 어느 정도의 리소스를 사용할지 미리 측정하십시오.
📌 용어 — EXPLAIN으로 쿼리 비용을 미리 측정한다는 것

쿼리를 실제로 실행하지 않고, 옵티마이저가 그 쿼리를 어떻게 처리할지 — 즉 얼마나 많은 노드·엣지를 훑고, 어떤 인덱스를 타며, 메모리·CPU를 얼마나 쓸지 — 미리 예측해서 보여주는 도구입니다. SQL의 EXPLAIN PLAN의 Cypher 버전입니다.

구체적으로 보는 지표 3가지.

  • Estimated Rows — 각 단계가 다음으로 흘려보낼 노드·엣지 개수. 가변 길이 경로 *1..k가 폭발하면 이 숫자가 수십억까지 치솟습니다.
  • DB Hits (예상) — 저장 계층에 대한 물리적 접근 횟수. 인덱스를 타는지, 전체 스캔을 도는지 여기서 드러납니다.
  • 연산자 트리(Operator Tree)Expand·Filter·NodeByLabelScan 같은 단계들의 순서. 비싼 연산자가 어디서 발생하는지 추적 가능.

실측이 필요하면 PROFILE. EXPLAIN추정치입니다. 통계가 오래됐거나 슈퍼노드(degree 1만+)가 끼면 추정이 빗나갈 수 있어, 정확한 실측은 PROFILE(실제 실행 + 통계)로 확인합니다. 단, PROFILE은 진짜로 쿼리를 돌리므로 운영 DB가 아닌 스테이징·리플리카에서 사용하는 게 원칙입니다.

CHAPTER 04 · 추론과 표현력

Asserted → Inferred

온톨로지가 단순 스키마와 결정적으로 다른 지점은 "추론(Reasoning)"이며, 명시된(asserted) 사실에 OWL 규칙을 적용해 새로운(inferred) 사실을 자동으로 도출함으로써 데이터의 의미적 완전성과 일관성을 동시에 확보합니다.

Topic 15 · 추론(Inference)

온톨로지의 진짜 가치 — 추론(Inference)

명시된 사실 + 규칙 = 새로운 사실 (Asserted → Inferred)

1

Asserted Facts

사람이 직접 입력한 사실

2

Ontology + Rules

클래스·관계·OWL 공리

3

Inferred Facts

추론 엔진이 자동 도출한 결론

📌 용어 — Asserted → Inferred 가 의미하는 것

Asserted Facts (명시 사실). assert는 영어로 "확신을 갖고 진술하다"라는 뜻으로, DB·온톨로지 맥락에서는 시스템에 직접 등록해 "참(true)이라고 선언한 사실"을 가리키는 전문 용어입니다. SQL의 INSERT, 트리플 스토어의 데이터 적재, Prolog의 assert/assertz 명령이 모두 이 개념입니다. "입력"이나 "저장" 같은 일반 표현 대신 굳이 "asserted"를 쓰는 이유는, 단순히 "데이터가 거기 있다"를 넘어 운영자가 그 사실에 대해 책임을 진다는 강한 의미를 담기 위해서입니다 — 데이터 품질·일관성·감사의 1차 책임 단위가 이 레이어입니다. 시스템 입장에서는 "불변 입력 레이어"로 다루며, 추론·파생 데이터와 명확히 구분합니다.

Inferred Facts (추론 사실). Reasoner명시 사실 + 온톨로지 규칙을 결합해 자동으로 도출한 새로운 사실. 입력하지 않았지만 논리적으로 참인 것들입니다 — 위 예시의 :Tom :hasAncestor :Sue가 대표적입니다.

→ 화살표가 의미하는 것. 불변 입력 레이어(Asserted)에서 파생 출력 레이어(Inferred)로의 함수적 변환입니다. 같은 Asserted라도 적용되는 규칙(OWL/RDFS)이 달라지면 Inferred 결과가 달라집니다 — "규칙이 데이터의 의미를 결정한다"가 온톨로지의 본질입니다.

운영 패턴. 실무에서는 (1) Asserted만 영구 저장 → (2) Inferred는 빌드 타임에 Reasoner로 한 번 계산해 머터리얼라이즈 → (3) 규칙이 바뀌면 Inferred 레이어만 재생성. 데이터 일관성과 추론 비용의 균형점이 여기 있습니다.

# Asserted (입력한 사실)
:Tom :hasParent :Mia .                       ← Mia는 Tom의 부모님
:Mia :hasParent :Sue .                       ← Sue는 Mia의 부모님

# Ontology Rules (규칙)
:hasAncestor a owl:TransitiveProperty .      ← A→B, B→C 면 A→C도 성립 (이행성)
:hasParent rdfs:subPropertyOf :hasAncestor . ← 부모는 조상의 일종

# Inferred (HermiT 자동 도출)
:Tom :hasAncestor :Mia .                     ← 부모는 조상의 일종이므로
:Tom :hasAncestor :Sue .                     ← ★ Tom은 Sue의 자손 자동 추론!
:Mia :hasAncestor :Sue .                     ← 부모는 조상의 일종이므로
🧠 멘탈 모델
데이터베이스가 "입력한 만큼만 답한다"면, 온톨로지는 "입력 + 규칙으로 도출 가능한 모든 것"을 답합니다. 이 차이가 지식그래프와 일반 DB의 결정적 격차입니다.
한 단계 더 — 입력 비용을 1/100로 줄이는 효과

가족 1만 명의 "부모" 관계만 입력하면 "조상" 관계 수백만 건이 자동 도출됩니다. 다만 추론 결과를 매번 실시간 계산하면 비용이 크니, 보통 빌드 타임에 추론을 한 번 돌려 결과를 머터리얼라이즈하는 게 운영 표준입니다.

⚠ 함정
추론된 사실을 직접 수정하면 안 됩니다. 항상 asserted 레이어에서만 편집하고, 추론은 다시 돌리는 식으로 운영해야 일관성이 유지됩니다.
Topic 16 · OWL & Reasoner

OWL과 추론 엔진 (HermiT, Pellet)

OWL은 Description Logic을 기반으로 클래스 정의·제약·동치성을 형식적으로 표현하고, 추론기를 통해 자동으로 검증할 수 있게 합니다.

OWL이 제공하는 6가지 표현력

각 표현력은 "이런 관계가 성립한다"를 공리로 선언하는 도구이며, 선언된 공리는 추론기가 자동으로 새 사실을 도출하는 근거가 됩니다.

subClassOf (⊑)

의미. "X는 Y의 일종이다" — X의 모든 인스턴스는 자동으로 Y의 인스턴스로도 분류됩니다.
예시. Mammal ⊑ Animal
"포유류(Mammal)는 동물(Animal)의 일종이다."
효과. :Tom a :Mammal만 입력해도 추론기가 :Tom a :Animal을 자동 도출.

equivalentClass (≡)

의미. "X와 Y는 동일한 클래스" — 어느 한쪽 멤버는 자동으로 다른 쪽 멤버.
예시. Author ≡ Person ⊓ ∃wrote.Book
"Author는 Person이면서 동시에 책을 쓴 적이 있는 개체와 같다." (∃wrote.Book = "wrote 관계로 적어도 하나의 Book과 연결됨")
효과. 책을 쓴 Person이 들어오면 추론기가 자동으로 Author로 분류.

disjointWith (⊓ = ∅)

의미. "X와 Y는 절대 겹칠 수 없다" — 교집합이 공집합.
예시. Male ⊓ Female = ∅
"남자(Male)와 여자(Female)는 동시에 될 수 없다 — 두 집합의 공통 원소는 없다."
효과. 같은 인스턴스가 두 클래스에 모두 속하면 추론기가 모순으로 자동 감지.

TransitiveProperty

의미. "A → B이고 B → C이면 A → C도 성립" — 전이성 관계.
예시. hasAncestor
"X의 조상의 조상도 X의 조상이다 — 할아버지의 할아버지도 내 조상."
효과. 1홉 관계만 입력하면 추론기가 모든 다단계 조상 관계를 자동 도출.

FunctionalProperty

의미. "한 개체에 대해 이 관계는 단 하나의 값만 가능" — cardinality 1 제약.
예시. biologicalMother
"한 사람의 생물학적 어머니는 정확히 한 명뿐이다."
효과. 한 개체에 두 다른 어머니가 입력되면 추론기가 둘을 동일인으로 추론하거나 일관성 오류로 보고.

InverseOf (↔)

의미. "X 관계의 반대 방향이 Y 관계" — 양방향 자동 매핑.
예시. hasParenthasChild
"A의 부모가 B이면, 반대로 B의 자녀는 A이다 — 두 관계는 서로 반대 방향."
효과. A의 부모가 B로 입력되면 추론기가 B의 자녀가 A라는 트리플을 자동 추가.

# OWL 예시 — Author는 "책을 쓴 Person"
:Author owl:equivalentClass [
  a owl:Class ;
  owl:intersectionOf (
    :Person
    [ a owl:Restriction ;
      owl:onProperty :wrote ;
      owl:someValuesFrom :Book ]
  )
] .

HermiT Reasoner — 4가지 역할

위에서 정의한 OWL 공리들을 입력받아, 추론기는 다음 4가지 작업을 사람이 코드를 짜지 않아도 자동으로 수행합니다.

① Classification (클래스 분류)

무엇. 입력 공리들의 부분집합 관계를 모두 정리해 완성된 클래스 계층 트리를 도출.
예시. Father ⊑ Parent, Parent ⊑ Person 입력 → Father ⊑ Person 자동 도출
"Father가 Parent의 일종"이고 "Parent가 Person의 일종"이면, 결국 "Father도 Person의 일종"이라는 결론을 추론기가 자동으로 내림.
실무 가치. 수백 개 클래스의 계층 구조를 사람이 일일이 정리할 필요 없음 — 한 번 공리 선언하면 트리가 완성됨.

② Consistency (일관성 검증)

무엇. 입력 공리들이 서로 모순되는지 검사. 모순이 발견되면 "이 온톨로지는 일관성이 깨졌다"로 보고.
예시. X ⊑ YX ⊑ ¬Y가 동시에 선언
"X는 Y의 일종"이면서 "X는 Y가 아닌 것의 일종"이라고 동시에 말하는 셈이라 논리적으로 불가능 — 추론기가 즉시 모순으로 신고.
실무 가치. 모델링 실수·데이터 오류·오타로 인한 의미 충돌을 자동 감지하는 안전장치.

③ Realization (개체 분류 추론)

무엇. 각 인스턴스(개체)가 어떤 클래스에 속하는지 가장 구체적인 수준까지 자동 분류.
예시. Author ≡ Person ⊓ ∃wrote.Book + :Tom a :Person, :Tom :wrote :책1:Tom a :Author
"Author는 책을 쓴 Person과 같다"는 정의가 있고, Tom이 Person이며 책을 썼다는 사실이 있으니 — 추론기가 자동으로 "Tom은 Author다"로 분류.
실무 가치. 인스턴스 분류 룰을 코드로 짤 필요 없음 — 클래스 정의만 작성하면 자동 분류.

④ Entailment (함의 도출)

무엇. 위 모든 작업의 결과로, 사람이 명시하지 않았지만 논리적으로 따라 나오는 새 사실들을 모두 계산.
예시. hasFather ⊑ hasParent + :John :hasFather :Tom:John :hasParent :Tom 자동 추가
"hasFather 관계는 hasParent 관계의 일종(특수 케이스)"이라고 선언되어 있으니 — "John의 아버지가 Tom"이라는 사실에서 "John의 부모가 Tom"이라는 더 일반적인 사실을 자동 도출.
실무 가치. 그래프의 implicit knowledge(암묵 지식)를 모두 explicit하게 만들어, 쿼리만으로도 추론된 결과까지 활용 가능.

📌 용어 — HermiT vs Pellet, 두 OWL 추론 엔진

HermiT — Oxford University가 개발한 OWL 추론 엔진의 사실상 표준. Java 기반 오픈소스로, Hyper-tableau 알고리즘으로 OWL 2 DL을 완전 지원합니다. Protégé에 기본 탑재되어 학계·산업에서 가장 널리 쓰이며, 대규모 온톨로지에서도 빠른 분류(Classification)·일관성(Consistency) 검증으로 정평이 났습니다. "일단 처음 도입한다면 HermiT" 가 거의 정석.

Pellet — Clark & Parsia(현 Stardog Union)가 개발한 또 다른 대표 엔진. Tableau 알고리즘 기반에 더해, HermiT에는 없는 SWRL 룰 통합SPARQL-DL 쿼리를 지원합니다. 룰 기반 추론이 핵심인 의약·법률·규제 도메인에서 선호됩니다.

선택 기준. (1) 표준 OWL 추론만 필요하다 → HermiT (안정성·커뮤니티 우위). (2) 도메인 특화 if-then 룰이 많다 → Pellet + SWRL. (3) 상용 엔진 옵션 — 대규모·실시간 운영이면 RacerPro·FaCT++·Stardog의 엔터프라이즈 엔진도 고려.

한 단계 더 — OWL 프로파일 (EL/QL/RL/DL/Full)

OWL Full(가장 표현력 높음)은 추론이 결정 불가능(undecidable)할 수 있어 실무에서 거의 안 씁니다. OWL DL은 결정 가능하지만 큰 지식그래프에서는 시간이 폭증합니다.

산업에서 가장 많이 쓰이는 프로파일은 OWL 2 RL(규칙 기반, 대규모 가능)과 OWL 2 EL(의료·생명과학 표준)입니다. 표현력과 추론 시간의 트레이드오프를 도메인에 맞게 고르는 게 핵심입니다.

⚠ 함정 — Open World Assumption
OWL은 "명시되지 않은 것은 거짓이 아니라 미지"로 취급합니다. "X에 자식이 없다"를 표현하려면 cardinality 제약을 명시해야 합니다. SQL의 NULL 처리와는 사고방식이 다릅니다.
Topic 17 · 가변 길이 경로

가변 길이 경로 — 다중 홉 패턴 탐지

Cypher의 (A)-[:REL*1..k]->(B) 패턴 한 줄로 1홉부터 k홉까지의 모든 경로를 한 번에 탐색할 수 있어, RDB의 다중 JOIN을 압축적으로 대체합니다.

// 자기 자신으로 돌아오는 1~3홉 거래 (자금세탁 의심)
MATCH (a)-[:TRANSFERS*1..3]->(a)
RETURN a;

// 친구의 친구가 산 상품 (추천)
MATCH (me:User {id:$me})
      -[:FRIEND]->(:User)
      -[:FRIEND]->(f)-[:PURCHASED]->(p)
WHERE NOT (me)-[:PURCHASED]->(p)
RETURN p, count(*) AS hits ORDER BY hits DESC LIMIT 10;

자금세탁

거래 흐름의 순환 패턴 탐지

사기탐지

공통 디바이스·계좌·이메일로 연결된 클러스터

추천

친구의 친구가 산 상품, 협업 필터링 N차

GraphRAG

엔티티 간 관계 경로를 LLM 컨텍스트로 주입

한 단계 더 — 도메인별 "의미 있는 거리"

k가 너무 작으면(1~2) 컨텍스트가 빈약하고, 너무 크면(5+) 노이즈가 폭증해 LLM이 헷갈립니다. 도메인마다 "의미 있는 거리"가 다릅니다 —

  • 회사 소유 구조: 보통 3~4홉
  • 추천 시스템: 2~3홉
  • 자금세탁: 5~6홉
⚠ 함정
EXPLAIN/PROFILE 없이 가변 길이 쿼리를 운영에 올리지 마십시오. 슈퍼노드(degree가 매우 높은 노드)가 경로 중간에 있으면 탐색이 폭증합니다.
CHAPTER 05 · EKG × GraphRAG

엔터프라이즈 지식그래프와 LLM의 만남

EKG사일로화된 사내 데이터를 단일 의미 네트워크로 통합하고, GraphRAG가 그 위에서 LLM에 출처 추적 가능한 답변을 합성하게 함으로써, 환각·출처 부재 문제를 동시에 해결하는 엔터프라이즈 AI의 표준 아키텍처가 완성됩니다.

Topic 18 · EKG

Enterprise Knowledge Graph (EKG)

EKG(Enterprise Knowledge Graph)는 사일로화된 사내 데이터를 하나의 의미 네트워크로 통합해, 조직의 지식을 일관되게 연결하는 "기업의 두뇌" 역할을 합니다.

CRM
ERP
Docs
Logs
External
EKG
Ontology · RDF/LPG · Reasoner · Lineage
Search
Analytics
GraphRAG
Compliance
1

검색

"이 고객과 관련된 모든 것"을 한 번에

2

분석

사기 탐지·이상 탐지·고객 360도 뷰

3

AI 연결

GraphRAG의 컨텍스트 소스

📌 왜 EKG의 핵심 가치가 "검색 · 분석 · AI 연결" 3가지로 묶이는가

1. 검색 — Entity-Centric Search. 전통 검색은 키워드 매칭으로 "어느 데이터셋에 이 단어가 있나"를 찾지만, EKG 검색은 "이 엔티티(고객·제품·계약)에 연결된 모든 사실"을 한 번에 가져옵니다. CRM의 계약, ERP의 결제 이력, Docs의 미팅 노트, Logs의 사용 이력이 단일 노드 주변에서 자동 결합 — 부서별 사일로 검색을 의미 단위로 통합합니다.

2. 분석 — 관계 기반 통계 분석. 관계가 데이터의 핵심 단위라 그래프 알고리즘(PageRank·Community Detection·중심성)이 직접 적용됩니다. 사기 탐지(자금세탁 다단계 추적), 이상 탐지(비정상 패턴 클러스터링), 고객 360 뷰(단일 엔티티의 전 관계망 요약) — 모두 RDB에서는 다중 JOIN 폭증으로 어려운 워크로드를 EKG는 한 줄 쿼리로 처리합니다.

3. AI 연결 — LLM 환각 방지 + 출처 추적. LLM 단독은 환각·출처 부재 문제가 있습니다. EKG는 단일 의미 진실(source-of-truth)GraphRAG정확한 컨텍스트 + 엔티티 단위 출처를 공급합니다. "이 고객의 다음 행동 예측", "이 약물의 부작용 경로" 같은 멀티홉 질문에서 정답률·추적 가능성이 비약합니다 — GraphRAG 가치의 원천이 결국 EKG입니다.

왜 이 3가지가 한 묶음인가. 모두 "엔티티와 관계를 단위로 다룬다"는 공통 특성을 가집니다. CRM/ERP/Docs/Logs의 데이터 단위는 행·로그·문서라 통합이 어렵지만, EKG는 데이터 단위가 엔티티·관계로 정규화돼 — 검색·분석·AI 모두에 동일한 인터페이스로 활용됩니다. 즉, EKG 한 번의 투자가 세 가지 가치 채널로 동시에 환원되는 것이 핵심입니다.

CORE EKG = 데이터의 최종 의미 계층 — '어떤 시스템이 진실을 갖는가' 문제를 끝낸다.
한 단계 더 — 데이터 카탈로그와의 차이

데이터 카탈로그"이 데이터셋이 어디 있다"를 추적하지만, EKG는 "이 비즈니스 엔티티가 어떻게 연결되어 있다"를 모델링합니다. 가트너는 EKG를 데이터 메시(Data Mesh)의 "의미 거버넌스 레이어"로 분류합니다.

단번에 도입은 거의 실패합니다. 가장 가치 있는 한 도메인(보통 고객 360 또는 제품)으로 시작하는 게 표준 패턴입니다.

⚠ 함정
  • "단일 진실"로 포지셔닝하면 정치적 저항을 부른다 — "가상 통합 레이어"로 자리매김하는 게 안전.
  • 거버넌스가 과도하면 EKG는 죽는다 — 변경이 멈추기 때문.
Topic 19 · Neosemantics

Neosemantics — RDF × LPG 듀얼 엔진

의미 모델은 RDF로 정의하고 분석·서빙은 Neo4j(LPG)로 처리하며, 두 모델을 잇는 표준 브릿지가 실무 아키텍처의 핵심이 됩니다.

📌 용어 — Neosemantics(n10s)가 무엇이고 왜 필요한가

한 줄 정의. Neosemantics(약어 n10s — "neo-ten-s")는 Neo4j의 공식 플러그인으로, RDF/OWL로 표현된 의미 모델을 Neo4j의 LPG(Property Graph)에 임포트·익스포트하는 양방향 브릿지입니다. Neo4j Labs가 공식 유지보수하며 오픈소스(Apache 2.0)로 배포됩니다.

왜 필요한가 — 토픽 13의 trade-off 복습. RDF는 표준 어휘·외부 통합·논리 추론에 강하지만 분석·운영이 무겁고, LPG는 분석·실시간 서빙에 빠르지만 표준 어휘와 단절됩니다. 실무에서는 두 진영을 모두 활용해야 하는 케이스가 대부분 — 예를 들어 "외부 의약품 표준(DrugBank)은 RDF로 받아오는데, 사내 신약 후보 탐색은 Cypher·GDS로 돌려야 한다"는 상황입니다. n10s가 바로 이 사이의 표준 인터페이스입니다.

5가지 핵심 기능.

  1. RDF 임포트 — Turtle/JSON-LD/RDF-XML 파일이나 SPARQL 엔드포인트에서 트리플을 가져와 Neo4j 노드·엣지로 매핑.
  2. RDF 익스포트 — Neo4j 그래프를 RDF 표준 포맷으로 내보내기.
  3. URI 기반 식별자 관리 — 같은 URI는 자동으로 동일 노드로 인식 (외부 통합의 핵심).
  4. SHACL 검증 — RDF 제약 룰을 Neo4j 데이터에 적용해 데이터 품질 검사.
  5. LOD 직접 연동 — Wikidata·DBpedia 같은 공개 데이터셋을 한 줄 Cypher로 임포트.

가장 흔한 운영 패턴. "외부 표준 RDF 어휘(DrugBank·SNOMED CT·schema.org)를 n10s로 임포트 → Neo4j 안에서 Cypher·GDS로 분석·서빙 → 필요 시 결과를 RDF로 익스포트". 의약·헬스케어·공공 데이터처럼 표준 어휘 의존도가 높은 도메인에서 LPG 진영으로 진입하는 표준 게이트웨이 역할을 합니다.

1

RDF / OWL

Protégé · Jena · GraphDB → 의미 모델링·OWL 추론·표준 어휘(SKOS, FOAF)

2

Neosemantics (n10s)

Triple ↔ Property Graph 매핑·임포트·익스포트

3

Property Graph

Neo4j · Cypher · APOC · GDS → 저지연 패턴 매칭·그래프 알고리즘·프로덕션 서빙

// Neosemantics 임포트 예시
CREATE CONSTRAINT n10s_unique_uri
FOR (r:Resource) REQUIRE r.uri IS UNIQUE;

CALL n10s.graphconfig.init();
CALL n10s.rdf.import.fetch(
  'https://example.com/ontology.ttl', 'Turtle'
);
🧠 멘탈 모델
Neosemantics는 "두 언어를 모두 읽는 통역사"입니다. RDF 진영의 책과 LPG 진영의 책을 같은 서가에 두고, 어느 언어로 묻든 답할 수 있게 합니다.
한 단계 더 — 표준 4단 스택

모델링 Protégé(GUI) → 추론 검증 HermiT운영 서빙 Neo4j + n10s → AI 연결 LangChain GraphCypherQAChain. 이 4단 스택이 "의미 모델 + 운영 + AI"의 표준 조합입니다.

⚠ 함정
RDF의 reification(트리플에 메타데이터를 다는 패턴)을 LPG로 옮기면 노드·엣지 수가 폭증합니다. 모델링 단계에서 "엣지 속성"으로 표현 가능한지 먼저 검토하십시오.
Topic 20 · GraphRAG (인터랙티브)

GraphRAG — LLM × Knowledge Graph 아키텍처

벡터의 "무엇과 비슷한가"와 그래프의 "무엇과 연결됐는가"를 결합해 답을 합성하는 흐름을, 아래 단계를 클릭하며 따라가 보세요.

STEP 1
Question
자연어 질의
STEP 2
Entity Link
질문 속 엔티티 → 지식그래프 매핑
STEP 3
Graph Walk
관계 경로 추출 (k-홉)
STEP 4
Context
벡터 청크 + 그래프 경로
STEP 5
Answer
LLM 합성 + 출처 표기

Step 1 — Question. 사용자의 자연어 질의를 받습니다. 이 단계에서 의도 분류·언어 감지·중요 키워드 추출 같은 전처리가 일어납니다.

관계 유지

다중 엔티티가 얽힌 질문에 강함

근거 추적

노드·엣지 단위 출처를 답변에 첨부

스키마 강제

허위 관계 생성을 그래프 제약으로 차단

한 단계 더 — Context 구성이 가장 정교한 튜닝 영역

4번째 단계(Context 구성)가 가장 복잡합니다. 그래프 경로와 벡터 청크를 어떻게 합쳐 LLM의 토큰 한도(8K~128K) 안에 압축할지가 시스템 품질을 결정합니다. 가장 흔한 실수는 "k홉을 무한정 넓혀 모든 관련 정보를 다 넣으려는" 시도 — LLM이 컨텍스트가 너무 길면 오히려 핵심을 놓칩니다("lost in the middle"). 정제된 적은 컨텍스트가 풍부한 노이즈보다 낫습니다.

⚠ 함정
  • k홉을 무작정 늘리지 말 것 — 컨텍스트 폭증 + LLM 토큰 비용 + 정확도 하락의 3중고.
  • 엔티티 링킹은 도메인 특화 NER + 동의어 사전 + 임베딩 검색의 조합이 표준.
  • 지식그래프의 품질·커버리지가 GraphRAG의 상한선이다.
Topic 21 · Self-Healing

자연어 → Cypher 자동변환 + Self-Healing 루프

쿼리 실행 실패도 무의미한 에러가 아니라 하나의 피드백 신호이며, 그 에러 메시지를 다시 LLM에 입력해 쿼리를 자동 수정하는 self-healing 루프가 시스템의 견고함을 만듭니다.

STEP 1
User Question
자연어 질의 입력
STEP 2
LLM (GPT-4)
자연어 → Cypher 변환
STEP 3
Cypher Query
생성된 그래프 쿼리
STEP 4
Neo4j
실행 + 재시도 루프
STEP 5
Answer
자연어 답변 합성
✕ 쿼리 실패 Step 2로 복귀 ↺

Self-Healing Loop — 에러 메시지를 다시 LLM에 입력해 쿼리 재생성 (최대 3회)

Step 1 — User Question. 사용자가 자연어로 질문을 입력합니다. 예: "지난 분기 매출 1억 이상 고객은?" 이 시점에 도메인의 슬림 스키마(자주 쓰이는 라벨·관계만 추린 요약)는 LLM의 컨텍스트에 미리 주입되어 있습니다.

# LangChain — GraphCypherQAChain
from langchain.chains import GraphCypherQAChain
from langchain_neo4j import Neo4jGraph

graph = Neo4jGraph(url, user, pwd)
chain = GraphCypherQAChain.from_llm(
    llm=ChatOpenAI(model='gpt-4o', temperature=0),
    graph=graph,
    validate_cypher=True,
    return_intermediate_steps=True,
)
resp = chain.invoke({'query': '커피를 산 사용자 알려줘'})
🧠 멘탈 모델
Self-Healing은 "새 직원이 SQL을 잘못 짜면 DBA가 에러를 보고 다시 짜라고 시키는 일"의 자동화 버전입니다. LLM이 자기 실수를 "실행 결과"로 학습합니다.
한 단계 더 — 운영 환경의 3대 안전장치
  • (a) 시도 횟수 상한 (보통 3)
  • (b) 읽기 전용 강제 (validate_cypher)
  • (c) 비용 모니터링

실패 시 fallback 응답("이 질문은 그래프에서 답할 수 없습니다")을 내야 합니다.

⚠ 함정
LLM에 지식그래프 전체 스키마를 매번 입력하면 토큰이 비싸집니다. 자주 쓰이는 라벨·관계만 추려 "슬림 스키마"를 공급하십시오.
CHAPTER 06 · 실무·로드맵

활용 시나리오와 다음 단계

엔티티가 명확하고 관계 자체가 분석 대상인 도메인일수록 그래프·온톨로지의 ROI가 결정적으로 커지며, 4가지 실무 시나리오와 5주 학습 로드맵을 통해 이를 손에 익히는 구체적 실행 경로를 제시합니다.

Topic 22 · 케이스 스터디 (AML)

케이스 스터디 — 자금세탁 탐지 그래프 (AML)

글로벌 결제사 AML PoC 사례들을 종합한 시나리오 — 한 도메인을 깊게 따라가 보면, 그래프가 어떻게 ROI를 만드는지 명확해집니다.

📎 본 수치는 여러 Neo4j AML 케이스 스터디(BNP Paribas·Citi·HSBC 등 공개 사례)와 일반적인 PoC 보고치를 종합·각색한 학습용 시나리오입니다. 5홉 recursive JOIN의 수십 분대 응답·그래프 변환 후 1-2초 수준의 성능 향상·검출률 개선은 다수 사례에서 보고되지만 실제 수치는 도메인·데이터 규모·튜닝 상태에 따라 큰 폭으로 달라집니다. 외부 보고서 인용 시 원전 사례를 별도 확인해 주십시오.

📉 Before — RDB 기반 룰 엔진

  • 일 거래 200만 건, 의심거래 보고(STR) 월 평균 1,500건
  • 5홉 자금 추적: 5번 JOIN → 쿼리당 평균 30분
  • 의심 거래의 60%가 5+ 단계 페이퍼컴퍼니 패턴인데, 시간 부족으로 70% 놓침
  • 분석가 1인 처리: 일 12건

📈 After — 그래프 기반 (4주 PoC 결과)

  • 5홉 추적: *1..5 한 줄 → 평균 1.2초 (≈1,500×)
  • 의심거래 검출률: 30% → 88%
  • 분석가 1인 처리: 12건 → 45건/일 (3.75×)
  • 규제 보고 대응 시간: 2일 → 4시간

📐 최소 도메인 모델 — 5 클래스 + 5 관계

# 클래스 (Entity 노드 타입)
:Account · :Person · :Company · :Transaction · :SanctionList

# 관계 (Edge 타입)
(:Person|:Company)-[:OWNS]->(:Account)              # 계좌 소유
(:Account)-[:TRANSFERS {ts, amount}]->(:Account)    # 자금 이체 (메타: 시점·금액)
(:Person)-[:CONTROLS {stake}]->(:Company)           # 25%+ 지분 지배
(:Account)-[:SAME_AS]-(:Account)                    # Entity Resolution 결과
(:Person|:Company|:Account)-[:ON_LIST]->(:SanctionList)  # 제재 대상

🗓 4주 PoC 일정

1

Week 1 · 도메인 모델링

AML 전문가 인터뷰 → 5 클래스 + 5 관계 합의 (Protégé로 OWL 정의)

2

Week 2 · 데이터 임포트

CRM/ERP/외부 KYC → 100만 노드 + 500만 엣지 적재 (n10s + APOC)

3

Week 3 · 핵심 쿼리

아래 3개 쿼리 작성 + EXPLAIN 튜닝 + 라벨/관계 인덱스 설계

4

Week 4 · 운영 검증

AML 분석가 5명 워크플로 적용 → 정량 KPI 측정 → 경영진 보고

🔍 핵심 쿼리 3가지

패턴. 자기 자신으로 돌아오는 자금 흐름 — 페이퍼컴퍼니로 자금을 우회시켜 합법화하는 고전적 자금세탁 수법.

MATCH path = (a:Account)-[:TRANSFERS*1..5]->(a)
WHERE all(t IN relationships(path) WHERE t.amount > 1000)
RETURN a.id,
       length(path) AS hops,
       reduce(s = 0, t IN relationships(path) | s + t.amount) AS total
ORDER BY hops DESC, total DESC
LIMIT 20;

→ RDB SQL 환산: 5번 JOIN으로 30분이 걸리던 쿼리가 1.2초 한 줄로 압축됩니다. *1..5 가변 길이 경로가 핵심.

패턴. 제재 대상에 연결된 UBO 추적 — 25%+ 지분 관계를 3홉까지 따라가 실질 지배자 식별.

MATCH (s:Entity)-[:ON_LIST]->(:SanctionList),
      path = (s)<-[:CONTROLS*1..3]-(ubo:Person)
WHERE all(r IN relationships(path) WHERE r.stake >= 0.25)
RETURN DISTINCT ubo.name, ubo.id, ubo.nationality;

→ KYC·제재 대상 스크리닝의 핵심 쿼리. 회사→자회사→손자회사 지분 관계를 한 번에 추적.

패턴. Smurfing — 단일 큰 금액을 여러 작은 거래로 쪼개 보고 임계치($10K)를 회피하는 패턴. 시간·금액·홉수 조건을 결합.

MATCH (src:Account)-[t1:TRANSFERS]->(mid:Account)
                  -[t2:TRANSFERS]->(dst:Account)
WHERE t1.ts > datetime() - duration('P1D')
  AND t2.ts > t1.ts AND t2.ts < t1.ts + duration('PT1H')
  AND t1.amount >= 9000 AND t1.amount <= 9999
WITH src, dst, count(DISTINCT mid) AS hops_via
WHERE hops_via >= 5
RETURN src.id, dst.id, hops_via
ORDER BY hops_via DESC;

→ 시계열(duration) + 그래프 패턴 + 집계의 결합. RDB에서는 윈도우 함수 + 다중 JOIN으로 풀어야 할 일을 한 번에.

PoC 표준 패턴 (모든 도메인에 적용) 가장 가치 있는 한 시나리오 선정 → 작은 온톨로지(5~10 클래스) + 작은 그래프(100만 노드 이하) → 한 가지 핵심 쿼리로 비즈니스 임팩트 입증 → 점진적 확장. 빅뱅 도입은 거의 모두 실패합니다.
FAQ — 우리 회사에 지식그래프 PoC가 가치 있는지 어떻게 판단하나요?

체크리스트 — 2개 이상 해당이면 PoC 가치 있음:

  • 부서마다 같은 용어를 다르게 사용 (매출·고객·계약의 정의 불일치)
  • 다중 홉 관계 질문이 자주 나옴 — "X의 Y의 Z" 형태
  • 검색·추천·사기탐지·컴플라이언스가 비즈니스 KPI
  • 외부 표준 데이터(DrugBank·SNOMED CT·Wikidata) 통합 필요
  • RDB 다중 JOIN 쿼리가 운영 병목
⚠ 함정 — 모든 PoC가 부딪히는 3가지
  • 비즈니스 임팩트 불명확 — "우리도 한번 해보자"로 시작하면 99% 실패. 처음부터 측정 가능한 KPI(검출률·처리시간·비용)로 정의해야 합니다.
  • 도메인 전문가 부재 — 데이터 팀 단독으로 만들면 "기술적으로는 작동하지만 아무도 안 쓰는" 시스템이 됩니다. AML PoC의 W1은 사실상 분석가 인터뷰가 전부입니다.
  • 슈퍼노드 무시 — 모든 계좌가 연결된 대형 은행 메인 계좌 같은 슈퍼노드(degree 10K+)가 끼면 가변 길이 쿼리가 폭발합니다. 모델링 단계에서 차단·우회 패턴을 설계해야 합니다.
Topic 23 · 로드맵

도구 스택 + 5주 학습 로드맵

"데이터에 의미를 부여하는 일은, AI 시대의 가장 인간적인 일이다."

도구 스택

Protégé

온톨로지 모델링 (RDF/OWL) · 무료 데스크톱

Apache Jena

Java RDF/SPARQL 라이브러리

Neo4j Desktop

LPG DBMS · Sandbox로 즉시 실습 가능

Neosemantics

RDF↔LPG 브릿지 플러그인

LangChain

GraphCypherQAChain 등 GraphRAG 빌딩블록

5주 학습 로드맵

W1

Protégé 모델링

가족 관계 온톨로지를 직접 그려보며 클래스·속성·인스턴스 감각 잡기

W2

RDF · SPARQL

Triple로 자체 데이터셋을 표현하고, SPARQL 한 줄로 질의해보기

W3

LPG · Cypher (Neo4j)

Neo4j Sandbox에서 가변 길이 경로(*1..k) 쿼리를 직접 실행

W4

GraphRAG 실습

LangChain GraphCypherQAChain으로 자연어 → Cypher 변환 파이프라인

W5

자기 도메인 PoC

한 가지 작은 시나리오로 비즈니스 임팩트 입증 — 빅뱅 도입은 금지

🚀 끝맺음
이 자료를 다 읽었다고 학습이 끝난 건 아닙니다. 한 가지 작은 PoC를 직접 실행해보는 게 진짜 시작입니다 — 여러분 도메인에서 가장 의미 있는 한 시나리오를 골라, 작은 온톨로지 + 작은 지식그래프로 핵심 쿼리 한 줄을 입증해보십시오.
APPENDIX · 용어사전

용어사전 (가나다순)

본문에 등장한 모든 전문 용어를 가나다·알파벳 순으로 정리하였으며, 각 항목의 "본문에서 보기"를 누르면 첫 등장 위치로 즉시 이동하여 맥락 속에서 정의를 다시 확인할 수 있습니다.

Appendix · Glossary

용어사전

본문에 산재한 툴팁을 한 곳에 모아 학습·복습 시 참조할 수 있게 정리한 인덱스입니다.

로딩 중…