--- layout: default title: "Техническая спецификация запросов GraphQL" parent: "Russian (Beta)" --- # Техническая спецификация запросов GraphQL > **Beta Translation:** This document was translated via Machine Learning and as such may not be 100% accurate. All non-English languages are currently classified as Beta. ## Обзор Эта спецификация описывает реализацию интерфейса запросов GraphQL для хранения структурированных данных TrustGraph в Apache Cassandra. Основываясь на возможностях структурированных данных, описанных в спецификации structured-data.md, этот документ подробно описывает, как запросы GraphQL будут выполняться к таблицам Cassandra, содержащим извлеченные и импортированные структурированные объекты. Сервис запросов GraphQL предоставит гибкий и типобезопасный интерфейс для запроса структурированных данных, хранящихся в Cassandra. Он будет динамически адаптироваться к изменениям схемы, поддерживать сложные запросы, включая отношения между объектами, и беспрепятственно интегрироваться с существующей архитектурой TrustGraph, основанной на обмене сообщениями. ## Цели **Динамическая поддержка схемы**: Автоматическая адаптация к изменениям схемы в конфигурации без перезапуска сервиса. **Соответствие стандартам GraphQL**: Предоставление стандартного интерфейса GraphQL, совместимого с существующими инструментами и клиентами GraphQL. <<<<<<< HEAD **Эффективные запросы к Cassandra**: Преобразование запросов GraphQL в эффективные запросы CQL к Cassandra, учитывающие первичные ключи и индексы. **Разрешение отношений**: Поддержка решателей полей GraphQL для отношений между различными типами объектов. **Типобезопасность**: Обеспечение типобезопасного выполнения запросов и генерации ответов на основе определений схемы. **Масштабируемая производительность**: Эффективная обработка одновременных запросов с использованием правильного пула соединений и оптимизации запросов. **Интеграция запросов/ответов**: Поддержка существующей архитектуры TrustGraph, основанной на шаблоне запросов/ответов с использованием Pulsar. ======= **Эффективные запросы к Cassandra**: Преобразование запросов GraphQL в эффективные запросы CQL для Cassandra, учитывающие первичные ключи и индексы. **Разрешение отношений**: Поддержка решателей полей GraphQL для отношений между различными типами объектов. **Типобезопасность**: Обеспечение типобезопасного выполнения запросов и генерации ответов на основе определений схемы. **Масштабируемая производительность**: Эффективная обработка одновременных запросов с использованием правильного пула соединений и оптимизации запросов. **Интеграция запросов/ответов**: Поддержка существующего шаблона запросов/ответов TrustGraph, основанного на Pulsar. >>>>>>> 82edf2d (New md files from RunPod) **Обработка ошибок**: Предоставление подробной отчетности об ошибках для несоответствий схемы, ошибок запросов и проблем проверки данных. ## Предыстория <<<<<<< HEAD Реализация хранения структурированных данных (trustgraph-flow/trustgraph/storage/objects/cassandra/) записывает объекты в таблицы Cassandra на основе определений схемы, хранящихся в системе конфигурации TrustGraph. Эти таблицы используют структуру составного первичного ключа с коллекциями и первичными ключами, определенными схемой, что обеспечивает эффективные запросы внутри коллекций. ======= Реализация хранения структурированных данных (trustgraph-flow/trustgraph/storage/objects/cassandra/) записывает объекты в таблицы Cassandra на основе определений схемы, хранящихся в системе конфигурации TrustGraph. Эти таблицы используют структуру составного первичного ключа с коллекциями и первичными ключами, определенными схемой, что обеспечивает эффективные запросы в пределах коллекций. >>>>>>> 82edf2d (New md files from RunPod) Текущие ограничения, которые эта спецификация решает: Отсутствие интерфейса запросов для структурированных данных, хранящихся в Cassandra. Невозможность использования мощных возможностей запросов GraphQL для структурированных данных. Отсутствие поддержки обхода отношений между связанными объектами. Отсутствие стандартизированного языка запросов для доступа к структурированным данным. Сервис запросов GraphQL устранит эти недостатки, предоставив: Стандартный интерфейс GraphQL для запросов к таблицам Cassandra. Динамическую генерацию схем GraphQL из конфигурации TrustGraph. Эффективное преобразование запросов GraphQL в CQL для Cassandra. Поддержку разрешения отношений с помощью решателей полей. ## Технический дизайн ### Архитектура Сервис запросов GraphQL будет реализован как новый обработчик потоков TrustGraph, следуя установленным шаблонам: <<<<<<< HEAD **Местоположение модуля**: `trustgraph-flow/trustgraph/query/objects/cassandra/` ======= **Расположение модуля**: `trustgraph-flow/trustgraph/query/objects/cassandra/` >>>>>>> 82edf2d (New md files from RunPod) **Основные компоненты**: 1. **Обработчик сервиса запросов GraphQL** Расширяет базовый класс FlowProcessor. Реализует шаблон запросов/ответов, аналогичный существующим сервисам запросов. Отслеживает конфигурацию на предмет обновлений схемы. Поддерживает синхронизацию схемы GraphQL с конфигурацией. 2. **Генератор динамической схемы** <<<<<<< HEAD Преобразует определения RowSchema TrustGraph в типы GraphQL. Создает типы объектов GraphQL с соответствующими определениями полей. Генерирует корневой тип запроса с решателями на основе коллекций. Обновляет схему GraphQL при изменении конфигурации. 3. **Исполнитель запросов** Анализирует входящие запросы GraphQL с использованием библиотеки Strawberry. ======= Преобразует определения схемы TrustGraph в типы GraphQL. Создает типы объектов GraphQL с правильными определениями полей. Генерирует корневой тип Query с решателями на основе коллекций. Обновляет схему GraphQL при изменении конфигурации. 3. **Исполнитель запросов** Разбирает входящие запросы GraphQL с использованием библиотеки Strawberry. >>>>>>> 82edf2d (New md files from RunPod) Проверяет запросы на соответствие текущей схеме. Выполняет запросы и возвращает структурированные ответы. Обрабатывает ошибки с подробными сообщениями об ошибках. 4. **Транслятор запросов Cassandra** Преобразует выборки GraphQL в запросы CQL. Оптимизирует запросы на основе доступных индексов и первичных ключей. Обрабатывает фильтрацию, пагинацию и сортировку. Управляет пулом соединений и жизненным циклом сессии. 5. **Разрешитель отношений** Реализует решатели полей для отношений между объектами. Выполняет эффективную пакетную загрузку для предотвращения запросов N+1. Кэширует разрешенные отношения в контексте запроса. Поддерживает как прямой, так и обратный обход отношений. ### Мониторинг схемы конфигурации Сервис зарегистрирует обработчик конфигурации для получения обновлений схемы: ```python self.register_config_handler(self.on_schema_config) ``` Когда схемы меняются: 1. Разбор новых определений схемы из конфигурации 2. Регенерация типов GraphQL и решателей 3. Обновление исполняемой схемы 4. Очистка любых кэшей, зависящих от схемы ### Генерация схемы GraphQL Для каждой RowSchema в конфигурации, генерируется: 1. **Тип объекта GraphQL**: Отображение типов полей (string → String, integer → Int, float → Float, boolean → Boolean) Отметка обязательных полей как non-nullable в GraphQL Добавление описаний полей из схемы 2. **Корневые поля запроса**: Запрос коллекции (например, `customers`, `transactions`) Аргументы фильтрации на основе индексированных полей Поддержка пагинации (limit, offset) Варианты сортировки для полей, поддерживающих сортировку 3. **Поля отношений**: Определение отношений внешнего ключа из схемы Создание решателей полей для связанных объектов Поддержка как одиночных объектов, так и списков отношений ### Поток выполнения запроса 1. **Прием запроса**: Получение ObjectsQueryRequest от Pulsar Извлечение строки запроса GraphQL и переменных Определение контекста пользователя и коллекции 2. **Валидация запроса**: Разбор запроса GraphQL с использованием Strawberry Проверка на соответствие текущей схеме Проверка выбранных полей и типов аргументов 3. **Генерация CQL**: Анализ выбранных элементов GraphQL <<<<<<< HEAD Создание запроса CQL с правильными предложениями WHERE ======= Построение запроса CQL с правильными предложениями WHERE >>>>>>> 82edf2d (New md files from RunPod) Включение коллекции в ключ партиции Применение фильтров на основе аргументов GraphQL 4. **Выполнение запроса**: Выполнение запроса CQL к Cassandra Отображение результатов в структуру ответа GraphQL Разрешение любых полей отношений Форматирование ответа в соответствии со спецификацией GraphQL 5. **Доставка ответа**: Создание ObjectsQueryResponse с результатами Включение любых ошибок выполнения Отправка ответа через Pulsar с идентификатором корреляции ### Модели данных > **Примечание**: Существует существующая схема StructuredQueryRequest/Response в `trustgraph-base/trustgraph/schema/services/structured_query.py`. Однако, в ней отсутствуют критические поля (user, collection) и используются неоптимальные типы. Схемы ниже представляют собой рекомендуемую эволюцию, которая должна либо заменить существующие схемы, либо быть создана как новые типы ObjectsQueryRequest/Response. #### Схема запроса (ObjectsQueryRequest) ```python from pulsar.schema import Record, String, Map, Array class ObjectsQueryRequest(Record): user = String() # Cassandra keyspace (follows pattern from TriplesQueryRequest) collection = String() # Data collection identifier (required for partition key) query = String() # GraphQL query string variables = Map(String()) # GraphQL variables (consider enhancing to support all JSON types) operation_name = String() # Operation to execute for multi-operation documents ``` **Обоснование изменений по сравнению с существующим запросом StructuredQueryRequest:** Добавлены поля `user` и `collection` для соответствия шаблону других сервисов запросов. Эти поля необходимы для идентификации пространства ключей и коллекции Cassandra. Переменные пока остаются Map(String()), но в идеале должны поддерживать все типы JSON. #### Схема ответа (ObjectsQueryResponse) ```python from pulsar.schema import Record, String, Array from ..core.primitives import Error class GraphQLError(Record): message = String() path = Array(String()) # Path to the field that caused the error extensions = Map(String()) # Additional error metadata class ObjectsQueryResponse(Record): error = Error() # System-level error (connection, timeout, etc.) data = String() # JSON-encoded GraphQL response data errors = Array(GraphQLError) # GraphQL field-level errors extensions = Map(String()) # Query metadata (execution time, etc.) ``` **Обоснование изменений по сравнению с существующим StructuredQueryResponse:** Различает системные ошибки (`error`) и ошибки GraphQL (`errors`) Использует структурированные объекты GraphQLError вместо массива строк Добавляет поле `extensions` для соответствия спецификации GraphQL Сохраняет данные в виде строки JSON для совместимости, хотя нативные типы были бы предпочтительнее ### Оптимизация запросов Cassandra Сервис будет оптимизировать запросы Cassandra следующим образом: 1. **Соблюдение ключей разделов (Partition Keys):** Всегда включайте коллекцию в запросы Эффективно используйте первичные ключи, определенные в схеме Избегайте полного сканирования таблицы 2. **Использование индексов:** Используйте вторичные индексы для фильтрации Объединяйте несколько фильтров, когда это возможно Предупреждайте, когда запросы могут быть неэффективными 3. **Пакетная загрузка:** Собирайте запросы для получения взаимосвязей Выполняйте их пакетами для уменьшения количества обращений Кэшируйте результаты в контексте запроса 4. **Управление соединениями:** Поддерживайте постоянные сессии Cassandra Используйте пули соединений Обрабатывайте повторное подключение в случае сбоев ### Примеры запросов GraphQL #### Простой запрос коллекции ```graphql { customers(status: "active") { customer_id name email registration_date } } ``` #### Запрос со связями ```graphql { orders(order_date_gt: "2024-01-01") { order_id total_amount customer { name email } items { product_name quantity price } } } ``` #### Разделенная на страницы выборка ```graphql { products(limit: 20, offset: 40) { product_id name price category } } ``` <<<<<<< HEAD ### Зависимости реализации ======= ### Реализация и зависимости >>>>>>> 82edf2d (New md files from RunPod) **Strawberry GraphQL**: Для определения схемы GraphQL и выполнения запросов. **Cassandra Driver**: Для подключения к базе данных (уже используется в модуле хранения). **TrustGraph Base**: Для FlowProcessor и определений схем. **Configuration System**: Для мониторинга и обновления схем. ### Интерфейс командной строки Сервис предоставит команду интерфейса командной строки: `kg-query-objects-graphql-cassandra` Аргументы: <<<<<<< HEAD `--cassandra-host`: Точка контакта кластера Cassandra. ======= `--cassandra-host`: Контактная точка кластера Cassandra. >>>>>>> 82edf2d (New md files from RunPod) `--cassandra-username`: Имя пользователя для аутентификации. `--cassandra-password`: Пароль для аутентификации. `--config-type`: Тип конфигурации для схем (по умолчанию: "schema"). Стандартные аргументы FlowProcessor (конфигурация Pulsar и т.д.). <<<<<<< HEAD ## Интеграция API ======= ## Интеграция с API >>>>>>> 82edf2d (New md files from RunPod) ### Темы Pulsar **Входная тема**: `objects-graphql-query-request` Схема: ObjectsQueryRequest <<<<<<< HEAD Получает GraphQL-запросы от шлюзовых сервисов. ======= Получает запросы GraphQL от шлюзовых сервисов. >>>>>>> 82edf2d (New md files from RunPod) **Выходная тема**: `objects-graphql-query-response` Схема: ObjectsQueryResponse Возвращает результаты запросов и ошибки. <<<<<<< HEAD ### Интеграция с шлюзом Шлюз и обратный шлюз потребуют конечных точек для: 1. Приема GraphQL-запросов от клиентов. 2. Передачи запросов сервису запросов через Pulsar. 3. Возврата ответов клиентам. 4. Поддержки GraphQL-запросов на интроспекцию. ======= ### Интеграция со шлюзом Шлюз и обратный шлюз потребуют конечных точек для: 1. Приема запросов GraphQL от клиентов. 2. Передачи запросов сервису запросов через Pulsar. 3. Возврата ответов клиентам. 4. Поддержки запросов introspection GraphQL. >>>>>>> 82edf2d (New md files from RunPod) ### Интеграция с инструментом агента Новый класс инструмента агента позволит: <<<<<<< HEAD Генерировать GraphQL-запросы из естественного языка. Выполнять GraphQL-запросы напрямую. Интерпретировать и форматировать результаты. Интегрироваться с потоками принятия решений агентом. ## Вопросы безопасности **Ограничение глубины запросов**: Предотвращает вложенные запросы, которые могут вызвать проблемы с производительностью. **Анализ сложности запросов**: Ограничивает сложность запросов для предотвращения исчерпания ресурсов. **Разрешения на уровне полей**: Будущая поддержка контроля доступа на уровне полей на основе ролей пользователей. **Санитизация входных данных**: Проверяет и очищает все входные данные запросов для предотвращения атак внедрения. **Ограничение скорости**: Реализует ограничение скорости запросов на пользователя/коллекцию. ## Вопросы производительности **Планирование запросов**: Анализирует запросы перед выполнением для оптимизации генерации CQL. ======= Преобразование естественного языка в запросы GraphQL. Непосредственное выполнение запросов GraphQL. Интерпретацию и форматирование результатов. Интеграцию с потоками принятия решений агентом. ## Вопросы безопасности **Ограничение глубины запросов**: Предотвращение глубоко вложенных запросов, которые могут вызвать проблемы с производительностью. **Анализ сложности запросов**: Ограничение сложности запросов для предотвращения исчерпания ресурсов. **Разрешения на уровне полей**: Будущая поддержка контроля доступа на уровне полей на основе ролей пользователей. **Санитарная обработка входных данных**: Проверка и санитарная обработка всех входных данных запросов для предотвращения атак внедрения. **Ограничение скорости**: Реализация ограничения скорости запросов на пользователя/коллекцию. ## Вопросы производительности **Планирование запросов**: Анализ запросов перед выполнением для оптимизации генерации CQL. >>>>>>> 82edf2d (New md files from RunPod) **Кэширование результатов**: Рассмотрите возможность кэширования часто используемых данных на уровне решателя полей. **Пул соединений**: Поддерживайте эффективные пулы соединений к Cassandra. **Пакетные операции**: Объединяйте несколько запросов, когда это возможно, для уменьшения задержки. **Мониторинг**: Отслеживайте метрики производительности запросов для оптимизации. ## Стратегия тестирования <<<<<<< HEAD ### Unit Tests Генерация схемы на основе определений RowSchema Разбор и проверка запросов GraphQL Логика генерации запросов CQL Реализации решателей полей ### Contract Tests Соответствие контракту сообщений Pulsar Достоверность схемы GraphQL Проверка формата ответа Проверка структуры ошибок ### Integration Tests Комплексное выполнение запросов к тестовой инстанции Cassandra Обработка обновлений схемы Разрешение связей Пагинация и фильтрация Сценарии ошибок ### Performance Tests Производительность запросов при высокой нагрузке Время отклика для различных уровней сложности запросов Использование памяти при работе с большими наборами результатов Эффективность пула соединений ======= ### Юнит-тесты Генерация схем из определений RowSchema. Разбор и проверка запросов GraphQL. Логика генерации запросов CQL. Реализации решателей полей. ### Контрактные тесты Соответствие контракту сообщений Pulsar. Достоверность схемы GraphQL. Проверка формата ответа. Проверка структуры ошибок. ### Интеграционные тесты Комплексное выполнение запросов к тестовой инстанции Cassandra. Обработка обновления схем. Разрешение взаимосвязей. Пагинация и фильтрация. Сценарии ошибок. ### Тесты производительности Пропускная способность запросов при нагрузке. Время отклика для различных уровней сложности запросов. Использование памяти с большими наборами результатов. Эффективность пула соединений. >>>>>>> 82edf2d (New md files from RunPod) ## План миграции Миграция не требуется, так как это новая функциональность. Сервис будет: <<<<<<< HEAD 1. Считывать существующие схемы из конфигурации 2. Подключаться к существующим таблицам Cassandra, созданным модулем хранения 3. Начинать принимать запросы сразу после развертывания ## Сроки 1-2 неделя: Реализация основного сервиса и генерация схемы 3 неделя: Выполнение запросов и трансляция CQL 4 неделя: Разрешение связей и оптимизация 5 неделя: Тестирование и настройка производительности 6 неделя: Интеграция с шлюзом и документация ## Открытые вопросы 1. **Эволюция схемы**: Как сервис должен обрабатывать запросы во время изменений схемы? Вариант: Помещать запросы в очередь во время обновлений схемы Вариант: Поддерживать несколько версий схемы одновременно 2. **Стратегия кэширования**: Следует ли кэшировать результаты запросов? Рассмотреть: Временное истечение срока действия Рассмотреть: Инвалидация на основе событий 3. **Поддержка федерации**: Следует ли сервису поддерживать GraphQL federation для объединения с другими источниками данных? Это позволит выполнять унифицированные запросы к структурированным и графовым данным 4. **Поддержка подписок**: Следует ли сервису поддерживать GraphQL subscriptions для получения обновлений в реальном времени? Это потребует поддержки WebSocket в шлюзе 5. **Пользовательские скаляры**: Следует ли поддерживать пользовательские скалярные типы для специфических типов данных? Примеры: DateTime, UUID, JSON-поля ======= 1. Считывать существующие схемы из конфигурации. Подключаться к существующим таблицам Cassandra, созданным модулем хранения. 3. Начинать принимать запросы сразу после развертывания. ## Открытые вопросы **Эволюция схемы**: Как сервис должен обрабатывать запросы во время переходов схемы? Вариант: Помещать запросы в очередь во время обновлений схемы. Вариант: Поддерживать несколько версий схемы одновременно. **Стратегия кэширования**: Следует ли кэшировать результаты запросов? Рассмотреть: Временное истечение срока действия. Рассмотреть: Инвалидация на основе событий. **Поддержка федерации**: Должен ли сервис поддерживать федерацию GraphQL для объединения с другими источниками данных? Это позволит выполнять унифицированные запросы к структурированным и графовым данным. **Поддержка подписок**: Должен ли сервис поддерживать подписки GraphQL для получения обновлений в режиме реального времени? Это потребует поддержки WebSocket в шлюзе. **Пользовательские скаляры**: Должна ли поддерживаться поддержка пользовательских скалярных типов для специфических типов данных? Примеры: DateTime, UUID, поля JSON. ## Ссылки Техническая спецификация структурированных данных: ⟦CODE_0⟧ Документация Strawberry GraphQL: ⟦URL_0⟧ Спецификация GraphQL: ⟦URL_0⟧ Документация Cassandra Driver: ⟦URL_0⟧ Документация Pulsar: ⟦URL_0⟧ >>>>>>> 82edf2d (New md files from RunPod) ## Ссылки Техническая спецификация структурированных данных: `docs/tech-specs/structured-data.md` Документация Strawberry GraphQL: https://strawberry.rocks/ Спецификация GraphQL: https://spec.graphql.org/ Справочник Apache Cassandra CQL: https://cassandra.apache.org/doc/stable/cassandra/cql/ <<<<<<< HEAD Документация TrustGraph Flow Processor: Внутренняя документация ======= Документация процессора потоков TrustGraph: Внутренняя документация >>>>>>> 82edf2d (New md files from RunPod)