슬래시 그래픽 QL을 사용하여 Amazon과 유사한 권장 엔진 구축

[TL; DR; Dgraph의 Slash GraphQL 제품을 사용하고 Spring Boot 응용 프로그램에 연결하면 이 응용 프로그램은 간단한 RESTful Amazon식 추천 서비스로 사용됩니다.]
일찍이 21세기 초에 나는 한 프로젝트에 종사했다. 이 프로젝트는 Art Technology Group (ATG) 에서 전자상거래 해결 방안을 실시했고 이 회사는 현재 갑골문 소유이다.ATG Dynamo 제품은 지구층과 하나 scenarios module를 포함하기 때문에 인상적인 해결 방안이다.당시 Target과 백사매 등은 Dynamo 솔루션을 사용하고 장면 모듈을 이용하여 고객에게 건의를 제공했다.
예를 들어 Dynamo 전자상거래 솔루션은 고객이 언제 제품을 카트에 추가했는지 기억하고 삭제할 수 있는 지능적이다.일종의 격려로서 장면 서버는 미래의 방문에서 같은 고객에게 적당한 할인을 제공하도록 설계할 수 있다. 만약에 그들이 제품을 쇼핑카트에 다시 추가하고 다음 24시간 내에 구매한다면.
그때부터 나는 간단한 추천 엔진을 만들고 싶었다. 이것이 내 출판물의 목표였다.

추천 예 정보


나는 간단함을 유지하고 엔진을 추천하기 위해 기본적인 도메인 대상을 만들고 싶다.이 예에서 해결 방안은 음악 예술가에게 조언을 제공할 것이며, 밑바닥 예술가 대상은 매우 간단하다.
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Artist {
   private String name;
}
실제 시스템에서는 추적해야 할 속성이 매우 많다.그러나 이 예에서 예술가의 이름은 충분하다.
사람들이 기대하는 바와 같이 고객은 예술가에 대해 1~5의 평가를 할 것이다. 그 중에서 5는 가능한 가장 좋은 점수를 나타낸다.물론 고객은 모든 예술가에게 점수를 매기지 않을 수도 있다.고객은 매우 간단한 고객 객체에 의해 다음을 나타냅니다.
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Customer {
   private String username;
}
다음 평가 객체에서 예술가 평가에 대한 고객의 개념이 포착됩니다.
@AllArgsConstructor
@NoArgsConstructor
@Data
public class Rating {
   private String id;
   private double score;
   private Customer by;
   private Artist about;
}
정상적인 자바 프로그래밍 과정에서 저는 제 대상에 대해 개인 고객인 Customer와 개인 예술가 Artist를 사용할 수 있지만 도형 데이터베이스에서 사용하는 모델을 따르고 싶습니다. 거기에서 저는 byabout 같은 변수를 사용했습니다.문장이 계속되면 이 점은 더욱 분명해질 것이다.

Dgraph 슬래시 그래픽 QL


도형 데이터베이스가 보급됨에 따라 추천 엔진을 만드는 탐색은 도형 데이터베이스를 사용해야 한다고 생각합니다.GraphQL은 이미 서비스와 도형을 이야기하는 유행어가 되었기 때문이다.비록 나는 도형 데이터베이스에 대해 약간의 이해만 할 뿐이지만 나의 분석은 도형 데이터베이스는 이 프로젝트의 정확한 선택이고 보통 현실 세계에서 건의된 서비스를 제공하는 원천이라는 결론을 얻은 것 같다.데이터(노드) 간의 관계(테두리)가 데이터 자체와 마찬가지로 중요할 때 도형 데이터베이스는 좋은 해결 방안이고 추천 엔진은 완벽한 예이다.
그러나 그래픽 데이터베이스를 사용하기 시작했기 때문에 로컬 용기를 시작하거나 GraphQL 데이터베이스를 실행하는 것을 걱정하고 싶지 않습니다.반대로 SaaS 공급업체를 찾고 싶습니다.Dgraph의 완전 관리 백엔드 서비스를 사용하기로 결정했습니다 Slash GraphQL.이것은 관리되는 로컬 GraphQL 솔루션입니다.Slash GraphQL 서비스는 2020년 9월 10일에 출시되었으며 아래 링크를 통해 사용할 수 있습니다.이 플랫폼은 본고에 적용되는 무료 평가판 (그리고 최대 5GB의 데이터에 대해 월 9.99달러의 고정 비용을 받는다) 을 제공한다.
https://slash.dgraph.io/
이 URL을 시작하면 정상적인 인증 서비스를 사용하여 새 계정을 만들 수 있습니다.

내 예시에서 나는'spring boot demo'라는 백엔드를 만들었고 최종적으로 다음과 같은 대시보드를 만들었다.

Slash GraphQL 서비스를 쉽게 구성할 수 있도록 빠르고 무료로 시작합니다.

슬래시 그래픽 QL 구성


모든 데이터베이스 솔루션과 마찬가지로, 우리는 모델을 작성하여 데이터베이스에 배치해야 한다.Slash GraphQL을 사용하면 빠르고 간단한 프로세스가 가능합니다.
type Artist {
   name: String! @id @search(by: [hash, regexp])
   ratings: [Rating] @hasInverse(field: about)
}

type Customer {
   username: String! @id @search(by: [hash, regexp])
   ratings: [Rating] @hasInverse(field: by)
}

type Rating {
   id: ID!
   about: Artist!
   by: Customer!
   score: Int @search
}
사실상, 나의 최초의 디자인은 그것이 필요로 하는 것보다 훨씬 복잡하고, 수정의 배후 노력 정도는 내가 예상한 것보다 훨씬 쉽다.나는 개발자로서 힘들이지 않고 모델을 수정할 수 있는 것이 가치가 있다는 것을 금방 깨닫기 시작했다.
이 모델을 통해 저는 기본적인 예술가 정보를 신속하게 채울 수 있습니다.
mutation {
 addArtist(input: [
   {name: "Eric Johnson"},
   {name: "Genesis"},
   {name: "Led Zeppelin"},
   {name: "Rush"},
   {name: "Triumph"},
   {name: "Van Halen"},
   {name: "Yes"}]) {
   artist {
     name
   }
 }
}
그리고 저는 허구적인 고객 기록을 추가했습니다.
mutation {
 addCustomer(input: [
   {username: "Doug"},
   {username: "Jeff"},
   {username: "John"},
   {username: "Russell"},
   {username: "Stacy"}]) {
   customer {
     username
   }
 }
}
따라서 이 다섯 명의 고객은 다음 표를 사용하여 이 일곱 명의 예술가에게 등급을 매길 것이다.

평가 프로세스의 예는 다음과 같습니다.
mutation {
 addRating(input: [{
   by: {username: "Jeff"},
   about: { name: "Triumph"},
   score: 4}])
 {
   rating {
     score
     by { username }
     about { name }
   }
 }
}
슬래시 그래픽 QL 데이터를 구성하고 실행하면 디바이스를 전환하고 Spring 부트 서비스를 사용할 수 있습니다.

사율 1 평점 알고리즘


2005년에 Daniel Lemire와 Anna Maclachian의 a research paper는 Slope One 시리즈의 협동 필터링 알고리즘을 소개했다.이런 간단한 프로젝트 기반의 협동 필터 형식은 추천 서비스에 매우 적합해 보인다. 왜냐하면 다른 고객의 평가를 고려하여 고객에게 점수를 주지 않은 항목에 대해 점수를 매기기 때문이다.
위조 코드에서 추천 서비스는 다음과 같은 목표를 실현합니다.
  • 모든 예술가(모든 고객)의 가용 평가 검색
  • 데이터에서 지도를 만드는데 이것은 고객 지도로 모든 예술가와 그 등급을 포함한다
  • 1에서 5 사이의 평점은 0.2(최저 평점 1)에서 1.0(최고 평점 5) 사이의 간단한 범위로 변환됩니다.
  • 고객 맵을 작성하면 Slope One 평가 프로세스의 핵심은 SlopeOne 클래스를 호출하여 수행됩니다.
  • >을 채워 서로 다른 고객 간의 등급 차이를 추적하는 데 사용
  • 유사한 등급 평가 빈도를 추적하는 Map
  • 기존 지도를 사용하여 지도를 만드는데 고객에게 평점을 주지 않은 항목의 예상 평점
  • 을 포함한다
    이 예에서 무작위 고객을 선택하고 맵>projectedData Map의 상응하는 대상을 분석하여 다음 결과를 되돌려줍니다.
    {
       "matchedCustomer": {
           "username": "Russell"
       },
       "recommendationsMap": {
           "Artist(name=Eric Johnson)": 0.7765842245950264,
           "Artist(name=Yes)": 0.7661904474477843,
           "Artist(name=Triumph)": 0.7518039724158979,
           "Artist(name=Van Halen)": 0.7635436007978691
       },
       "ratingsMap": {
           "Artist(name=Genesis)": 0.4,
           "Artist(name=Led Zeppelin)": 1.0,
           "Artist(name=Rush)": 0.6
       },
       "resultsMap": {
           "Artist(name=Eric Johnson)": 0.7765842245950264,
           "Artist(name=Genesis)": 0.4,
           "Artist(name=Yes)": 0.7661904474477843,
           "Artist(name=Led Zeppelin)": 1.0,
           "Artist(name=Rush)": 0.6,
           "Artist(name=Triumph)": 0.7518039724158979,
           "Artist(name=Van Halen)": 0.7635436007978691
       }
    }
    
    위의 예제에서는 랜덤으로 Russell 사용자를 선택합니다.원시표(위 사진)를 볼 때 로소는'창세기', 베를린 비행선, 라시의 시청률만 제공했다.그가 진정으로 존경하는 유일한 예술가는 제베를린 비행선이다.이 정보는 ratingsMap 대상과resultsMap 대상에 포함되어 있습니다.
    resultsMap 대상은 다른 네 명의 예술가들의 예상 평점인 엘릭 존슨, Yes, 다이안핀, 범 헬렌을 포함한다.일을 더욱 간단하게 하기 위해 유효 부하에는 로소의 등급을 받지 않은 예술가만 포함하는 추천지도 (recommendations Map) 가 포함되어 있다.
    다른 평론에 따르면 추천 서비스는 엘릭 존슨을 약간 선호한다. 다른 네 항목이 아니라 0.78점으로 5점제 중 4점이다.

    추천 서비스


    추천 서비스를 사용하기 위해서는 Spring 부트 서버를 실행하고 Slash GraphQL 기반 클라우드에 연결하는 실례로 설정하면 됩니다.응용 프로그램에서 사선 GraphQL 대시보드의 GraphQL 끝점을 지정할 수 있습니다.yml은 slash-graph-ql.hostname 또는 ${slash\u graph\u ql\u hostname} 환경 변수를 통해 값을 전달합니다.
    다음 RESTful URI를 사용하여 기본 권장 엔진을 호출할 수 있습니다.
    {spring boot 서비스 호스트 이름 가져오기}/recommend
    이 작업은 다음과 같이 RecommendationsController에 의해 구성됩니다.
    @GetMapping(value = "/recommend")
    public ResponseEntity<Recommendation> recommend() {
       try {
           return new ResponseEntity<>(recommendationService.recommend(), HttpStatus.OK);
       } catch (Exception e) {
           return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
       }
    }
    
    이를 권장 서비스(RecommendationService)라고 합니다.
    @Slf4j
    @RequiredArgsConstructor
    @Service
    public class RecommendationService {
       private final ArtistService artistService;
       private final CustomerService customerService;
       private final SlashGraphQlProperties slashGraphQlProperties;
    
       private static final String RATING_QUERY = "query RatingQuery { queryRating { id, score, by { username }, about { name } } }";
    
       public Recommendation recommend() throws Exception {
           ResponseEntity<String> responseEntity = RestTemplateUtils.query(slashGraphQlProperties.getHostname(), RATING_QUERY);
          try {
               ObjectMapper objectMapper = new ObjectMapper();
               SlashGraphQlResultRating slashGraphQlResult = objectMapper.readValue(responseEntity.getBody(), SlashGraphQlResultRating.class);
               log.debug("slashGraphQlResult={}", slashGraphQlResult);
               return makeRecommendation(slashGraphQlResult.getData());
           } catch (JsonProcessingException e) {
               throw new Exception("An error was encountered processing responseEntity=" + responseEntity.getBody(), e);
           }
       }
    ...
    }
    
    이 코드를 빠르게 훑어보면 추천을 실행할 수 있는 능력과 용이성을 보여줄 수 있는 하위 그림이 빠질 수 있으니 주의하십시오.위의 예에서 slashGraphQlResult.getData()선은 makeRecommendation() 방법에 하위 그림을 제공했다.
    RATING_질의는 평가 객체를 읽어들이는 데 필요한 슬래시 그래픽 QL 형식입니다.RestTemplateUtils.query () 메서드는 정적 유틸리티 클래스의 일부로 건조함을 유지하는 데 사용됩니다. (중복하지 마십시오):
    public final class RestTemplateUtils {
       private RestTemplateUtils() { }
       private static final String MEDIA_TYPE_GRAPH_QL = "application/graphql";
       private static final String GRAPH_QL_URI = "/graphql";
    
       public static ResponseEntity<String> query(String hostname, String query) {
           RestTemplate restTemplate = new RestTemplate();
           HttpHeaders headers = new HttpHeaders();
           headers.setContentType(MediaType.valueOf(MEDIA_TYPE_GRAPH_QL));
           HttpEntity<String> httpEntity = new HttpEntity<>(query, headers);
           return restTemplate.exchange(hostname + GRAPH_QL_URI, HttpMethod.POST, httpEntity, String.class);
       }
    }
    
    slashGraphQlResult 대상을 검색하면 makeRecommension () 개인 방법을 호출합니다. 이 방법은 다음 추천 대상을 되돌려줍니다.(위는 JSON 형식으로 표시됨):
    @AllArgsConstructor
    @NoArgsConstructor
    @Data
    public class Recommendation {
       private Customer matchedCustomer;
       private HashMap<Artist, Double> recommendationsMap;
       private HashMap<Artist, Double> ratingsMap;
       private HashMap<Artist, Double> resultsMap;
    }
    

    결론


    본고에서 새로운 모델로 Dgraph-Slash-GraphQL의 실례를 만들고 예시 데이터를 불러왔습니다.그런 다음 이 데이터는 기본 권장 엔진의 Spring 부트 서비스로 사용됩니다.전체 소스 코드에 관심이 있는 사용자는 다음을 참조하십시오.
    비용 측면에서 볼 때 Slash GraphQL이 제공한 구조가 인상적입니다.새 계좌 화면에 내가 매달 10000개의 신용카드를 무료로 사용할 수 있다고 나와 있다.저는 Slash GraphQL을 사용하여 본고의 원형과 모든 내용을 만드는 과정에서 292학점만 사용했습니다.10000학점이 넘는 학생은 45달러(USD)에 100000학점, 99달러(USD)에 250000학점을 받을 수 있다.
    처음으로 도형 데이터베이스를 사용한 것은 확실히 작은 학습 곡선을 보여 주었다. 나는 이 연습을 계속함으로써 내가 이것만 배울 수 있다고 확신한다.내가 자신의 수요에 대해 더 많이 알게 됨에 따라 나는 Slash GraphQL이 나의 기대를 뛰어넘어 모델을 변경할 수 있다고 생각한다.기능 개발자로서 이것은 반드시 인식해야 할 매우 중요한 부분이다. 특히 전통적인 데이터베이스를 사용하는 같은 장면과 비교된다.
    다음 글은 이 과정에서 Angular (또는React) 클라이언트를 도입하여 Spring Boot에서 실행되는 GraphQL과 추천 서비스와 직접 연결할 것입니다.
    존 비스터의 허가로 출판

    좋은 웹페이지 즐겨찾기