我试图从我拥有的图形数据库模式创建graphql模式。但我不知道如何在graphql架构中为我的边缘添加属性。
在某些代码中:
示例数据库架构:
node: {
label: 'Person',
properties: [
id: { type: id }
name: { type: string }
]
}
edge: {
label: 'friends'
startNode: 'Person',
endNode: 'Person'
properties: {
since: { type: date }
}
}
在graphql架构中看起来应该很简单:
var personType = new graphql.GraphQLObjectType({
name: 'personType',
fields: function() { return {
id: { type: graphql.GraphQLString },
name: { type: graphql.GraphQLString },
friends: { type: graphql.GraphQLList(personType) }
}})
});
但我认为没有办法添加属性'因为'到朋友们的领域。我在文档或互联网上没有找到任何内容。
规范中是否存在某些内容,或者我需要根据节点添加其他属性(例如'并使用它们。 或者其他我无法理解的东西?
答案 0 :(得分:1)
在这种特殊情况下,示例中继应用程序的模式star-wars非常有用。 Faction
和Ship
在您的案例中扮演Person
和Friend
的角色。
你是对的。为了包含since
属性,可以为朋友引入一个新类型,如下所示(使用graphql npm包):
var friendType = new GraphQLObjectType({
name: 'Friend',
fields: {
id: globalIdField('Friend'),
name: {
type: GraphQLString,
resolve: (friend) => friend.name,
},
since: {
type: GraphQLString,
resolve: (friend) => friend.since.toString(),
},
},
interfaces: [nodeInterface],
});
在friendType
中,since
是实际日期的字符串表示形式。如果您想要日期的自定义GraphQL类型,可以查看graphql-custom-datetype。我没有用它。
在您已定义的personType
中,对于friends
字段,列表元素类型personType
需要替换为新的friendType
:
friends: { type: graphql.GraphQLList(friendType) }
如果朋友数量很大,建议使用连接或边缘,如ykad4所建议的那样。一旦我们有了Friend的定义,我们就可以按如下方式定义连接:
const {
connectionType: friendConnection,
edgeType: friendEdge,
} = connectionDefinitions({
name: 'Friend',
nodeType: friendType,
});
friends
中的字段personType
将更新如下(使用graphql-relay npm包中的辅助函数):
friends: {
type: friendConnection,
args: connectionArgs,
resolve: (person) => connectionFromArray(person.friends, args),
},