Недавние добавления представлений 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
?
Похоже, вы пытаетесь использовать представления данных, связанные с RDF, через мост GraphQL и говорите о результате запроса самоанализа GraphQL, используемом приложением/драйвером Python.
Таким образом вы делаете TTLP(GQL_CREATE_TYPE_SCHEMA ('rdf view generated schema graph IRI'))
как описано здесь.
Приведенный выше оператор импортирует документ Turtle, описывающий граф самоанализа для представления RDF; поэтому он содержит утверждения для Query
type
,
так -
: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.
Можно ли узнать больше о деталях и примерах, связанных с онтологией Virtuoso RDF и схемой сопоставлений GraphQL (т. е. функциональными полями)?
Большое спасибо за решение. Первый вариант с ручной модификацией TTL был применен успешно. Теперь Apache Superset может использовать данные Virtuoso.