O openCypher explain recurso - Amazon Neptune

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=mode, em que o mode valor pode ser um dos seguintes:

  • static: no modo static, o explain imprime somente a estrutura estática do plano de consulta. Na verdade, ele não executa a consulta.

  • dynamic: no modo dynamic, 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— No details 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. DFESubqueryencapsula 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=graph URI especificado na coluna 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.