본문 바로가기

JanusGraph/JanusGraph 이론

JanusGraph 기초 개념 ① / 정점(Vertex), 간선(Edge), 속성(Property), 라벨(Label)

✅ 그래프의 기본 구성 요소

📍 정점(Vertex) = 노드(Node)

  • 그래프에서 데이터의 주체(엔터티)를 의미합니다.
  • 예: 사람(Person), 회사(Company), 제품(Product) 등
  • 예시에서 "Marko", "Josh"와 같은 개인은 정점입니다.

📍 간선(Edge) = 관계(Relation)

  • 정점 간의 관계를 나타냅니다.
  • 방향성이 있을 수도 있고 없을 수도 있습니다.
  • 예: “Marko → Josh” 관계는 “Knows”라는 간선을 통해 표현됩니다.

📍 속성(Property)

  • 정점이나 간선에 부여되는 부가 정보
  • 예: 이름(name), 나이(age), 입사일(joined_date) 등이 속성으로 들어갈 수 있습니다.

✅ 속성과 관계형 데이터베이스의 비교

관계형 데이터베이스(RDB)의 테이블과 비교해보면 이해가 쉬워요.

RDB 테이블그래프
행(Row) 정점(Vertex)
열(Column) 속성(Property)
외래키(FK) 간선(Edge)

예를 들어, Employees 테이블에 직원 이름(name), ID, 부서(dept) 컬럼이 있을 경우, 이를 그래프에서는 다음과 같이 표현할 수 있습니다:

  • 직원은 하나의 정점
  • 속성은 정점에 부여된 정보
  • 다른 테이블(부서 등)과의 연결은 간선으로 표현

✅ 라벨(Label)의 개념

📍 정점 라벨(Vertex Label)

  • 정점의 유형을 식별합니다.
  • 예: 정점 "Marko"와 "Josh"에 person이라는 라벨이 붙어 있다면, 이들은 모두 ‘사람’이라는 동일한 유형을 공유합니다.

📍 간선 라벨(Edge Label)

  • 간선의 관계를 설명하는 명칭입니다.
  • 예: Marko → Josh 간선에 knows라는 라벨이 있다면 “Marko는 Josh를 안다”는 의미

✅ 시각 예시

아래와 같은 구조를 상상해볼 수 있습니다.

[Marko]    -- knows -->   [Josh]
      |                                   |
name: Marko            name: Josh    
label: person           label: person
  • knows는 간선 라벨
  • name은 속성
  • person은 정점 라벨

🧩 요약

개념 설명 예시
Vertex 데이터 주체 사람, 회사 등
Edge 관계 knows, works_at
Property 속성 정보 name: "Marko"
Vertex Label 정점 유형 person
Edge Label 관계 유형 knows

아래 쿼리를 가지고 어떻게 진행되는지 한번 자세하게 알아보겠습니다.

g.V().has('person','name', within('marko','josh')).outE().groupCount().by(label()).next()

 

g.V() 그래프 전체 정점에서 시작
has('person', 'name', within(...)) name 속성이 'marko' 또는 'josh'인 person 정점 선택
outE() 해당 정점에서 나가는 간선을 모두 탐색
groupCount().by(label()) 간선의 label 기준으로 그룹핑 + 개수 세기
.next() 결과 반환 (Map 형태) → 예: {knows=2, created=3}

 

각 Step (이미지)와 쿼리의 작동 과정을 연결해서 설명드릴게요.

STEP 1

🔍 STEP 1 :

  • g.V()로 그래프의 모든 정점들을 순회하는 중
  • 그 중에서 has('person', 'name', within('marko', 'josh')) 조건을 만족하는 정점만 통과
    • 즉, 정점 1 (marko), 정점 4 (josh)만 필터링됨
  • 그려진 초록색 작은 생물들이 Gremlin 트래버설 엔진을 상징

 

STEP 2, 3

 

🔍 STEP 2 :

  • outE()로 marko와 josh로부터 나가는 간선을 탐색
    • marko → knows(vadas), knows(josh), created(lop)
    • josh → created(ripple), created(lop)
  • 총 간선 수: 5

🔍 STEP 3 :

  • 그 중에서 groupCount().by(label())으로
    • label이 knows인 간선: 2개
    • label이 created인 간선: 3개
  • 결과: {knows=2, created=3}

 

 

Gremlin 그래프 구조

 

🔍 의미:

  • 실제로 Gremlin 쿼리가 실행된 그래프 구조를 보여줌
  • marko (정점 1), josh (정점 4)의 연결 관계와 label, 속성(name, age), 간선 weight 확인 가능
  • 시각적으로 qurey가 어디를 탐색했는지 경로를 추적 가능