회원정보와 추천인정보가 있습니다.
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를 빠르게 찾아 저장할 수 있습니다.
'개발 > GraphDatabase' 카테고리의 다른 글
6. 길이 없으면 길을 만들자 (0) | 2023.06.15 |
---|---|
(퀴즈1) 최고의 NBA 선수를 찾아서 (0) | 2023.06.15 |
5. 세상을 녹이는 TinkerPop (0) | 2023.06.13 |
4. Repeat 과 Emit (0) | 2023.06.12 |
(번외) Neptune 에서 Spring Data Neo4j 쓰는 법 (0) | 2023.06.11 |