graphQL и графен: как извлечь информацию из запроса graphQL с помощью графена? - PullRequest
0 голосов
/ 14 апреля 2020

Я хочу извлечь строку 'Уникальные цепочки белков: 1' из этой записи, используя запрос graphQL.

Я знаю, что это запрос, который я хочу использовать:

{
  entry(entry_id: "5O6C") {
    rcsb_entry_info {
      polymer_entity_count_protein
    }
  }
}

и я могу видеть вывод, если я использую интерфейс graphQL здесь :

{
  "data": {
    "entry": {
      "rcsb_entry_info": {
        "polymer_entity_count_protein": 1
      }
    }
  }
}

Имеет информацию, которую я хочу: "Polymer_entity_count_protein": 1

Я хочу выполнить этот запрос через python, чтобы он мог быть передан в другие конвейеры (а также обработать несколько идентификаторов).

Я обнаружил, что графен - это одна библиотека, которая будет выполнять запросы GraphQL, и это Вот пример Hello World, который я могу получить на своей машине:

import graphene

class Query(graphene.ObjectType):
    hello = graphene.String(name=graphene.String(default_value="world"))

    def resolve_hello(self, info, name):
        return name

schema = graphene.Schema(query=Query)
result = schema.execute('{ hello }')
print(result.data['hello']) # "Hello World"

Я не понимаю, как их объединить. Может кто-нибудь показать мне, как я редактирую свой код python с интересующим запросом, так что в конце напечатано:

'506C  1'

Я видел несколько других примеров / запросов о графене / graphQL: например, здесь ; за исключением того, что я не могу понять, как заставить мой конкретный c пример работать.

Основываясь на ответе ниже, я запустил:

графен импорта

class Query(graphene.ObjectType):
    # ResponseType needs to be the type of your response
    # the following line defines the return value of your query (ResponseType)  
    # and the inputType (graphene.String())
    entry = graphene.String(entry_id=graphene.String(default_value=''))

    def resolve_entry(self, info, **kwargs):
        id = kwargs.get('entry_id')
            # as you already have a working query you should enter the logic here   

schema = graphene.Schema(query=Query)
# not totally sure if the query needs to look like this, it also depends heavily on your response type
query = '{ entry(entry_id="506C"){rcsb_entry_info}'
result = schema.execute(query)
print("506C" + str(result.data.entry.rcsb_entry_info.polymer_entity_count_protein))

Однако, Я получаю:

Traceback (most recent call last):
  File "graphene_query_for_rcsb.py", line 18, in <module>
    print("506C" + str(result.data.entry.rcsb_entry_info.polymer_entity_count_protein))
AttributeError: 'NoneType' object has no attribute 'entry'

1 Ответ

0 голосов
/ 15 апреля 2020

Вы написали логи c уже рабочего запроса, который у вас есть в вашем вопросе? Разве он не использует python / graphene?

Я не уверен, правильно ли я понял вопрос, но вот общая идея:

import graphene


class Query(graphene.ObjectType):

    # ResponseType needs to be the type of your response
    # the following line defines the return value of your query (ResponseType)  
    # and the inputType (graphene.String())
    entry = graphene.Field(ResponseType, entry_id=graphene.String()

    def resolve_entry(self, info, **kwargs):
        id = kwargs.get('entry_id')
        # as you already have a working query you should enter the logic here   

schema = graphene.Schema(query=Query)
# not totally sure if the query needs to look like this, it also depends heavily on your response type
query = '{ entry(entry_id="506C"){rcsb_entry_info}}'
result = schema.execute(query)
print("506C" + str(result.data.entry.rcsb_entry_info.polymer_entity_count_protein)

Вот пример для типа ответа: если вы запрос

 # here TeamType is my ResponseType
get_team = graphene.Field(TeamType, id=graphene.Int())

    def resolve_get_team(self, info, **kwargs):
        id = kwargs.get('id')

        if id is not None:
             return Team.objects.get(pk=id)

        else:
            raise Exception();

тип responseType определен как:

class TeamType(DjangoObjectType):
    class Meta:
        model = Team

, но вы также можете определить тип ответа, который не основан на модели:

class DeleteResponse(graphene.ObjectType):
    numberOfDeletedObject = graphene.Int(required=True)
    numberOfDeletedTeams = graphene.Int(required=False)

И ваш тип ответа должен выглядеть примерно так: это:

class myResponse(graphene.ObjectType):
    rcsb_entry_info = graphne.Field(Polymer)


class Polymer(graphene.ObjectType):
    polymer_entity_count_protein = graphene.Int()

опять же, это не тест или что-то в этом роде, и я действительно не знаю, каков ваш ответ на самом деле.

...