Как добиться соответствия между Graphql в Virtuoso и Python

Недавние добавления представлений GraphQL в Open Link Virtuoso побудили сделать еще одну попытку использования данных из Virtuoso в Apache Superset.

Для этой цели можно использовать библиотеку Python graphql-db-api . Он обеспечивает необходимую интеграцию с SQLAlchemy, а Superset хорошо работает с конечными точками GraphQL, используемыми в примерах graphql-db-api.

Однако попытки использовать эту библиотеку для получения данных из конечных точек Virtuoso GraphQL не дали положительных результатов.

Исследование показывает, что graphql-db-api ожидает явный тип верхнего уровня типа NON_NULL в схеме GraphQL, но Virtuoso не использует такой тип верхнего уровня в своей собственной схеме GraphQL.

Например, конечная точка GraphQL graphql://pet-library.moonhighway.com имеет следующий фрагмент схемы:

    {
        "data": {
            "__schema": {
                "queryType": {
                    "fields": [
                        {
                            "name": "allPets",
                            "type": {
                                "name": null,
                                "kind": "NON_NULL",
                                "ofType": {
                                    "name": null,
                                    "kind": "LIST",
                                    "ofType": {
                                        "kind": "NON_NULL",
                                        "name": null,
                                        "ofType": {
                                            "name": "Pet"
                                        }
                                    }
                                }
                            }
                        },

Поле allPets имеет тип вида NON_NULL верхнего уровня, и только после этого следует тип вида LIST.

В то время как конечная точка GraphQL, размещенная на Virtuoso, возвращает следующую схему:

{
    "data": {
        "__schema": {
            "queryType": {
                "fields": [
                    {
                        "name": "ConceptSchemes",
                        "type": {
                            "name": null,
                            "kind": "LIST",
                            "ofType": {
                                "name": "ConceptScheme",
                                "kind": "OBJECT",
                                "ofType": null
                            }
                        }
                    }

Здесь поле ConceptSchemes имеет только тип вида LIST.

Можно ли настроить представления GraphQL в Virtuoso с дополнительным уровнем типа верхнего уровня с видом NON_NULL?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
61
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, вы пытаетесь использовать представления данных, связанные с RDF, через мост GraphQL и говорите о результате запроса самоанализа GraphQL, используемом приложением/драйвером Python.

Таким образом вы делаете TTLP(GQL_CREATE_TYPE_SCHEMA ('rdf view generated schema graph IRI')) как описано здесь.

Приведенный выше оператор импортирует документ Turtle, описывающий граф самоанализа для представления RDF; поэтому он содержит утверждения для Querytype, так -

:Query :fields [ :name "Products" ; :type [ :kind "LIST" ; :ofType ns0:Products ] ] .

Если вы хотите создавать Products списки non-null, вам необходимо сохранить результат GQL_CREATE_TYPE_SCHEMA(), например, с помощью функции string_to_file(), а затем изменить приведенный выше оператор в документе Turtle на —

:Query :fields [ :name "Products" ; :type [ :kind "NON_NULL"; :ofType [ :kind "LIST" ; :ofType ns0:Products ] ] ] .

— или вы можете использовать свой собственный SDL вот так —

type Product {
  ProductId: ID!
  ProductName: String!
  # etc.
}

type Query {
  Products: [Product!]!
}

— и создайте документ Turtle для графика самоанализа с помощью GQL_GENERATE_INTRO([sdl document]).

Как только тройки, объявленные для этого конкретного типа массива, не будут иметь значение NULL, вам следует импортировать и зарегистрироваться в графе интроспекции моста Graphql.

Большое спасибо за решение. Первый вариант с ручной модификацией TTL был применен успешно. Теперь Apache Superset может использовать данные Virtuoso.

Eduard BABKIN 01.05.2024 23:28

Можно ли узнать больше о деталях и примерах, связанных с онтологией Virtuoso RDF и схемой сопоставлений GraphQL (т. е. функциональными полями)?

Eduard BABKIN 01.05.2024 23:37

Другие вопросы по теме