图形数据库设计到GraphQL模式

时间:2016-03-30 07:39:56

标签: javascript graph graphql graphql-js

我试图从我拥有的图形数据库模式创建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) }
  }})
});

但我认为没有办法添加属性'因为'到朋友们的领域。我在文档或互联网上没有找到任何内容。

规范中是否存在某些内容,或者我需要根据节点添加其他属性(例如'并使用它们。 或者其他我无法理解的东西?

1 个答案:

答案 0 :(得分:1)

在这种特殊情况下,示例中继应用程序的模式star-wars非常有用。 FactionShip在您的案例中扮演PersonFriend的角色。

你是对的。为了包含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),
},