개발/GraphDatabase

4. Repeat 과 Emit

희묭 2023. 6. 12. 19:37

본격적인 그래프 탐색에서 가장 많이 사용하는 함수는 repaet 과 emit 입니다.
repeat 은 순회를, emit 은 방출을 나타냅니다
일단 문법부터 보자면

g.V().has("name","aimyon").repeat(in()).emit()

aimyon 입장에서 in 관계에 놓인 모든 vertex를 조회하고 그 조회한 vertex 입장에서 in 관계에 놓인 모든 vertex를 조회하는 쿼리입니다.
여기서 그런 사람들중 특정 조건을 만족하는 사람들만 뽑고싶다고하면

g.V().has("name","aimyon").repeat(in()).emit(has("gradeLevel",30))

위와 같이 방출 시점에서 조건을 걸면 됩니다.
그런데 여기서 aimyon 의 level이 30이라서 출발지도 같이 나오는 형태를 원한다면?

g.V().has("name","aimyon").emit(has("gradeLevel",30)).repeat(in())

repeat 과 emit 의 순서를 바꾸면 됩니다.
먼저 방출하고 순회하냐 순회를 하고 방출을 하냐의 차이입니다.

g.V().has("name","aimyon").repeat(inE().has('key', '1').outV()).emit()

만약 특정한 edge 만을 타고가고 싶다면 위와 같이 repeat에 조건을 걸어줄수도 있습니다.

g.V().has("name","aimyon").repeat(inE().has('key', '1').outV()).emit(has("gradeLevel",30)).count()

위와 같이 내가 원하는 조건들을 걸고 그 갯수가 얼마나 있는지도 알수있습니다

g.V().as('v').repeat(inE().has('key', '1').outV()).emit(has("gradeLevel",30)).limit(10).groupCount().by(select('v').values('no'))

마지막은 응용쿼리로 실제 사용하고 있는 쿼리를 첨부했는데
핵심은 repeat 과 emit 입니다.
나머지는 조건절이고 groupCount 를 쓰면 내 밑에 있는 모든 vertex에 대해 똑같은 repeat, emit 조건을 적용하여 갯수를 뽑아낼수 있습니다
 
이런식으로 일반적인 RDB에서는 조회하기 힘든 조건도 쉽게 처리할 수 있습니다.