GRAND Stack 빠른 원형 제작 – 2부

GRAND Stack Express 원형: 2부


  • - 제품 소개, 기술 사양 및 그래픽 모델.

  • - Apollo Graphql 서버 및 neo4j Graphql js

  • -Apollo client and React
  • 이 시리즈에서 저희 제품tech spec의 도형을 소개하고 GRAND stack을 사용하여 빠른 원형 제작을 고려해야 하는 이유를 토론했습니다.이 부분에서,apollo 서버와neo4jgraphqljs를 사용하여graphql 서버를 신속하게 구축하는 방법을 보여 드리겠습니다.본고는graphql 서버 설정에 대해 어느 정도 알고 있다고 가정합니다.

    neo4j Graphql js가 있는 Graphql 서버


    neo4jgraphqljs의 주요 장점은 자신의graphql해상도를 작성하여cypher에 조회를 의뢰하는 것이다.그것은neo4j를 업무 논리의 작업마로 만들었다.또한 페이지 나누기, 필터링, 무서운 N+1 쿼리 문제도 담당합니다.패턴의 유형 정의를 예로 들자.그래픽 QL:
    type User {
      userId: ID!
      name: String
      email: String!
      matchCandidates: [UserWithScore!]!
        @cypher(
          statement: """
          MATCH (this)-[:PREFERS]->()<-[:PREFERS]-(candidate:User)
          WHERE NOT EXISTS((this)-[:LIKES|:DISLIKES]->(candidate))
          WITH candidate, COUNT(*) AS score ORDER BY score DESC
          RETURN {userId:candidate.userId, score:score}
          """
        )
      matchedWith: [Match!]! @relation(name: "MATCHED", direction: "OUT")
    }
    
    type Match {
      matchId: ID!
      date: Date!
      createdAt: Date!
      users: [User!]! @relation(name: "MATCHED", direction: "IN")
      tracks: [Track!]! @relation(name: "HAS", direction: "OUT")
    }
    
    type Mutation @isAuthenticated {
      like(from: ID!, to: ID!): LikeResult
        @neo4j_ignore
        @cypher(
          statement: """
          MATCH (n:User {userId:$from}),(o:User {userId:$to} )
          OPTIONAL MATCH (n)<-[r:LIKES]-(o)
          MERGE (n)-[:LIKES]->(o)
          WITH n,o,r
          CALL apoc.do.when(r IS NOT NULL,
          'MERGE (n)-[:MATCHED]->(m:Match { matchId:apoc.create.uuid(),createdAt:datetime()})<-[:MATCHED]-(o) RETURN {matchId:m.matchId, matched:true, email:o.email} as result',
          'RETURN {matched:false} as result',
          {n:n, o:o}
          ) YIELD value
          RETURN value.result
          """
        )
      addTrack(userId: ID!, matchId: ID!, type: String!, desc: String!): Track!
        @cypher(
          statement: """
          MATCH (n:User {userId:$userId}), (m:Match {matchId:$matchId})
          MERGE (n)-[:ADDED]->(t:Track {trackId:apoc.create.uuid(), type:$type,description:$desc, matchId:m.matchId, createdAt:datetime()})
          MERGE (m)-[:HAS]->(t)
          return t
          """
        )
    }
    
    Neo4j graphql js에는 다음과 같은 코드를 허용하는 유용한 graphql 모드 명령이 포함되어 있습니다.

  • typedef에서neo4j 조회를 직접 작성합니다.
  • @relation은 도형 관계를 사용하여 필드를 지정합니다.
  • @neo4j_ 사용자 정의 해상도를 지정하기 위해 무시합니다.
  • @ 인증 기능을 제공하기 위해 인증이 통과되었습니다.
  • 우리 아폴로 서버:
    const resolvers = {
      Mutation: {
        like: async (obj, args, context, info) => {
          const result = await neo4jgraphql(obj, args, context, info);
          if (result.email) {
            sendEmail(result.email);
          }
          return result;
        },
      },
    };
    const server = new ApolloServer({
      schema: makeAugmentedSchema({
        typeDefs,
        resolvers,
        config: {
          auth: { isAuthenticated: true },
        },
      }),
      context: ({ req }) => ({
        req,
        driver,
      }),
    });
    
    위의 두 코드 블록에서 우리는 실제적으로 90%의api 서버를 지정했다.이전 부분에서 우리는 유형 User의 matchCandidates 필드를 토론했다.이제 유사한 돌연변이를 한 줄 한 줄 검사합시다.먼저 @neo4j_ignore를 보았습니다. 두 번째 코드 블록에 사용자 정의 해상도를 지정하여 도형과 직접적으로 관련이 없는 논리를 추가합니다. (이 예에서 전자메일을 보냅니다.)다음은cypher 조회입니다.한 줄씩
  • id에 따라 두 사용자를 찾습니다. 저와 제가 좋아하는 사용자입니다.
  • 다른 사용자가 나를 좋아하는지 확인한다.
  • 나와 다른 사용자 사이에 비슷한 관계를 만듭니다.
  • 상기 줄에 지정된 변수, me, 기타 사용자 및 잠재적인 me를 수집합니다.
  • Apoc 프로그램은 몇 가지 분기를 진행합니다.
  • Apoc은 많은 유용한 프로그램과 알고리즘을 포함하는 라이브러리로 우리의 도형 개발자들이 더욱 잘 체험할 수 있다.
  • 저희 과정에서 다른 사용자들이 저희를 좋아하는지 확인해 보겠습니다. 만약에 저희를 좋아한다면 저희는 일치하는 것을 만들고 그 결과에 이메일을 제공하여 다른 사용자들에게 일치하는 것을 알립니다.그렇지 않으면false로 돌아갑니다.
  • 모든 번거로운 작업은makeAugmentedSchema에서 이루어지며, 자동으로 조회, 돌연변이, 필터, 페이지 나누기를 생성합니다.Here는makeAugmentedSchema가 N+1 조회 문제를 어떻게 피하는지에 관한 우수한 문장입니다.기본적으로, 이것은 ResolveInfo 대상에서 지정한 그림 구조를 훑어보고, 각 필드의 조회를 이 유형의 조회의 하위 조회로 조합합니다.

    배달


    GRAND stack의 관건적인 특성은 그림으로 업무 수요를 모델링하는 것을 완성하면 성명성cypher 조회 언어로 유형 정의를 써서 업무 논리층을 설정할 수 있다는 것이다. 그림은 각종 복잡한 수요에 자연스럽게 적응하기 때문이다.
    그걸 더 잘 설명하기 위해서만약에 우리가 삼자 일치 요구를 추가하고 싶다면, 만약에 Alice가 Bob과 Claire와 서로 비슷한 점이 있고 Bob과 Claire 사이에 서로 비슷한 점이 있다면 삼자 일치 카드를 만듭니다.이것이 바로 백엔드가 이 요구를 충족시키는 어려움의 정도입니다.
    type User{
      ...
      threeWayMatches:[[User!]]!
        @cypher(statement:"""
        MATCH (u1:User)-[:MATCHED*2]-(this)-[:MATCHED*2]-(u3:User)
        WHERE EXISTS((u1)-[:MATCHED*2]-(u3))
        RETURN u1,u3
        """)
    }
    
    짧은 세 줄의 문자에서 우리는 심상치 않은 요구를 만족시켰다. 이것은 우리로 하여금 다음과 같은 제품 구호의 합리성을 증명하게 했다. "모든 해리에게 우리는 헤민과 론을 찾는 데 도움을 줄 것이다."

    우리의 도형

    neo4j를 사용하여graphql 서버를 설정하는 효율이 매우 높습니다.화살표 도구를 만지작거리고 도표를 그린 후, 나는 2시간 안에 matchandhack.com 사용할 수 있는 서버를 찾았다.에서 우리는 apollo 클라이언트가 어떻게 전단의 데이터 관리를 간소화하고 우리가 LAMP 창고의 생산력 수준에 더욱 가깝게 하는지 보게 될 것이다.

    좋은 웹페이지 즐겨찾기