As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
O openCypher explain
recurso
O openCypher explain
recurso é uma ferramenta de autoatendimento no Amazon Neptune que ajuda você a entender a abordagem de execução adotada pelo mecanismo Neptune. Para invocar explain, você passa um parâmetro para uma openCypher HTTPSsolicitação comexplain=
, em que o mode
mode
valor pode ser um dos seguintes:
-
static
: no modostatic
, oexplain
imprime somente a estrutura estática do plano de consulta. Na verdade, ele não executa a consulta. -
dynamic
: no mododynamic
,explain
também executa a consulta e inclui aspectos dinâmicos do plano de consulta. Eles podem incluir o número de associações intermediárias que fluem por meio dos operadores, a proporção de associações de entrada para associações de saída e o tempo total utilizado pelos operadores. -
details
— Nodetails
modo,explain
imprime as informações mostradas no modo dinâmico, além de detalhes adicionais, como a string de openCypher consulta real e a contagem estimada do intervalo para o padrão subjacente a um operador de junção.
Por exemplo, usando POST
:
curl HTTPS://
server
:port
/openCypher \ -d "query=MATCH (n) RETURN n LIMIT 1;" \ -d "explain=dynamic"
Ou usando GET
:
curl -X GET \ "HTTPS://
server
:port
/openCypher?query=MATCH%20(n)%20RETURN%20n%20LIMIT%201&explain=dynamic"
Limitações para openCypher explain
em Neptune
A versão atual do openCypher explain tem as seguintes limitações:
No momento, os planos de explain estão disponíveis apenas para consultas que realizam operações somente leitura. Consultas que realizam qualquer tipo de mutação, como
CREATE
,DELETE
,MERGE
,SET
, etc., não são aceitas.Os operadores e as saídas de um plano específico podem mudar em versões futuras.
DFEoperadores na openCypher explain
saída
Para usar as informações que o openCypher explain
recurso fornece, você precisa entender alguns detalhes sobre como o mecanismo de DFE consulta funciona (DFEsendo o mecanismo que o Neptune usa para openCypher processar consultas).
O DFE mecanismo traduz cada consulta em um pipeline de operadores. A partir do primeiro operador, soluções intermediárias fluem de um operador até o próximo por meio desse pipeline de operadores. Cada linha da tabela de explain representa um resultado, até o ponto de avaliação.
Os operadores que podem aparecer em um plano de DFE consulta são os seguintes:
DFEApply— Executa a função especificada na seção de argumentos, no valor armazenado na variável especificada
DFEBindRelation— Vincula variáveis com os nomes especificados
DFEChunkLocalSubQuery— Essa é uma operação sem bloqueio que atua como um invólucro em torno das subconsultas que estão sendo executadas.
DFEDistinctColumn— Retorna o subconjunto distinto dos valores de entrada com base na variável especificada.
DFEDistinctRelation— Retorna o subconjunto distinto das soluções de entrada com base na variável especificada.
DFEDrain— Aparece no final de uma subconsulta para atuar como uma etapa de encerramento dessa subconsulta. O número de soluções é registrado como Units In
. Units Out
é sempre zero.
DFEForwardValue— Copia todos os blocos de entrada diretamente como blocos de saída a serem passados para seu operador a jusante.
DFEGroupByHashIndex— Executa uma operação agrupada sobre as soluções de entrada com base em um índice de hash previamente calculado (usando a operação). DFEHashIndexBuild
Como saída, a entrada fornecida é estendida por uma coluna contendo uma chave de grupo para cada solução de entrada.
DFEHashIndexBuild— Cria um índice de hash sobre um conjunto de variáveis como efeito colateral. Esse índice de hash geralmente é reutilizado em operações posteriores. Consulte DFEHashIndexJoin
ou DFEGroupByHashIndex
para saber onde esse índice de hash pode ser usado.
DFEHashIndexJoin— Executa uma junção das soluções recebidas em relação a um índice de hash criado anteriormente. Consulte DFEHashIndexBuild
para saber onde esse índice de hash pode ser criado.
DFEJoinExists— Toma uma relação de entrada à esquerda e à direita e retém valores da relação esquerda que têm um valor correspondente na relação direita, conforme definido pelas variáveis de junção fornecidas.
: é uma operação sem bloqueio que atua como um invólucro de uma subconsulta, permitindo que ela seja executada repetidamente para uso em loops.
DFEMergeChunks— Essa é uma operação de bloqueio que combina partes de seu operador a montante em um único bloco de soluções para passar para o operador a jusante (inverso de). DFESplitChunks
DFEMinus— Toma uma relação de entrada à esquerda e à direita e retém valores da relação esquerda que não têm um valor correspondente na relação direita, conforme definido pelas variáveis de junção fornecidas. Se não houver sobreposição de variáveis em ambas as relações, este operador simplesmente retornará a relação de entrada à esquerda.
DFENotExists— Toma uma relação de entrada à esquerda e à direita e retém valores da relação esquerda que não têm um valor correspondente na relação direita, conforme definido pelas variáveis de junção fornecidas. Se não houver sobreposição de variáveis em ambas as relações, este operador retornará uma relação vazia.
DFEOptionalJoin— Executa uma junção externa esquerda (também chamada de OPTIONAL junção): soluções do lado esquerdo que têm pelo menos um parceiro de junção no lado direito são unidas, e soluções do lado esquerdo sem parceiro de junção no lado direito são encaminhadas como estão. Essa é uma operação de bloqueio.
DFEPipelineJoin— Une a entrada com o padrão de tupla definido pelo pattern
argumento.
DFEPipelineRangeCount— Conta o número de soluções que correspondem a um determinado padrão e retorna uma única solução única contendo o valor da contagem.
DFEPipelineScan— Verifica o banco de dados em busca do pattern
argumento fornecido, com ou sem um determinado filtro na (s) coluna (s).
DFEProject— Obtém várias colunas de entrada e projeta somente as colunas desejadas.
DFEReduce— Executa a função de agregação especificada em variáveis especificadas.
DFERelationalJoin— Junta a entrada do operador anterior com base nas chaves de padrão especificadas usando uma junção de mesclagem. Essa é uma operação de bloqueio.
DFERouteChunks— Pega pedaços de entrada de sua borda de entrada singular e direciona esses pedaços ao longo de suas múltiplas bordas de saída.
DFESelectRows— Esse operador pega seletivamente as linhas de suas soluções de relação de entrada à esquerda para encaminhar para o operador a jusante. As linhas selecionadas com base nos identificadores de linha fornecidos na relação de entrada direita do operador.
DFESerialize— Serializa os resultados finais de uma consulta em uma serialização de JSON string, mapeando cada solução de entrada para o nome de variável apropriado. Para resultados de nós e bordas, esses resultados são serializados em um mapa de propriedades e metadados da entidade.
DFESort— Pega uma relação de entrada e produz uma relação ordenada com base na chave de classificação fornecida.
DFESplitByGroup— Divide cada bloco de entrada de uma borda de entrada em pedaços de saída menores correspondentes aos grupos de linhas identificados por linha IDs do pedaço de entrada correspondente da outra borda de entrada.
DFESplitChunks— Divide cada bloco de entrada em pedaços menores de saída (inverso de). DFEMergeChunks
DFEStreamingHashIndexBuild— Versão de streaming doDFEHashIndexBuild
.
DFEStreamingGroupByHashIndex— Versão de streaming doDFEGroupByHashIndex
.
DFESubquery— Esse operador aparece no início de todos os planos e encapsula as partes do plano que são executadas no DFEmotor, que é o plano inteiro. openCypher
DFESymmetricHashJoin— Junta a entrada do operador anterior com base nas chaves de padrão especificadas usando uma junção de hash. Essa é uma operação sem bloqueio.
DFESync— Este operador é um operador de sincronização que oferece suporte a planos sem bloqueio. Ele pega soluções de duas bordas de entrada e as encaminha para as bordas downstream apropriadas. Para fins de sincronização, as entradas ao longo de uma dessas bordas podem ser armazenadas em buffer internamente.
DFETee— Este é um operador ramificado que envia o mesmo conjunto de soluções para vários operadores.
DFETermResolution— Executa uma operação de localização ou globalização em suas entradas, resultando em colunas de identificadores localizados ou globalizados, respectivamente.
: desdobra listas de valores de uma coluna de entrada para a coluna de saída como elementos individuais.
DFEUnion— Pega duas ou mais relações de entrada e produz uma união dessas relações usando o esquema de saída desejado.
SolutionInjection— Aparece antes de tudo na saída de explicação, com um valor de 1 na coluna Unidades de saída. No entanto, ele serve como um sistema autônomo e, na verdade, não injeta nenhuma solução no DFE motor.
TermResolution— Aparece no final dos planos e traduz objetos do motor Neptune em objetos. openCypher
Colunas na openCypher explain
saída
As informações do plano de consulta que o Neptune gera openCypher como saída de explicação contêm tabelas com um operador por linha. A tabela tem as seguintes colunas:
ID: o ID numérico desse operador no plano.
Saída 1 (e Saída 2): os IDs dos operadores posteriores a esse operador. Pode haver no máximo dois operadores posteriores.
Nome: o nome desse operador.
Argumentos: qualquer detalhe relevante para o operador. Isso inclui itens como esquema de entrada, esquema de saída, padrão (para PipelineScan
e PipelineJoin
), etc.
Modo: um rótulo que descreve o comportamento fundamental do operador. Essa coluna está quase toda em branco (-
). Uma exceção éTermResolution
, onde o modo pode estarid2value_opencypher
, indicar uma resolução do ID ao openCypher valor.
Unidades de entrada: o número de soluções transmitidas como entrada para esse operador. Operadores sem operadores anteriores, como DFEPipelineScan
, SolutionInjections
e DFESubquery
sem valor estático injetado, teriam valor zero.
Unidades de saída: o número de soluções produzidas como saída desse operador. DFEDrain
é um caso especial, em que o número de soluções que estão sendo drenadas é registrado em Units In
e Units Out
é sempre zero.
Proporção: a proporção de Units Out
para Units In
.
Tempo (ms) — O CPU tempo consumido por esse operador, em milissegundos.
Um exemplo básico de openCypher explicação da saída
Veja a seguir um exemplo básico de openCypher explain
saída. A consulta é uma pesquisa de nó único no conjunto de dados de rotas aéreas para um nó com o código do aeroporto ATL
que invoca explain
usando o details
modo no formato de saída padrão: ASCII
curl -d "query=MATCH (n {code: 'ATL'}) RETURN n" -k https://localhost:8182/openCypher -d "explain=details" ~ Query: MATCH (n {code: 'ATL'}) RETURN n ╔════╤════════╤════════╤═══════════════════╤════════════════════╤═════════════════════╤══════════╤═══════════╤═══════╤═══════════╗ ║ ID │ Out #1 │ Out #2 │ Name │ Arguments │ Mode │ Units In │ Units Out │ Ratio │ Time (ms) ║ ╠════╪════════╪════════╪═══════════════════╪════════════════════╪═════════════════════╪══════════╪═══════════╪═══════╪═══════════╣ ║ 0 │ 1 │ - │ SolutionInjection │ solutions=[{}] │ - │ 0 │ 1 │ 0.00 │ 0 ║ ╟────┼────────┼────────┼───────────────────┼────────────────────┼─────────────────────┼──────────┼───────────┼───────┼───────────╢ ║ 1 │ 2 │ - │ DFESubquery │ subQuery=subQuery1 │ - │ 0 │ 1 │ 0.00 │ 4.00 ║ ╟────┼────────┼────────┼───────────────────┼────────────────────┼─────────────────────┼──────────┼───────────┼───────┼───────────╢ ║ 2 │ - │ - │ TermResolution │ vars=[?n] │ id2value_opencypher │ 1 │ 1 │ 1.00 │ 2.00 ║ ╚════╧════════╧════════╧═══════════════════╧════════════════════╧═════════════════════╧══════════╧═══════════╧═══════╧═══════════╝ subQuery1 ╔════╤════════╤════════╤═══════════════════════╤══════════════════════════════════════════════════════════════════════════════════════════════════════════════╤══════╤══════════╤═══════════╤═══════╤═══════════╗ ║ ID │ Out #1 │ Out #2 │ Name │ Arguments │ Mode │ Units In │ Units Out │ Ratio │ Time (ms) ║ ╠════╪════════╪════════╪═══════════════════════╪══════════════════════════════════════════════════════════════════════════════════════════════════════════════╪══════╪══════════╪═══════════╪═══════╪═══════════╣ ║ 0 │ 1 │ - │ DFEPipelineScan │ pattern=Node(?n) with property 'code' as ?n_code2 and label 'ALL' │ - │ 0 │ 1 │ 0.00 │ 0.21 ║ ║ │ │ │ │ inlineFilters=[(?n_code2 IN ["ATL"^^xsd:string])] │ │ │ │ │ ║ ║ │ │ │ │ patternEstimate=1 │ │ │ │ │ ║ ╟────┼────────┼────────┼───────────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 1 │ 2 │ - │ DFEChunkLocalSubQuery │ subQuery=http://aws.amazon.com/neptune/vocab/v01/dfe/past/graph#9d84f97c-c3b0-459a-98d5-955a8726b159/graph_1 │ - │ 1 │ 1 │ 1.00 │ 0.04 ║ ╟────┼────────┼────────┼───────────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 2 │ 3 │ - │ DFEProject │ columns=[?n] │ - │ 1 │ 1 │ 1.00 │ 0.04 ║ ╟────┼────────┼────────┼───────────────────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 3 │ - │ - │ DFEDrain │ - │ - │ 1 │ 0 │ 0.00 │ 0.03 ║ ╚════╧════════╧════════╧═══════════════════════╧══════════════════════════════════════════════════════════════════════════════════════════════════════════════╧══════╧══════════╧═══════════╧═══════╧═══════════╝ subQuery=http://aws.amazon.com/neptune/vocab/v01/dfe/past/graph#9d84f97c-c3b0-459a-98d5-955a8726b159/graph_1 ╔════╤════════╤════════╤══════════════════════╤════════════════════════════════════════════════════════════╤══════╤══════════╤═══════════╤═══════╤═══════════╗ ║ ID │ Out #1 │ Out #2 │ Name │ Arguments │ Mode │ Units In │ Units Out │ Ratio │ Time (ms) ║ ╠════╪════════╪════════╪══════════════════════╪════════════════════════════════════════════════════════════╪══════╪══════════╪═══════════╪═══════╪═══════════╣ ║ 0 │ 1 │ - │ DFESolutionInjection │ outSchema=[?n, ?n_code2] │ - │ 0 │ 1 │ 0.00 │ 0.02 ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 1 │ 2 │ 3 │ DFETee │ - │ - │ 1 │ 2 │ 2.00 │ 0.02 ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 2 │ 4 │ - │ DFEDistinctColumn │ column=?n │ - │ 1 │ 1 │ 1.00 │ 0.20 ║ ║ │ │ │ │ ordered=false │ │ │ │ │ ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 3 │ 5 │ - │ DFEHashIndexBuild │ vars=[?n] │ - │ 1 │ 1 │ 1.00 │ 0.04 ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 4 │ 5 │ - │ DFEPipelineJoin │ pattern=Node(?n) with property 'ALL' and label '?n_label1' │ - │ 1 │ 1 │ 1.00 │ 0.25 ║ ║ │ │ │ │ patternEstimate=3506 │ │ │ │ │ ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 5 │ 6 │ 7 │ DFESync │ - │ - │ 2 │ 2 │ 1.00 │ 0.02 ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 6 │ 8 │ - │ DFEForwardValue │ - │ - │ 1 │ 1 │ 1.00 │ 0.01 ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 7 │ 8 │ - │ DFEForwardValue │ - │ - │ 1 │ 1 │ 1.00 │ 0.01 ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 8 │ 9 │ - │ DFEHashIndexJoin │ - │ - │ 2 │ 1 │ 0.50 │ 0.35 ║ ╟────┼────────┼────────┼──────────────────────┼────────────────────────────────────────────────────────────┼──────┼──────────┼───────────┼───────┼───────────╢ ║ 9 │ - │ - │ DFEDrain │ - │ - │ 1 │ 0 │ 0.00 │ 0.02 ║ ╚════╧════════╧════════╧══════════════════════╧════════════════════════════════════════════════════════════╧══════╧══════════╧═══════════╧═══════╧═══════════╝
No nível superior, SolutionInjection
aparece antes de tudo, com uma unidade de saída. Observe que, na verdade, ele não injeta nenhuma solução. Você pode ver que o próximo operador, DFESubquery
, tem 0 unidade de entrada.
DepoisSolutionInjection
, no nível superior, estão DFESubquery
e os TermResolution
operadores. DFESubquery
encapsula as partes do plano de execução da consulta que estão sendo enviadas ao DFEmecanismo (para openCypher consultas, todo o plano de consulta é executado pelo). DFE Todos os operadores no plano de consulta estão aninhados dentro de subQuery1
que é referenciado por DFESubquery
. A única exceção éTermResolution
, que se materializa internamente IDs em objetos totalmente serializados openCypher .
Todos os operadores que são empurrados para o DFE motor têm nomes que começam com um DFE
prefixo. Conforme mencionado acima, todo o plano de openCypher consulta é executado peloDFE, portanto, todos os operadores, exceto o TermResolution
operador final, começam comDFE
.
Dentro de subQuery1
, pode haver zero ou mais operadores DFEChunkLocalSubQuery
ou DFELoopSubQuery
que encapsulam uma parte do plano de execução enviado que é executado em um mecanismo limitado pela memória. DFEChunkLocalSubQuery
aqui contém uma SolutionInjection
que é usada como entrada para a subconsulta. Para encontrar a tabela dessa subconsulta na saída, procure o subQuery=
especificado na coluna graph URI
Arguments
para o operador DFEChunkLocalSubQuery
ou DFELoopSubQuery
.
Em subQuery1
, DFEPipelineScan
com ID
0 verifica o banco de dados em busca de um pattern
especificado. O padrão verifica uma entidade com a propriedade code
salva como uma variável ?n_code2
em todos os rótulos (você pode filtrar por um rótulo específico anexando airport
a n:airport
). O argumento inlineFilters
mostra a filtragem da propriedade code
igualando ATL
.
Depois, o operador DFEChunkLocalSubQuery
une os resultados intermediários de uma subconsulta que contém DFEPipelineJoin
. Isso garante que ?n
seja realmente um nó, já que a DFEPipelineScan
anterior verifica qualquer entidade com a propriedade code
.