Facebook 在graphql模式中,连接中有边和节点的原因是什么?

Facebook 在graphql模式中,连接中有边和节点的原因是什么?,facebook,graphql,relay,Facebook,Graphql,Relay,我试图理解实现 如果您查看下面我在 请注意,它有字段边和节点 为什么github的api中还有一个名为nodes的附加字段?既然可以从边上获得相同的数据,为什么他们不直接使用边字段呢?这只是为了方便吗 这对他们来说可能只是一种方便,因为他们可能有一些疯狂的查询,这减少了JavaScript中的对象查找。边还将包含一个游标属性以及一个节点属性,它们可能不需要在任何地方都使用该属性,因此具有顶级节点字段的另一个好处 我还应该注意到,边缘/光标约定非常适合于中继特定的环境,而且是一个基于光标的分页系统

我试图理解实现

如果您查看下面我在

请注意,它有字段节点


为什么github的api中还有一个名为nodes的附加字段?既然可以从边上获得相同的数据,为什么他们不直接使用边字段呢?这只是为了方便吗

这对他们来说可能只是一种方便,因为他们可能有一些疯狂的查询,这减少了JavaScript中的对象查找。边还将包含一个
游标
属性以及一个
节点
属性,它们可能不需要在任何地方都使用该属性,因此具有顶级
节点
字段的另一个好处

我还应该注意到,边缘/光标约定非常适合于中继特定的环境,而且是一个基于光标的分页系统,在这个系统中,您只能通过单个索引/页面进行移动。如果您希望创建一个更传统的分页系统,那么就不必实现这种类型的分页

如果客户端想要跳转到第5页,并且位于第1页,则会中断游标分页,这在中继中是不可能的,因为游标是不透明的,并且是当前所在集合中“where”的基础


希望有帮助

一个节点总是相同的,不管你如何到达它。边缘是连接上下文中该节点的元数据,通常只是光标,但如果连接表示搜索查询,则还可以添加相关度得分等内容。该数据不应该存在于节点本身,因为它在不同的上下文中没有意义

术语

  • 节点,表示一个实体。在由直线连接的圆图中,这些就是圆
  • 边缘,将两个节点连接在一起,可能包含元数据。在图中,这些是线
  • 连接,一个分页的节点列表。在图中,这将是一组行

  • 如果我们看一下公共连接实现的一般结构,您通常有以下几点: TypeA->TypeAtoTypeB连接(通常是TypeA上名为
    TypeB连接
    )的字段->TypeAToTypeBEdge(通常是名为
    边连接的名称字段)->TypeB(通常是名为
    节点
    边上的字段名)

    连接类型通常包含特定于整个连接的信息的字段,通常是分页信息、总计数等

    边缘类型通常有一些字段,这些字段包含特定于该连接但并非所有节点都通用的信息。在这种情况下,最常见的字段是
    cursor
    ,它表示连接中的节点“位置”,该位置不是全局唯一ID,而是返回连接中该位置的一种方式

    节点类型通常只是连接的类型,不包含特定于连接的信息

    在github的API中,边缘类型具有通常实现的
    游标
    字段,该字段可在以后的连接中用作引用。它们还有一个字段,在不需要游标的情况下绕过
    边缘
    类型。这就是为什么您可以直接从连接类型中看到
    节点
    字段的原因

    要查看这些光标字段,您可以发送以下查询以查看我所说的内容:

    {
      repository(owner: "getsmarter", name: "moodle-api") {
        issues(first:2 ) {
          edges {
            cursor
            node {
              id
            }
          }
        }
      }
    }
    
    有关此连接样式的更多详细信息,请参见此处:

    编辑-其他响应: 允许在连接处同时访问边缘类型和节点类型的目的至少有两个原因,我可以想到这两个原因。首先,为了方便那些在用例不需要游标时使用API的人。其次,可能存在这样的情况,根据发送的查询,它们甚至不需要生成游标。第二种可能是在CPU时间上的最小节省,并且可能会比它的价值更麻烦

    过去,我自己在GraphQL端点中实现了游标,一旦您了解了如何实现,它们的实际生成就不那么困难了。这仅仅是将几个关键信息序列化的问题。同样值得注意的是,一旦您已经创建了边缘类型,就可以同时提供(
    A->conn->edge->B
    A->conn->B
    )了


    由于我不为Github工作,我无法告诉您确切的意图。然而,我最肯定的是,这是第一个原因……仅仅是开发人员的便利。

    这可能会对一些背景信息有所帮助:谢谢你的详细回答,但这实际上并没有回答这个问题。我想知道为什么节点包含在与边相同的级别。特别是Github的api。这只是一种方便吗?我已经阅读了规范,并且理解了边缘有一个游标和一个节点,但是为什么在GithubAPI上有一个与边缘相同级别的节点集合呢?我倾向于@griffith_joel的回答,我认为“它们还有一个字段,在您不需要游标的情况下绕过了边类型。这就是为什么您可以直接从连接类型中看到边和节点字段。”这就足够了,如果不清楚,我道歉。我编辑了我的答案,以提供我希望为清晰起见扩展的内容。
    A -> connection -> edges -> B
    
    {
      repository(owner: "getsmarter", name: "moodle-api") {
        issues(first:2 ) {
          edges {
            cursor
            node {
              id
            }
          }
        }
      }
    }