자연어를 그래프 쿼리로
그래프 데이터베이스에 정확한 질문을 하려면 Cypher를 써야 합니다. LLM이 자연어 질문을 Cypher로 바꾸는 Text2Cypher의 흐름과, 생성된 쿼리를 실행하기 전에 무엇을 검증해야 하는지 배웁니다.
이번 회차, 내 속도로.
기초를 더 짚거나 궁금한 주제로 잠깐 넓혀 보세요. 최대 3단계를 거쳐 DAY 84로 돌아옵니다.
난이도·관심 주제 고르기
1/2개 선택 · 새 보충·심화 수업과 본과정 다시 읽기를 선택할 수 있어요.
이렇게 다녀와요 1단계 · 약 12분
- 출발 · DAY 84Text2Cypher
- 1. 관심 주제스키마 표현·관계 방향·값 예시추가 33 · 새 추가 수업
- 복귀 · DAY 84원래 회차 이어가기
- 스키마 표현·관계 방향·값 예시 · DAY 84에서 흔한 오류로 꼽은 존재하지 않는 레이블, 뒤집힌 방향, 값 표기 차이는 상당 부분 프롬프트의 스키마 표현에서 예방할 수 있습니다.
선택과 경로 기록은 이 브라우저에 저장됩니다. 본과정의 회차 완료와는 별도입니다.
핵심 개념
Text2Cypher는 자연어 질문을 Cypher 쿼리로 바꿔 그래프 데이터베이스에 묻는 일입니다. Ozsoy et al.(2024)은 이를 쿼리 언어를 모르는 사용자도 지식 그래프를 쓰게 하는 다리로 보고, 공개 데이터셋 여러 개를 모아 44,387개 사례의 데이터셋을 만든 뒤 미세 조정한 모델이 기준 모델보다 Google-BLEU와 정확 일치(Exact Match) 점수에서 나아졌다고 보고했습니다. 답이 DB의 실행 결과이므로 “2020년 이후 입사한 사람 수”처럼 세기·필터·정렬이 필요한 질문에 강하며, 벡터 검색은 이런 정확한 집계에 약합니다.
흐름은 다섯 단계입니다. 노드 레이블·속성·관계 타입과 방향을 담은 스키마를 프롬프트에 넣고, LLM이 Cypher를 생성하면, 문법을 검사하고(파서나 EXPLAIN), 레이블·관계 타입·방향·속성 이름이 실제 스키마에 있는지 검사한 뒤, 실행해 결과를 답으로 설명합니다. 생성과 실행 사이에 검증을 두는 것이 핵심이며, 검증에 실패하면 오류 내용을 다시 LLM에 주어 고치게 할 수 있습니다.
흔한 오류는 스키마에 없는 레이블(:Person 대신 :Employee), 뒤집힌 관계 방향, 틀린 속성 이름, 상한 없는 가변 길이 경로(DAY 33), 값 표기 차이(‘대전’과 ‘대전광역시’)입니다. 방향 오류가 특히 까다롭습니다. 문법도 맞고 레이블도 있어 오류 없이 실행되지만 결과가 0행이며, 이를 ‘해당 없음’으로 답하면 틀린 결론이 그럴듯하게 전달됩니다.
안전장치도 함께 설계합니다. 질의용 연결은 읽기 전용 권한으로 열어 CREATE·MERGE·DELETE를 막고, LIMIT과 시간 제한을 두며, 생성된 쿼리와 결과를 로그로 남겨 사람이 검토할 수 있게 합니다. 데이터를 바꾸는 일은 생성된 쿼리로 하지 않고, 검증 규칙이 정의된 액션(DAY 96)으로 처리하는 편이 안전합니다.
작은 예제로 따라가기
스키마 (:Person {name})-[:WORKS_AT {since}]->(:Lab {name, city})에서 질문 “대전에 있는 연구실에서 일하는 사람은?”의 정상 후보는 MATCH (p:Person)-[:WORKS_AT]->(l:Lab {city:'대전'}) RETURN p.name입니다.
레이블 오류 후보 MATCH (p:Employee)-[:WORKS_AT]->(l:Lab {city:'대전'}) RETURN p.name은 문법은 통과하지만 스키마 검사에서 :Employee가 없어 실패합니다.
방향 오류 후보 MATCH (l:Lab {city:'대전'})-[:WORKS_AT]->(p:Person) RETURN p.name은 레이블·관계 이름만 보는 검사를 통과하고 실행되지만 0행입니다. 관계의 시작·끝 레이블까지 스키마와 대조해야 잡힙니다.
직접 실험해 보기
질문 하나를 고르고 후보 Cypher를 하나씩 선택해 문법→스키마→실행 결과 순서로 검증 단계를 누른 뒤, 각 후보가 어느 단계에서 실패하는지 기록하세요.
LLM이 만든 Cypher를 단계별로 검증하기
(:Person {name}) (:Company {name}) (:Product {name})
(:Person)-[:WORKS_AT]->(:Company)
(:Person)-[:FOUNDED]->(:Company)
(:Company)-[:SUPPLIES]->(:Company)
(:Company)-[:MAKES]->(:Product)MATCH (p:Person)
-[:WORKS_AT]->(c:Company {name: '누리전자'})
RETURN p.name- 1. 문법대기
- 2. 스키마대기
- 3. 실행대기
이번에는 직접 풀어 보세요
정답을 보기 전에 계산과 이유를 적어 보세요. 해설과 비교하고 확인 표시를 남기면 완료할 수 있습니다.
힌트 보기
STORED_AT은 배송에서 창고로 향합니다. count()는 일치하는 행이 없어도 오류가 아닙니다.
풀이와 비교하기
관계 방향이 뒤집혔습니다. 스키마에서 STORED_AT은 Shipment→Warehouse인데 쿼리는 Warehouse→Shipment를 찾으므로 일치하는 경로가 없어 count(s)=0이 오류 없이 반환됩니다. 고친 쿼리는 MATCH (s:Shipment {status:'delayed'})-[:STORED_AT]->(w:Warehouse {name:'부산센터'}) RETURN count(s)입니다. 0이라는 숫자를 그대로 답하지 말고 방향 검증을 먼저 해야 합니다.
풀이와 확인 표시는 이 브라우저에 저장됩니다.
오늘 이해한 것과 다시 볼 것
계산이 달라진 이유, 헷갈린 개념, 다음에 확인할 질문을 남겨 보세요.
메모는 이 브라우저에 저장됩니다. 홈에서 전체 기록을 내려받을 수 있습니다.오늘의 이해 확인
방향이 뒤집힌 Cypher가 오류 없이 0행을 돌려줄 때 가장 위험한 대응은?
완료 조건: 확인 퀴즈 정답 · / 직접 풀기 0/1
더 깊이 읽기
예제와 실험 데이터는 이 과정을 위해 만든 것입니다. 원문은 선택 자료이며, 강의와 직접 풀기만으로도 다음 회차를 이어갈 수 있습니다.
Text2Cypher: Bridging Natural Language and Graph DatabasesOzsoy et al. (2024)Cypher Manual: IntroductionNeo4j이 자료는 개념 학습용입니다. 실제 데이터베이스·라이브러리·플랫폼의 동작과 설정은 제품과 버전마다 다를 수 있습니다.