Esta página deve ser lida juntamente com:
Para começar a usar query GraphQL e como eles trabalham com AEM Fragmentos de conteúdo, é útil ver alguns exemplos práticos.
Para ajudar com isso, consulte:
E alguns query GraphQL de amostra, com base na estrutura do fragmento de conteúdo de amostra (Modelos de fragmento de conteúdo e Fragmentos de conteúdo relacionados).
A operação básica de query com GraphQL para AEM obedece à especificação GraphQL padrão. Para query GraphQL com AEM há algumas extensões:
Se você precisar de um único resultado:
Se você espera uma lista de resultados:
List
ao nome do modelo; por exemplo, cityList
Se quiser usar um OU lógico:
_logOp: OR
E lógico também existe, mas é (muitas vezes) implícito
Você pode query em nomes de campos que correspondam aos campos no Modelo de fragmento de conteúdo
Além dos campos do modelo, há alguns campos gerados pelo sistema (precedidos por sublinhado):
Para conteúdo:
_locale
: revelar a língua; com base no Gerenciador de idiomas
_metadata
: para revelar metadados para o fragmento
_model
: permitir consulta para um Modelo de fragmento de conteúdo (caminho e título)
_path
: o caminho para o fragmento do conteúdo no repositório
_reference
: revelar referências; incluindo referências em linha no Editor de Rich Text
_variation
: para revelar variações específicas em seu fragmento de conteúdo
E operações:
_operator
: Aplicar operadores específicos; EQUALS
, EQUALS_NOT
, GREATER_EQUAL
, LOWER
, CONTAINS
_apply
: Aplicar condições específicas; por exemplo, AT_LEAST_ONCE
_ignoreCase
: para ignorar o caso ao consultar
Os tipos de união GraphQL são suportados:
Consulte estes query de amostra para obter ilustrações de criação de query, juntamente com resultados de amostra.
Dependendo da sua instância, você pode acessar diretamente a interface Graph i QL incluída com AEM API do GraphQL para enviar e testar query.
Por exemplo: http://localhost:4502/content/graphiql.html
Os query de amostra são baseados na Exemplo de estrutura de fragmento de conteúdo para uso com GraphQL
Isso retornará todos os types
para todos os schemas disponíveis.
Query de amostra
{
__schema {
types {
name
description
}
}
}
Resultado da amostra
{
"data": {
"__schema": {
"types": [
{
"name": "AdventureModel",
"description": null
},
{
"name": "AdventureModelArrayFilter",
"description": null
},
{
"name": "AdventureModelFilter",
"description": null
},
{
"name": "AdventureModelResult",
"description": null
},
{
"name": "AdventureModelResults",
"description": null
},
{
"name": "AllFragmentModels",
"description": null
},
{
"name": "ArchiveRef",
"description": null
},
{
"name": "ArrayMode",
"description": null
},
{
"name": "ArticleModel",
"description": null
},
...more results...
{
"name": "__EnumValue",
"description": null
},
{
"name": "__Field",
"description": null
},
{
"name": "__InputValue",
"description": null
},
{
"name": "__Schema",
"description": "A GraphQL Introspection defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, the entry points for query, mutation, and subscription operations."
},
{
"name": "__Type",
"description": null
},
{
"name": "__TypeKind",
"description": "An enum describing what kind of type a given __Type is"
}
]
}
}
}
Para recuperar todas as informações sobre todas as cidades, você pode usar o query básico:
Query de amostra
{
cityList {
items
}
}
Quando executado, o sistema expandirá automaticamente o query para incluir todos os campos:
{
cityList {
items {
_path
name
country
population
}
}
}
Resultados da amostra
{
"data": {
"cityList": {
"items": [
{
"_path": "/content/dam/sample-content-fragments/cities/basel",
"name": "Basel",
"country": "Switzerland",
"population": 172258
},
{
"_path": "/content/dam/sample-content-fragments/cities/berlin",
"name": "Berlin",
"country": "Germany",
"population": 3669491
},
{
"_path": "/content/dam/sample-content-fragments/cities/bucharest",
"name": "Bucharest",
"country": "Romania",
"population": 1821000
},
{
"_path": "/content/dam/sample-content-fragments/cities/san-francisco",
"name": "San Francisco",
"country": "USA",
"population": 883306
},
{
"_path": "/content/dam/sample-content-fragments/cities/san-jose",
"name": "San Jose",
"country": "USA",
"population": 1026350
},
{
"_path": "/content/dam/sample-content-fragments/cities/stuttgart",
"name": "Stuttgart",
"country": "Germany",
"population": 634830
},
{
"_path": "/content/dam/sample-content-fragments/cities/zurich",
"name": "Zurich",
"country": "Switzerland",
"population": 415367
}
]
}
}
}
Este é um query simples para retornar name
de todas as entradas no schema city
.
Query de amostra
query {
cityList {
items {
name
}
}
}
Resultados da amostra
{
"data": {
"cityList": {
"items": [
{
"name": "Basel"
},
{
"name": "Berlin"
},
{
"name": "Bucharest"
},
{
"name": "San Francisco"
},
{
"name": "San Jose"
},
{
"name": "Stuttgart"
},
{
"name": "Zurich"
}
]
}
}
}
Este é um query para retornar os detalhes de uma única entrada de fragmento em um local específico no repositório.
Query de amostra
{
cityByPath (_path: "/content/dam/sample-content-fragments/cities/berlin") {
item {
_path
name
country
population
categories
}
}
}
Resultados da amostra
{
"data": {
"cityByPath": {
"item": {
"_path": "/content/dam/sample-content-fragments/cities/berlin",
"name": "Berlin",
"country": "Germany",
"population": 3669491,
"categories": [
"city:capital",
"city:emea"
]
}
}
}
}
Se você criar uma nova variação, chamada "Berlin Center" (berlin_centre
), para o city
Berlim, você poderá usar um query para retornar detalhes da variação.
Query de amostra
{
cityList (variation: "berlin_center") {
items {
_path
name
country
population
categories
}
}
}
Resultados da amostra
{
"data": {
"cityList": {
"items": [
{
"_path": "/content/dam/sample-content-fragments/cities/berlin",
"name": "Berlin",
"country": "Germany",
"population": 3669491,
"categories": [
"city:capital",
"city:emea"
]
}
]
}
}
}
Usando a estrutura dos fragmentos aninhados, esse query retorna os detalhes completos de um CEO da empresa e de todos os seus funcionários.
Query de amostra
query {
companyList {
items {
name
ceo {
_path
name
firstName
awards {
id
title
}
}
employees {
name
firstName
awards {
id
title
}
}
}
}
}
Resultados da amostra
{
"data": {
"companyList": {
"items": [
{
"name": "Apple Inc.",
"ceo": {
"_path": "/content/dam/sample-content-fragments/persons/steve-jobs",
"name": "Jobs",
"firstName": "Steve",
"awards": []
},
"employees": [
{
"name": "Marsh",
"firstName": "Duke",
"awards": []
},
{
"name": "Caulfield",
"firstName": "Max",
"awards": [
{
"id": "GB",
"title": "Gameblitz"
}
]
}
]
},
{
"name": "Little Pony, Inc.",
"ceo": {
"_path": "/content/dam/sample-content-fragments/persons/adam-smith",
"name": "Smith",
"firstName": "Adam",
"awards": []
},
"employees": [
{
"name": "Croft",
"firstName": "Lara",
"awards": [
{
"id": "GS",
"title": "Gamestar"
}
]
},
{
"name": "Slade",
"firstName": "Cutter",
"awards": [
{
"id": "GB",
"title": "Gameblitz"
},
{
"id": "GS",
"title": "Gamestar"
}
]
}
]
},
{
"name": "NextStep Inc.",
"ceo": {
"_path": "/content/dam/sample-content-fragments/persons/steve-jobs",
"name": "Jobs",
"firstName": "Steve",
"awards": []
},
"employees": [
{
"name": "Smith",
"firstName": "Joe",
"awards": []
},
{
"name": "Lincoln",
"firstName": "Abraham",
"awards": []
}
]
}
]
}
}
}
Isso filtrará todos os persons
para qualquer um que tenha o nome Jobs
ou Smith
.
Query de amostra
query {
personList(filter: {
name: {
_logOp: OR
_expressions: [
{
value: "Jobs"
},
{
value: "Smith"
}
]
}
}) {
items {
name
firstName
}
}
}
Resultados da amostra
{
"data": {
"personList": {
"items": [
{
"name": "Smith",
"firstName": "Adam"
},
{
"name": "Smith",
"firstName": "Joe"
},
{
"name": "Jobs",
"firstName": "Steve"
}
]
}
}
}
Isso filtrará todos os persons
para qualquer um que tenha o nome Jobs
ou Smith
.
Query de amostra
query {
personList(filter: {
name: {
_expressions: [
{
value: "Jobs"
_operator: EQUALS_NOT
}
]
}
}) {
items {
name
firstName
}
}
}
Resultados da amostra
{
"data": {
"personList": {
"items": [
{
"name": "Lincoln",
"firstName": "Abraham"
},
{
"name": "Smith",
"firstName": "Adam"
},
{
"name": "Slade",
"firstName": "Cutter"
},
{
"name": "Marsh",
"firstName": "Duke"
},
{
"name": "Smith",
"firstName": "Joe"
},
{
"name": "Croft",
"firstName": "Lara"
},
{
"name": "Caulfield",
"firstName": "Max"
}
]
}
}
}
Aqui, uma combinação de campos é filtrada. Um AND
(implícito) é usado para selecionar o intervalo population
enquanto um OR
(explícito) é usado para selecionar as cidades necessárias.
Query de amostra
query {
cityList(filter: {
population: {
_expressions: [
{
value: 400000
_operator: GREATER_EQUAL
}, {
value: 1000000
_operator: LOWER
}
]
},
country: {
_logOp: OR
_expressions: [
{
value: "Germany"
}, {
value: "Switzerland"
}
]
}
}) {
items {
name
population
country
}
}
}
Resultados da amostra
{
"data": {
"cityList": {
"items": [
{
"name": "Stuttgart",
"population": 634830,
"country": "Germany"
},
{
"name": "Zurich",
"population": 415367,
"country": "Switzerland"
}
]
}
}
}
Este query interroga todas as cidades que tenham SAN
no nome, independentemente do caso.
Query de amostra
query {
cityList(filter: {
name: {
_expressions: [
{
value: "SAN"
_operator: CONTAINS
_ignoreCase: true
}
]
}
}) {
items {
name
population
country
}
}
}
Resultados da amostra
{
"data": {
"cityList": {
"items": [
{
"name": "San Francisco",
"population": 883306,
"country": "USA"
},
{
"name": "San Jose",
"population": 1026350,
"country": "USA"
}
]
}
}
}
Este query filtros em uma matriz com um item (city:na
) que deve ocorrer pelo menos uma vez.
Query de amostra
query {
cityList(filter: {
categories: {
_expressions: [
{
value: "city:na"
_apply: AT_LEAST_ONCE
}
]
}
}) {
items {
name
population
country
categories
}
}
}
Resultados da amostra
{
"data": {
"cityList": {
"items": [
{
"name": "San Francisco",
"population": 883306,
"country": "USA",
"categories": [
"city:beach",
"city:na"
]
},
{
"name": "San Jose",
"population": 1026350,
"country": "USA",
"categories": [
"city:na"
]
}
]
}
}
}
Este query filtros em um valor de matriz exato.
Query de amostra
query {
cityList(filter: {
categories: {
_expressions: [
{
values: [
"city:beach",
"city:na"
]
}
]
}
}) {
items {
name
population
country
categories
}
}
}
Resultados da amostra
{
"data": {
"cityList": {
"items": [
{
"name": "San Francisco",
"population": 883306,
"country": "USA",
"categories": [
"city:beach",
"city:na"
]
}
]
}
}
}
Este query ilustra a filtragem de person
de name
"Smith", retornando informações de dois fragmentos aninhados - company
e employee
.
Query de amostra
query {
companyList(filter: {
employees: {
_match: {
name: {
_expressions: [
{
value: "Smith"
}
]
}
}
}
}) {
items {
name
ceo {
name
firstName
}
employees {
name
firstName
}
}
}
}
Resultados da amostra
{
"data": {
"companyList": {
"items": [
{
"name": "NextStep Inc.",
"ceo": {
"name": "Jobs",
"firstName": "Steve"
},
"employees": [
{
"name": "Smith",
"firstName": "Joe"
},
{
"name": "Lincoln",
"firstName": "Abraham"
}
]
}
]
}
}
}
Este query ilustra a filtragem em três fragmentos aninhados - company
, employee
e award
.
Query de amostra
query {
companyList(filter: {
employees: {
_apply: ALL
_match: {
awards: {
_match: {
id: {
_expressions: [
{
value: "GS"
_operator:EQUALS
}
]
}
}
}
}
}
}) {
items {
name
ceo {
name
firstName
}
employees {
name
firstName
awards {
id
title
}
}
}
}
}
Resultados da amostra
{
"data": {
"companyList": {
"items": [
{
"name": "Little Pony, Inc.",
"ceo": {
"name": "Smith",
"firstName": "Adam"
},
"employees": [
{
"name": "Croft",
"firstName": "Lara",
"awards": [
{
"id": "GS",
"title": "Gamestar"
}
]
},
{
"name": "Slade",
"firstName": "Cutter",
"awards": [
{
"id": "GB",
"title": "Gameblitz"
},
{
"id": "GS",
"title": "Gamestar"
}
]
}
]
}
]
}
}
}
Este query ilustra a filtragem em três fragmentos aninhados - company
, employee
e award
.
Query de amostra
query {
awardList(filter: {
id: {
_expressions: [
{
value:"GB"
}
]
}
}) {
items {
_metadata {
stringMetadata {
name,
value
}
}
id
title
}
}
}
Resultados da amostra
{
"data": {
"awardList": {
"items": [
{
"_metadata": {
"stringMetadata": [
{
"name": "title",
"value": "Gameblitz Award"
},
{
"name": "description",
"value": ""
}
]
},
"id": "GB",
"title": "Gameblitz"
}
]
}
}
}
Esses query de amostra são baseados no projeto WKND. Isso tem:
Modelos de fragmento de conteúdo disponíveis em:
http://<hostname>:<port>/libs/dam/cfm/models/console/content/models.html/conf/wknd
Fragmentos de conteúdo (e outro conteúdo) disponíveis em:
http://<hostname>:<port>/assets.html/content/dam/wknd/en
Como os resultados podem ser extensos, eles não são reproduzidos aqui.
Este query de amostra interroga:
article
path
e author
.Query de amostra
{
articleList {
items {
_path
author
}
}
}
Este query interroga:
adventure
Query de amostra
{
adventureList {
items {
_path,
_metadata {
stringMetadata {
name,
value
}
stringArrayMetadata {
name,
value
}
intMetadata {
name,
value
}
intArrayMetadata {
name,
value
}
floatMetadata {
name,
value
}
floatArrayMetadata {
name,
value
}
booleanMetadata {
name,
value
}
booleanArrayMetadata {
name,
value
}
calendarMetadata {
name,
value
}
calendarArrayMetadata {
name,
value
}
}
}
}
}
Este query de amostra interroga:
article
em um caminho específico
Query de amostra
{
articleByPath (_path: "/content/dam/wknd/en/magazine/alaska-adventure/alaskan-adventures") {
item {
_path
author
main {
html
markdown
plaintext
json
}
}
}
}
Este query de amostra interroga:
Query de amostra
{
adventureByPath(_path: "/content/dam/wknd/en/adventures/riverside-camping-australia/riverside-camping-australia") {
item {
_path
adventureTitle
_model {
_path
title
}
}
}
}
Este query interroga:
article
em um caminho específico
O campo referencearticle
tem o tipo de Dados fragment-reference
.
Query de amostra
{
articleByPath (_path: "/content/dam/wknd/en/magazine/skitouring/skitouring") {
item {
_path
author
referencearticle {
_path
author
}
}
}
}
Este query interroga:
bookmark
article
e adventure
O campo fragments
tem o tipo de Dados fragment-reference
, com os modelos Article
, Adventure
selecionados.
{
bookmarkList {
items {
fragments {
... on ArticleModel {
_path
author
}
... on AdventureModel {
_path
adventureTitle
}
}
}
}
}
Há dois sabores deste query:
attachments
.Estes query interrogam:
bookmark
O query a seguir retorna todas as referências de conteúdo usando _references
:
{
bookmarkList {
_references {
... on ImageRef {
_path
type
height
}
... on MultimediaRef {
_path
type
size
}
... on DocumentRef {
_path
type
author
}
... on ArchiveRef {
_path
type
format
}
}
items {
_path
}
}
}
O query a seguir retorna todos os attachments
- um campo específico (subgrupo) do tipo content-reference
:
O campo attachments
tem o tipo de Dados content-reference
, com vários formulários selecionados.
{
bookmarkList {
items {
attachments {
... on PageRef {
_path
type
}
... on ImageRef {
_path
width
}
... on MultimediaRef {
_path
size
}
... on DocumentRef {
_path
author
}
... on ArchiveRef {
_path
format
}
}
}
}
}
Este query interroga:
bookmark
em um caminho específico
As referências em linha do RTE são hidratadas em _references
.
Query de amostra
{
bookmarkByPath(_path: "/content/dam/wknd/en/bookmarks/skitouring") {
item {
_path
description {
json
}
}
_references {
... on ArticleModel {
_path
}
... on AdventureModel {
_path
}
... on ImageRef {
_path
}
... on MultimediaRef {
_path
}
... on DocumentRef {
_path
}
... on ArchiveRef {
_path
}
}
}
}
Este query interroga:
article
em um caminho específico
variation1
Query de amostra
{
articleByPath (_path: "/content/dam/wknd/en/magazine/alaska-adventure/alaskan-adventures", variation: "variation1") {
item {
_path
author
main {
html
markdown
plaintext
json
}
}
}
}
Este query interroga:
article
com uma variação específica: variation1
Query de amostra
{
articleList (variation: "variation1") {
items {
_path
author
main {
html
markdown
plaintext
json
}
}
}
}
Este query interroga:
article
na localidade fr
Query de amostra
{
articleList (_locale: "fr") {
items {
_path
author
main {
html
markdown
plaintext
json
}
}
}
}
Os query de amostra são baseados na seguinte estrutura, que usa:
Um ou mais, Amostra de modelos de fragmento de conteúdo - formam a base para os schemas GraphQL
Amostra de fragmentos de conteúdo com base nos modelos acima
Para os query de amostra, usaremos os seguintes Modelos de conteúdo e suas inter-relações (referências ->):
Os campos básicos que definem a empresa são:
Nome do campo | Tipo de dados | Referência |
---|---|---|
Nome da empresa | Texto em linha única | |
CEO | Referência do fragmento (único) | Person |
Funcionários | Referência do fragmento (vários campos) | Pessoa |
Os campos que definem uma pessoa, que também pode ser um funcionário:
Nome do campo | Tipo de dados | Referência |
---|---|---|
Nome | Texto em linha única | |
Nome | Texto em linha única | |
Prêmios | Referência do fragmento (vários campos) | Prêmio |
Os campos que definem um prêmio são:
Nome do campo | Tipo de dados | Referência |
---|---|---|
Atalho/ID | Texto em linha única | |
Título | Texto em linha única |
Os campos para definir uma cidade são:
Nome do campo | Tipo de dados | Referência |
---|---|---|
Nome | Texto em linha única | |
País | Texto em linha única | |
População | Número | |
Categorias | Tags |
Os seguintes fragmentos são usados para o modelo apropriado.
Nome da empresa | CEO | Funcionários |
---|---|---|
Apple | Steve Jobs | Duke Marsh Max Caulfield |
Little Pony Inc. | Adam Smith | Lara Croft Escória Cortadora |
NextStep Inc. | Steve Jobs | Joe Smith Abe Lincoln |
Nome | Nome | Prêmios |
---|---|---|
Lincoln | Abe | |
Smith | Adam | |
Barra | Cortador | Gameblitz Gamestar |
pântano | Duke | |
Smith | Joe | |
Corte | Lara | Gamestar |
Caulfield | Máximo | Gameblitz |
Tarefas | Steve |
Atalho/ID | Título |
---|---|
GB | Gameblitz |
GS | Gamestar |
OSC | Oscar |
Nome | País | População | Categorias |
---|---|---|---|
Basileia | Suíça | 172258 | cidade:emea |
Berlim | Alemanha | 3669491 | cidade:capital cidade:emea |
Bucareste | Romênia | 1821000 | cidade:capital cidade:emea |
São Francisco | EUA | 883306 | cidade:praia cidade:na |
San Jose | EUA | 102635 | cidade:na |
Stuttgart | Alemanha | 634830 | cidade:emea |
Zurique | Suíça | 415367 | cidade:capital cidade:emea |