개발/GraphDatabase

6. 길이 없으면 길을 만들자

희묭 2023. 6. 15. 19:56

기본적인 개념을 설명하면서 Gremlin 문법은 사실상 거의 다 말씀드렸다고 생각합니다

좀더 있긴하지만 굳이 하나하나 설명할 필요성이 있다고 생각하지는 않고 궁금하시면 유투브의 튜토리얼이나 존경하는 Kelvin R. Lawrence의 가이드문서를 참고하시길 바랍니다.

 

자 그러면 그래프가 탐색에 용이한건 알겠는데

현실에 적용하기에는 문법이 부족해보일 수도 있습니다.

본격적으로 실무에 적용하면서 까다로웠던 문제들을 해결했던 가장 좋은 방법은 길을 새로 뚫는 것이였습니다.

g
.addV("user").property("no","A1").property("grade",4).as("A1")
.addV("user").property("no","A2").property("grade",3).as("A2").addE("sub").to("A1")
.addV("user").property("no","A3").property("grade",2).as("A3").addE("sub").to("A2")
.addV("user").property("no","A4").property("grade",1).as("A4").addE("sub").to("A3")
.addV("user").property("no","A5").property("grade",4).as("A5").addE("sub").to("A4")
.addV("user").property("no","A6").property("grade",3).as("A6").addE("sub").to("A5")
.addV("user").property("no","A7").property("grade",2).as("A7").addE("sub").to("A6")
.addV("user").property("no","A8").property("grade",1).as("A8").addE("sub").to("A7")
.addV("user").property("no","A9").property("grade",4).as("A9").addE("sub").to("A8")
.addV("user").property("no","A10").property("grade",3).as("A10").addE("sub").to("A9")
.addV("user").property("no","A11").property("grade",4).as("A11").addE("sub").to("A10")

위와 같은 꼬리를 물고있는 데이터가 있습니다.

찾고싶은 데이터는 A1을 물고있는 sub들을 타고 가면서 등급이 4인 Vertex들 중에서 두번째까지만 가져오고싶다는 조건이 있을 수 있습니다.

 

이런경우 Until 로 끊기에는 등급이 4 인 첫번째 Vertex가 문제가 됩니다.

아쉽게도 Gremlin 쿼리내에서는 순회하면서 변수를 저장하는 기능은 제공하지 않습니다. (되더라도 권장할만한 방법은 못된다고 생각합니다.)

해결을 위해서는 다양한 방법이 떠오를 수 있습니다.

 

가장 쉬운방법은 새로운 관계를 구축하는 것입니다.

g.V().has("grade",4).as("p").repeat(in()).until(has("grade",4)).addE("te").to("p")

grade가 4인 모든 Vertex끼리 첫번째로 만나는 동일 등급에 새로운 관계를 맺었습니다.

이런 관계를 맺어놓으면 우리는 너무나도 쉽게 A5, A9 를 찾을 수 있습니다

g.V().has("no","A1").repeat(in("te")).times(2).emit()