Graph db design в схему GraphQL

Я пытаюсь создать схему graphql из имеющейся у меня схемы db графика. Но я не понимаю, как добавить свойства в схему 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) }
  }})
});

Но я не вижу возможности добавить свойство «с» в поле друзей. И я ничего не нахожу ни в документации, ни в Интернете.

Есть ли что-то в спецификации или мне нужно создать новые типы для всех ребер на основе узлов, добавляющих дополнительные свойства, такие как «с», и их использования. Или что-то еще, чего я просто не могу понять?


person Aleksandrenko    schedule 30.03.2016    source источник


Ответы (1)


Схемы примеров приложений ретрансляции, в данном конкретном случае очень полезен. 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),
},
person Ahmad Ferdous    schedule 08.04.2016