온톨로지 노드 연결이 빠진 것 같은데, ML이 찾아준다고?
온톨로지 만들다 보면, 어느 순간 "이거 더 이어야 하는 거 아닌가?" 싶은 느낌이 오거든요.
노드도 어느 정도 채웠고, 관계도 나름 정의했는데, 그래프를 보다 보면 뭔가 허전해요. "이 노드랑 저 노드, 연결 안 되어 있는 게 맞나?" 같은 의문이 자꾸 생기는 거예요. 근데 노드가 수십 개일 땐 눈으로 훑으면 됐는데, 수백 개 넘어가니까 그게 안 되더라고요.
뭘 더 이어야 하는지, 어떻게 찾지?
문제가 뭐였냐면, "빠진 연결"이라는 게 에러 메시지가 뜨는 것도 아니고, 쿼리가 실패하는 것도 아니거든요. 그냥 조용히 빠져 있어요.
예를 들면, A라는 개념과 B라는 개념이 분명히 관련이 있는데, 내가 데이터 넣을 때 그 관계를 명시하지 않았으면 그래프에는 둘 사이에 아무 선도 없어요. 직접 하나하나 확인하면서 "이거 연결해야 하나?" 판단하는 건 너무 비효율적이고, 애초에 내가 모르는 관계는 검토 대상에도 안 올라와요.
그래서 "사람 눈 말고 다른 방법으로 빠진 연결을 찾을 수 없나?" 찾아보기 시작한 거예요.
그래프에도 ML을 붙일 수 있다
찾아보니까, 그래프 데이터에 ML을 적용하는 방법이 이미 꽤 정리되어 있더라고요. 크게 두 가지가 눈에 들어왔어요.
유사 노드 탐색 — "이 노드랑 비슷한 놈이 누구야?"
첫 번째는 노드 유사도(Node Similarity)예요. 쉽게 말하면, 그래프 안에서 "연결 구조가 비슷한 노드끼리 묶어주는" 거예요.
비유하자면 이런 거예요. 회사에서 A라는 사람이 마케팅팀, 디자인팀이랑 자주 협업하고, B라는 사람도 마케팅팀, 디자인팀이랑 자주 협업해요. 그러면 A와 B는 직접 같이 일한 적 없어도 "비슷한 위치에 있는 사람"이잖아요. 노드 유사도가 딱 이걸 잡아주는 거예요. 연결된 이웃이 비슷하면, 그 노드끼리도 관련이 있을 가능성이 높다는 논리인 거죠.
이걸 온톨로지에 적용하면, 내가 미처 연결 안 한 노드들 중에서 "이 둘은 구조적으로 비슷한데, 혹시 관계가 빠진 거 아닌가?"를 찾아낼 수 있어요.
링크 예측 — "여기 선이 있어야 하는 거 아냐?"
두 번째는 링크 예측(Link Prediction)이에요. 이건 더 직접적이에요. 기존 그래프 구조를 보고, "아직 연결은 안 되어 있지만 연결되어야 할 것 같은 노드 쌍"을 예측해주는 거거든요.

이 두 가지가 하는 일이 미묘하게 달라요.
노드 유사도는 "비슷한 애들끼리 묶어줄게"에 가깝고
링크 예측은 "여기 선이 없는데 있어야 할 것 같아"에 가까워요
둘 다 "빠진 연결을 찾는다"는 큰 방향은 같은데, 노드 유사도는 간접적으로 힌트를 주는 거고, 링크 예측은 직접적으로 "이 엣지 추가해봐"를 제안하는 거예요. 상황에 따라 하나만 쓸 수도 있고, 둘 다 돌려서 교차 검증할 수도 있더라고요.
이걸 어디서 돌리나 — Neo4j GDS
🔧 그래서 "좋아, 해보자" 했는데, 바로 다음 질문이 "이걸 어디서 돌리지?"였거든요.
Neo4j를 쓰고 있다면 Graph Data Science(GDS) 라이브러리가 있어요. Neo4j에 플러그인처럼 얹는 건데, 설치하면 Cypher 쿼리 안에서 바로 유사도 계산이나 링크 예측 알고리즘을 돌릴 수 있어요.
흐름을 간단히 정리하면 이래요.
GDS 설치 — Neo4j에 플러그인 추가 (Docker라면 환경변수 한 줄)
그래프 프로젝션 — 전체 DB 중에서 분석할 노드/관계만 골라서 메모리에 올림
알고리즘 실행 — 유사도 계산이든 링크 예측이든, GDS가 제공하는 함수 호출
결과 확인 — 점수가 높은 노드 쌍 = "이거 연결 검토해봐"
핵심은 "별도로 파이썬 ML 환경을 세팅할 필요 없이, Neo4j 안에서 다 된다"는 거예요. 물론 더 복잡한 모델을 쓰고 싶으면 파이썬으로 빼야 하지만, 기본적인 유사도 계산이나 링크 예측 정도는 GDS만으로 충분하더라고요.

근데 주의할 점
한 가지 착각하기 쉬운 게 있는데, ML이 "정답"을 주는 게 아니에요. 점수를 주는 거예요.
유사도 0.85라고 해서 무조건 연결해야 하는 건 아니고, "이 쌍은 한번 확인해볼 만하다"는 후보를 추려주는 거거든요. 결국 최종 판단은 사람이 해야 해요. 그래서 저는 이걸 "빠진 연결을 자동으로 채워주는 도구"보다는 "내가 놓친 걸 알려주는 리뷰어"에 가깝다고 생각하고 있어요.
그리고 그래프가 너무 작으면 (노드 수십 개 수준) ML을 돌려봤자 의미 있는 패턴이 안 나와요. 어느 정도 데이터가 쌓여야 구조적 패턴이 생기고, 그걸 ML이 잡아낼 수 있거든요.
정리하면
온톨로지 작업하다가 "더 이어야 할 것 같은데 뭐가 있지?" 싶었고, 찾아보니 그래프 ML이 이걸 도와줄 수 있었어요. 비슷한 노드 찾기(Node Similarity)로 구조적으로 가까운 놈들을 묶고, 링크 예측(Link Prediction)으로 빠진 관계 후보를 받고, 이걸 Neo4j GDS에서 바로 돌릴 수 있더라고요.
아직 "이걸로 온톨로지가 완성됐다!" 같은 단계는 아니고, 후보 뽑아서 하나씩 검토하는 중이에요. 그래도 눈으로만 훑던 것보다는 훨씬 체계적으로 빠진 부분을 찾을 수 있게 된 거라, 그래프가 점점 커질수록 이 방식이 필수가 될 것 같아요.