如何理解 GraphQL 中的空边和节点

Posted

技术标签:

【中文标题】如何理解 GraphQL 中的空边和节点【英文标题】:How to understand null edges and nodes in GraphQL 【发布时间】:2020-01-14 00:48:35 【问题描述】:

GraphQL 中关系的良好实践是使用带有 edgenode 元素的 connection 模型。还建议 edgenode 都可以为空。这就是例如我使用的 graphene-sqlalchemy 将映射 SQL 关系。

我的问题是:为什么?就我从 SQL 数据库中提供关系数据的 API 而言,我看不到任何边缘或节点将是 null 的情况。因此,如果我在前端使用静态类型语言(如 Typescript 或 Elm),我会发现自己正在编写一个样板来处理永远不会发生的情况。

在抽象数据模型方面我应该如何理解这些nulls? “没有任何联系”对我来说可以翻译为没有边缘的联系。为什么我需要null 边缘? null 节点更困扰我“有连接,但另一端什么都没有”?请在这里向我解释原因。

【问题讨论】:

【参考方案1】:

使用连接将您的架构与Relay specification 对齐——在不使用 Relay 时这是否是一种好的做法值得商榷。

在 Relay 中,边和节点可以为空,因为这是规范隐含指定的。

造成这种情况的实际原因是 GraphQL 错误 work 的方式。当解析字段时遇到执行错误时,该字段将解析为 null。但是,如果该字段也是非空的,它不能实际上解析为空,因此 GraphQL 将使整个父字段改为空。如果父字段也是非空的,那么它将使 its 的父字段为空...等等。 GraphQL 错误会以这种方式“冒泡”,直到遇到可空字段或到达 data 根字段(始终可为空)。

换句话说,通过使字段和边可以为空,我们允许节点在解析时出错,同时仍然返回有关边本身的信息,更重要的是,仍然返回所有其他边。如果节点和边都不为空,则单个节点内的错误将导致edges 字段本身解析为空。通过使这些字段可以为空,我们有效地支持 GraphQL 即使在执行过程中遇到错误也能返回部分响应。

【讨论】:

以上是关于如何理解 GraphQL 中的空边和节点的主要内容,如果未能解决你的问题,请参考以下文章

networkx绘制拓扑图节点的边和权,Python

GatsbyJs - 如何处理来自 Contentful 插件的空 graphql 节点

创建确定的边和节点的图形

GraphQL 浅谈,从理解 Graph 开始

DGL的图数据结构的创建图的特征dgl.batch及一些理解

SQL Server Graph:如何识别子图?