개발/GraphDatabase

7. TinkerPop으로 좀더 빠르게

희묭 2023. 6. 22. 19:39

회원정보와 추천인정보가 있습니다.

g
.addV("user").property("no","A1").as("A1")
.addV("user").property("no","A2").property("recommend","A1").as("A2")
.addV("user").property("no","A3").property("recommend","A3").as("A3")
.addV("user").property("no","A4").property("recommend","A3").as("A4")
.addV("user").property("no","A5").property("recommend","A3").as("A5")
.addV("user").property("no","A6").property("recommend","A5").as("A6")
.addV("user").property("no","A7").property("recommend","A4").as("A7")
.addV("user").property("no","A8").property("recommend","A1").as("A8")
.addV("user").property("no","A9").property("recommend","A5").as("A9")

추천인 정보를 바탕으로 관계를 맺으려고합니다

가장 먼저 생각해볼만한 쿼리는 다음과 같습니다

g.V().has("user").as("p")
     .addE("recommend")
     .to(__.V().has("no", select("p").values("recommend"))).iterate();

좋습니다 단 3줄만에 관계가 완벽하게 입력됩니다.

하지만 말입니다, 이게 수천만건 이라면 어떨까요?

인덱싱을 지원해준다면 아무 문제없을 수도 있습니다.

하지만 인덱싱에 의존하지않고 빠르게 찾는 방법이 있습니다.

그건 바로 TinkerPop입니다.

Map<Long, Vertex> cashMap = new HashMap<>();

distributorEntityList.forEach(p->{
    var gt = g
            .addV("user")
            .property("no", p.getDistributorId())
            .property("recommend", p.getRecommendDistributorId())
            .next();

    cashMap.put(p.getDistributorId(), gt);
});

새로운정보를 Vertex 객체로 만든뒤 저장전에 cashMap으로 저장합니다.

 distributorEntityList.forEach(p->{
    if(p.getRecommendDistributorId()!=null && cashMap.get(p.getRecommendDistributorId())!=null){
        var vertexA = cashMap.get(p.getDistributorId());
        var vertexB = cashMap.get(p.getRecommendDistributorId());
        g.V(vertexA)
                .addE("recommend")
                .to(vertexB)
                .iterate();
    }
});

vertex를 빠르게 찾아 저장할 수 있습니다.