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
}
}
}
}
}