GraphQL에서 "에지"와 "노드"의 의미는 무엇입니까?


103

특정 GraphQL 엔드 포인트를 사용하고 있으며 깨끗한 JSON 구조를 쿼리로 제공하고 있지만 결과를 얻으면 "edges"및 "node"태그가 표시됩니다. 명백한 이점없이 내 데이터를 오염시키는 것처럼 보입니다. 왜 거기에 있고 더 빠르고 간단한 데이터 구문 분석을 위해 제거 할 수 있습니까?


1
연결, 에지 및 노드는 주로 GraphQL 클라이언트 인 Relay의 컨텍스트에서 사용되는 용어입니다. 자세한 내용은이 FAQ 에서 확인할 수 있습니다 .
marktani

2
명확히하기 위해 연결은 릴레이 전용이 아닙니다. 자세한 내용은 다음 문서를 참조하십시오. medium.com/p/explaining-graphql-connections-c48b7c3d6976
helfer

긴 결과 목록에 대해 페이징을 제공하는 다소 표준적인 방법입니다. 어떤 구현에도 연결되어 있지 않습니다.
Matt

답변:


64

간단한 단어로 짧은 소개부터 시작하겠습니다


GraphQl 릴레이 사양

  • 개체를 다시 가져 오는 메커니즘
  • 연결을 통해 페이징하는 방법에 대한 설명
  • 예측 가능하도록 돌연변이 주변의 구조

사이:

  • 연결은 edges, pageInfo... 와 같은 메타 데이터가있는 개체의 모음입니다 .
  • pageInfo이 포함 hasNextPage, hasPreviousPage, startCursor,endCursor

    • hasNextPage 사용 가능한 가장자리가 더 있는지 또는이 연결의 끝에 도달했는지 알려줍니다.
  • 레코드 배열 : 가장자리

    • Edge는 데이터 (노드)를 사용할 수있는 유연성을 제공합니다.
    • edge는 페이지 매김에 도움이 될 것입니다. graphql이 GraphQLList있지만 페이지 매김과 같은 기능은없고 객체 배열 (데이터)에만 해당됩니다.
  • 각 모서리에는

    • a node: 레코드 또는 데이터
    • a cursor: 페이지 매김으로 릴레이하는 데 도움이되는 base64 인코딩 문자열

https://facebook.github.io/relay/graphql/connections.htm

마디:

  • 릴레이를 사용하여 표시해야하는 노드 수를 설정할 수 있습니다. connectionArgs(first, last, after, before)

릴레이 페이지 매김은 다음과 같이 작동합니다.

  • 컬렉션의 모든 개체를 가져오고 first/lastconnectionArgs를 통해 사용되는 x 레코드를 기반으로 슬라이스를 반환 합니다.

  • after/before 노드의 커서를 사용하여 필요한 슬라이스 (데이터) 수를 GraphQL 서버에 표시하는 데 사용됩니다.

nodeDefinitions,, globalFieldId등 고려할 사항이 더 많이 있습니다 .nodeInterfaces

https://github.com/graphql/graphql-relay-js#object-identification


17
이 답변에는 요점이 맞다고 생각하지만 많은 오해가 있습니다. 이 문서에서는 꽤 잘 GraphQL 연결 뒤에 이유를 설명합니다 medium.com/p/explaining-graphql-connections-c48b7c3d6976
helfer

6
오해는 어디에서 찾을 수 있습니까? 간단한 정보 일뿐입니다. 오해를 발견하면 언제든지 개선하여 더 나아질 수 있습니다
p0k8_

graphql UI를 통해 이러한 구조로 작업 할 수 있습니까 ? 예를 들어 hasNextPage , 아니면 Relay with JS를 통해서만 사용할 수 있습니까?
Ska

예, graphql-relay를 사용하여 graphiql UI에서 작업 할 수 있습니다
p0k8_

아니 each node will have a cursor, 오히려 blog.apollographql.com/을each edge will have a cursor 참조하십시오.
wind
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.