{"id":15705,"date":"2024-05-09T10:03:54","date_gmt":"2024-05-09T17:03:54","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=15705"},"modified":"2024-05-22T13:47:54","modified_gmt":"2024-05-22T20:47:54","slug":"query-graph-recursive-cte","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/query-graph-recursive-cte\/","title":{"rendered":"Modelos de gr\u00e1ficos de consulta com CTE recursivo do Couchbase"},"content":{"rendered":"<p><span style=\"font-weight: 400;\">As express\u00f5es de tabela comum (CTEs) recursivas e o CONNECT BY do Oracle s\u00e3o constru\u00e7\u00f5es SQL bem conhecidas entre os usu\u00e1rios de RDBMS, facilitando a delega\u00e7\u00e3o da explora\u00e7\u00e3o de estruturas de dados complexas e interdependentes \u00e0 camada de banco de dados para aumentar a efici\u00eancia do processamento.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Essas constru\u00e7\u00f5es s\u00e3o essenciais para a consulta de estruturas de dados interdependentes, um requisito comum em v\u00e1rios setores, incluindo finan\u00e7as, gerenciamento da cadeia de suprimentos, gerenciamento de relacionamento com o cliente (CRM), reservas de viagens e, mais recentemente, redes sociais. Reconhecendo sua import\u00e2ncia, todos os principais sistemas de gerenciamento de bancos de dados relacionais (RDBMS), como PostgreSQL, MySQL (a partir da vers\u00e3o 8.0), SQL Server, Oracle e SQLite, oferecem suporte a CTEs recursivos.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Por outro lado, os bancos de dados NoSQL, que s\u00e3o projetados para gerenciar uma s\u00e9rie diversificada de modelos de dados, como documentos, valores-chave, colunas amplas e dados de gr\u00e1ficos, priorizam a escalabilidade, a alta disponibilidade, a flexibilidade e o desempenho em sistemas distribu\u00eddos. Nesses ambientes, o conceito de CTE, recursivo ou n\u00e3o, n\u00e3o \u00e9 abordado diretamente. Os usu\u00e1rios geralmente recorrem a solu\u00e7\u00f5es especializadas, como bancos de dados de gr\u00e1ficos - Cypher para Neo4J e AQL para ArangoDB, por exemplo - para lidar com estruturas de dados complexas.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">O Couchbase se diferencia com o SQL para JSON, oferecendo uma abordagem exclusiva para CTEs recursivos que tamb\u00e9m ampliam seu suporte a v\u00e1rios modelos. Este blog se aprofundar\u00e1 em tr\u00eas t\u00f3picos principais:<\/span><\/p>\n<ol>\n<li style=\"list-style-type: none;\">\n<ol>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Como voc\u00ea pode aproveitar um \u00fanico DBMS como o Couchbase para estruturas de dados complexas para v\u00e1rios casos de uso, da mesma forma que o RDBMS, mas sem a necessidade de um banco de dados mais dedicado.\u00a0<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">O uso da constru\u00e7\u00e3o Couchase SQL++ para consultar, transformar e projetar essas rela\u00e7\u00f5es complexas usando uma constru\u00e7\u00e3o SQL que \u00e9 familiar aos usu\u00e1rios de RDBMS.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Pr\u00e1ticas recomendadas para gerenciar o consumo de recursos com o CTE recursivo.<\/span><\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<h2><span style=\"font-weight: 400;\">Caso de uso da lista de materiais<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">A lista t\u00e9cnica \u00e9 um componente essencial na fabrica\u00e7\u00e3o e na engenharia, detalhando as mat\u00e9rias-primas, pe\u00e7as e componentes necess\u00e1rios para fabricar um produto. Ela geralmente tem uma estrutura hier\u00e1rquica, em que as pe\u00e7as s\u00e3o compostas de outras pe\u00e7as ou materiais.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Este exemplo incluir\u00e1 os componentes e subcomponentes b\u00e1sicos de um computador desktop.<\/span><\/p>\n<table>\n<tbody>\n<tr>\n<td><b>ID do componente<\/b><\/td>\n<td><b>ComponentName<\/b><\/td>\n<td><b>ParentComponentID<\/b><\/td>\n<td><b>Quantidade<\/b><\/td>\n<\/tr>\n<tr>\n<td><span>1<\/span><\/td>\n<td><span>Computador de mesa<\/span><\/td>\n<td><span>nulo<\/span><\/td>\n<td><span>1<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>2<\/span><\/td>\n<td><span>Placa-m\u00e3e<\/span><\/td>\n<td><span>1<\/span><\/td>\n<td><span>1<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>3<\/span><\/td>\n<td><span>CPU<\/span><\/td>\n<td><span>2<\/span><\/td>\n<td><span>1<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>3<\/span><\/td>\n<td><span>Ventilador da CPU<\/span><\/td>\n<td><span>3<\/span><\/td>\n<td><span>1<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>4<\/span><\/td>\n<td><span>GPU<\/span><\/td>\n<td><span>2<\/span><\/td>\n<td><span>1<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>5<\/span><\/td>\n<td><span>RAM<\/span><\/td>\n<td><span>2<\/span><\/td>\n<td><span>4<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>6<\/span><\/td>\n<td><span>Unidade M.2<\/span><\/td>\n<td><span>2<\/span><\/td>\n<td><span>1<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>7<\/span><\/td>\n<td><span>SSD<\/span><\/td>\n<td><span>2<\/span><\/td>\n<td><span>1<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>8<\/span><\/td>\n<td><span>Fonte de alimenta\u00e7\u00e3o<\/span><\/td>\n<td><span>1<\/span><\/td>\n<td><span>1<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>9<\/span><\/td>\n<td><span>Caso<\/span><\/td>\n<td><span>1<\/span><\/td>\n<td><span>1<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>10<\/span><\/td>\n<td><span>Ventiladores de resfriamento do gabinete<\/span><\/td>\n<td><span>1<\/span><\/td>\n<td><span>4<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><span style=\"font-weight: 400;\">Digamos que queremos listar todas as pe\u00e7as e subpe\u00e7as necess\u00e1rias para montar um computador desktop, juntamente com as quantidades necess\u00e1rias para cada uma delas.<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\">WITH RECURSIVE ComponentHierarchy AS (\r\n    SELECT\r\n        ComponentID,\r\n        ComponentName,\r\n        ParentComponentID,\r\n        Quantity,\r\n        1 AS Lvl -- N\u00edvel de profundidade na hierarquia\r\n    DE\r\n        componentes\r\n    WHERE\r\n        ParentComponentID IS NULL -- Ponto de partida: o pr\u00f3prio computador desktop\r\n\r\n    UNION ALL\r\n\r\n    SELECT\r\n        c.ComponentID,\r\n        c.ComponentName,\r\n        c.ParentComponentID,\r\n        ch.Quantity * c.Quantity AS Quantity, -- Calcular a quantidade total necess\u00e1ria em cada n\u00edvel\r\n        ch.lvl + 1 -- Incrementa o n\u00edvel para cada etapa de recurs\u00e3o\r\n    DE\r\n        componentes c\r\n    JOIN\r\n        ComponentHierarchy ch ON c.ParentComponentID = ch.ComponentID\r\n)\r\nSELECT * FROM ComponentHierarchy;<\/pre>\n<p><span style=\"font-weight: 400;\">Essa consulta inicializa a recurs\u00e3o com o item de n\u00edvel superior (o computador de mesa) e junta recursivamente a tabela de componentes com ela mesma para percorrer a hierarquia, ajustando as quantidades conforme necess\u00e1rio para cada componente e subcomponente.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">O resultado listar\u00e1 todas as pe\u00e7as necess\u00e1rias para o computador de mesa, incluindo a quantidade de cada uma e seu n\u00edvel hier\u00e1rquico, o que pode ser \u00fatil para entender a estrutura de montagem ou para fins de invent\u00e1rio e pedido.<\/span><\/p>\n<h3><span style=\"font-weight: 400;\">Explica\u00e7\u00e3o<\/span><\/h3>\n<p><span style=\"font-weight: 400;\">O CTE come\u00e7a com o Bicycle (onde ParentPartID \u00e9 NULL) e, em seguida, procura recursivamente todos os componentes e subcomponentes.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">A quantidade \u00e9 ajustada em cada n\u00edvel para refletir o n\u00famero total necess\u00e1rio para uma bicicleta.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">A coluna N\u00edvel, embora n\u00e3o seja estritamente necess\u00e1ria para todas as an\u00e1lises de lista t\u00e9cnica, ajuda a entender a profundidade de cada pe\u00e7a na hierarquia.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Essa abordagem permite uma an\u00e1lise detalhada de todos os materiais e componentes necess\u00e1rios para a fabrica\u00e7\u00e3o de um produto, o que \u00e9 essencial para o gerenciamento de estoque, a estimativa de custos e o planejamento da produ\u00e7\u00e3o nas opera\u00e7\u00f5es de fabrica\u00e7\u00e3o.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Caso de uso de rede social<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Uma aplica\u00e7\u00e3o comum em um caso de uso de rede social \u00e9 encontrar os graus de conex\u00e3o entre dois usu\u00e1rios - essencialmente, como os usu\u00e1rios est\u00e3o conectados por meio de uma cadeia de amigos em comum. Digamos que precisamos determinar o caminho mais curto (em termos de graus de conex\u00e3o) entre dois usu\u00e1rios em uma rede social. Isso pode ajudar em recursos como a sugest\u00e3o de amizades ou a compreens\u00e3o da din\u00e2mica da rede.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Considere que temos os seguintes usu\u00e1rios e como eles s\u00e3o amigos uns dos outros, por exemplo, Alice \u00e9 amiga de Bob e tamb\u00e9m de Charlie. Mas Alice n\u00e3o \u00e9 amiga de Dana.<\/span><\/p>\n<p><br style=\"font-weight: 400;\" \/><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-15706\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2024\/05\/image1.png\" alt=\"\" width=\"624\" height=\"129\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/image1.png 624w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/image1-300x62.png 300w\" sizes=\"auto, (max-width: 624px) 100vw, 624px\" \/><br style=\"font-weight: 400;\" \/><br style=\"font-weight: 400;\" \/><\/p>\n<p><span style=\"font-weight: 400;\">Nessa rede expandida, os usu\u00e1rios s\u00e3o conectados de v\u00e1rias maneiras, criando v\u00e1rios caminhos pelos quais os usu\u00e1rios podem se conectar.<\/span><\/p>\n<p><span style=\"font-weight: 400;\">Vamos encontrar os graus de conex\u00e3o entre Alice[1] e Frank[6], incluindo os nomes dos usu\u00e1rios ao longo do caminho.<\/span><\/p>\n<pre class=\"nums:false lang:default decode:true\">WITH RECURSIVE ConnectionPath AS (\r\n    SELECT\r\n        u1.UserID,\r\n        u1.UserName AS StartUser,\r\n        u2.UserID AS FriendID,\r\n        u2.UserName AS FriendName,\r\n        1 AS Degree\r\n    DE\r\n        conex\u00f5es_de_usu\u00e1rio uc\r\n    JOIN\r\n        users u1 ON uc.UserID = u1.UserID\r\n    JOIN\r\n        usu\u00e1rios u2 ON uc.FriendID = u2.UserID\r\n    WHERE\r\n        u1.UserID = 1 -- Usu\u00e1rio inicial (Alice)\r\n    \r\n    UNION ALL\r\n    \r\n    SELECT\r\n        cp.UserID,\r\n        cp.StartUser,\r\n        u.UserID AS FriendID,\r\n        u.UserName AS FriendName,\r\n        cp.Degree + 1\r\n    DE\r\n        ConnectionPath cp\r\n    JOIN\r\n        user_connections uc ON cp.FriendID = uc.UserID\r\n    JOIN\r\n        usu\u00e1rios u ON uc.FriendID = u.UserID\r\n    WHERE\r\n        uc.FriendID NOT IN (cp.UserID) -- Evite loops ao n\u00e3o revisitar o usu\u00e1rio inicial\r\n)\r\nSELECT * FROM ConnectionPath\r\nWHERE FriendID = 6 -- Usu\u00e1rio-alvo (Frank)\r\nORDER BY Degree ASC;<\/pre>\n<h3><span style=\"font-weight: 400;\">Explica\u00e7\u00e3o<\/span><\/h3>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Caso base: o CTE come\u00e7a identificando as conex\u00f5es diretas de Alice (UserID 1), incluindo nomes de usu\u00e1rios para facilitar a leitura.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Etapa recursiva: Em seguida, ele encontra recursivamente os amigos dessas conex\u00f5es, ampliando a pesquisa e monitorando o grau de conex\u00e3o. Os JOINs garantem que os nomes de usu\u00e1rio sejam inclu\u00eddos tanto para o usu\u00e1rio inicial quanto para seus amigos em cada etapa.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">Termina\u00e7\u00e3o e filtragem: A recurs\u00e3o continua at\u00e9 encontrar conex\u00f5es com Frank (ID de usu\u00e1rio 6). A consulta filtra os caminhos que levam a Frank e ordena os resultados pelo grau de conex\u00e3o para identificar os caminhos mais curtos.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><span style=\"font-weight: 400;\">Esta consulta demonstra como rastrear e enumerar caminhos em uma rede social, incluindo nomes de usu\u00e1rios para maior clareza. Ela fornece uma base para an\u00e1lises mais complexas, como a identifica\u00e7\u00e3o de todas as conex\u00f5es m\u00fatuas ou a explora\u00e7\u00e3o de estruturas de rede.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Caso de uso de travessia de rede de gr\u00e1ficos<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Para este caso de uso, usarei uma vers\u00e3o resumida dos dados de rota da America Airlines. Observe que isso n\u00e3o \u00e9 da amostra de viagens do Couchbase. Neste exemplo, usamos a consulta CTE recursiva SQL++ do Couchbase para encontrar todos os voos de LAX para MAD com menos de 2 paradas nesse conjunto de dados de amostra. <\/span><i><span style=\"font-weight: 400;\">Note that this sample data is not based on the `travel-sample`, but\u00a0 a simplified version of the AA routes for 2008.\u00a0<\/span><\/i><\/p>\n<table>\n<tbody>\n<tr>\n<td><b>c\u00f3digo_do_aeroporto_de_origem<\/b><\/td>\n<td><b>c\u00f3digo_do_aeroporto_destino<\/b><\/td>\n<td><b>companhia a\u00e9rea<\/b><\/td>\n<\/tr>\n<tr>\n<td><span>LAX<\/span><\/td>\n<td><span>MAD<\/span><\/td>\n<td><span>AA<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>LAX<\/span><\/td>\n<td><span>LHR<\/span><\/td>\n<td><span>AA<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>LHR<\/span><\/td>\n<td><span>MAD<\/span><\/td>\n<td><span>AA<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>LAX<\/span><\/td>\n<td><span>OPO<\/span><\/td>\n<td><span>AA<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>OPO<\/span><\/td>\n<td><span>MAD<\/span><\/td>\n<td><span>AA<\/span><\/td>\n<\/tr>\n<tr>\n<td><span>MAD<\/span><\/td>\n<td><span>OPO<\/span><\/td>\n<td><span>AA<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<table>\n<tbody>\n<tr>\n<td><b>Consulta SQL++<\/b><\/td>\n<td><b>Resultados<\/b><\/td>\n<\/tr>\n<tr>\n<td><i><span>\/* Lista de todas as rotas de LAX para MAD com &lt; 2 paradas *\/<\/span><\/i><span><br \/>\n<\/span><span>COM RECURSIVO RouteCTE COMO (<\/span><span><br \/>\n<\/span><span>\u00a0 <\/span><b>SELECIONAR<\/b><span> [r.source_airport_code,\u00a0\u00a0\u00a0<\/span><\/p>\n<p><span>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0r.destination_airport_code] <\/span><b>AS<\/b><span> rota,<\/span><span><br \/>\n<\/span><span> \u00a0 \u00a0 \u00a0 \u00a0 r.destination_airport_code <\/span><b>AS<\/b><span> lastStop,<\/span><span><br \/>\n<\/span><span> \u00a0 \u00a0 \u00a0 \u00a0 <\/span><span>1<\/span> <b>AS<\/b><span> profundidade<\/span><span><br \/>\n<\/span><span>\u00a0 <\/span><b>DE<\/b><span> rotas r<\/span><span><br \/>\n<\/span><span>\u00a0 <\/span><b>ONDE<\/b><span> r.source_airport_code = <\/span><span>\"LAX<\/span><span><br \/>\n<\/span><b>UNI\u00c3O<\/b> <b>TODOS<\/b><span><br \/>\n<\/span><span>\u00a0 <\/span><b>SELECIONAR<\/b> <span>ARRAY_APPEND<\/span><span>(r.route,f.destination_airport_code) <\/span><b>como<\/b><span> rota,<\/span><span><br \/>\n<\/span><span> \u00a0 \u00a0 \u00a0 \u00a0 f.destination_airport_code <\/span><b>AS<\/b><span> lastStop,<\/span><span><br \/>\n<\/span><span> \u00a0 \u00a0 \u00a0 \u00a0 r.profundidade + <\/span><span>1<\/span> <b>AS<\/b><span> profundidade<\/span><span><br \/>\n<\/span><span>\u00a0 <\/span><b>DE<\/b><span> RouteCTE r<\/span><span><br \/>\n<\/span><span>\u00a0 <\/span><b>JUNTAR<\/b><span> rotas f <\/span><b>ON<\/b><span> r.lastStop = f.source_airport_code<\/span><span><br \/>\n<\/span><span>\u00a0 <\/span><b>ONDE<\/b><span> f.destination_airport_code != <\/span><span>\"LAX<\/span> <b>E<\/b><span> r.depth &lt; <\/span><span>3<\/span><span><br \/>\n<\/span><span>)<\/span><\/p>\n<p><b>OP\u00c7\u00d5ES<\/b><span> {\"levels\":3}<\/span><span><br \/>\n<\/span><b>SELECIONAR<\/b><span> r.*<\/span><span><br \/>\n<\/span><b>DE<\/b><span> RouteCTE <\/span><b>AS<\/b><span> r<\/span><span><br \/>\n<\/span><b>ONDE<\/b><span> r.lastStop = <\/span><span>'MAD'<\/span><span><br \/>\n<\/span><span>E r.depth &lt; 3;<\/span><\/td>\n<td><span>[ <\/span><span><br \/>\n<\/span><span>\u00a0 {<\/span><span><br \/>\n<\/span><span> \u00a0 \u00a0 \"route\": [<\/span><span><br \/>\n<\/span><span>\u00a0 \u00a0 \u00a0 <\/span> <span>\"LAX\",<\/span><span><br \/>\n<\/span><span> \u00a0 \u00a0 <\/span> <span>\"MAD\"<\/span><span><br \/>\n<\/span><span>\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ]<\/span><span><br \/>\n<\/span><span>\u00a0 },<\/span><span><br \/>\n<\/span><span>\u00a0 {<\/span><span><br \/>\n<\/span><span>\u00a0 \u00a0 \"route\": [<\/span><span><br \/>\n<\/span><span> \u00a0 \u00a0 <\/span> <span> \"LAX\",<\/span><span><br \/>\n<\/span><span>\u00a0 \u00a0 \u00a0 <\/span> <span> \"LHR\",<\/span><span><br \/>\n<\/span><span>\u00a0 \u00a0 \u00a0 <\/span> <span> \"MAD\"<\/span><span><br \/>\n<\/span><span> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ]<\/span><span><br \/>\n<\/span><span>\u00a0 },<\/span><span><br \/>\n<\/span><span>\u00a0 {<\/span><span><br \/>\n<\/span><span>\u00a0 \u00a0 \"route\": [<\/span><span><br \/>\n<\/span><span> \u00a0 \u00a0 <\/span> <span>\"LAX\",<\/span><span><br \/>\n<\/span><span>\u00a0 \u00a0 \u00a0 <\/span> <span>\"OPO\",<\/span><span><br \/>\n<\/span><span>\u00a0 \u00a0 \u00a0 <\/span> <span>\"MAD\"<\/span><span><br \/>\n<\/span><span> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 ]<\/span><span><br \/>\n<\/span><span>\u00a0 }<\/span><span><br \/>\n<\/span><span>]<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3><span style=\"font-weight: 400;\">Explica\u00e7\u00e3o<\/span><\/h3>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">A rotaCTE come\u00e7a com todos os voos que partem do LAX.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">A parte recursiva do routeCTE procura voos que se conectem a partir da \u00faltima parada na rota atual para outros aeroportos, evitando rotas que retornem ao LAX.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">A matriz de rota acumula a sequ\u00eancia de c\u00f3digos de aeroporto para mostrar o caminho percorrido.<\/span><\/li>\n<li style=\"font-weight: 400;\" aria-level=\"1\"><span style=\"font-weight: 400;\">A consulta gera todas as rotas que terminam em MAD, detalhando os caminhos encontrados.<\/span><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2><span style=\"font-weight: 400;\">Pr\u00e1ticas recomendadas CTE recursivo<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Ao usar CTEs (Common Table Expressions, express\u00f5es de tabela comum) recursivas no SQL++, os desenvolvedores devem estar cientes das implica\u00e7\u00f5es da natureza recursiva e do custo do processamento da consulta. Aqui est\u00e3o as pr\u00e1ticas recomendadas:<\/span><\/p>\n<p style=\"padding-left: 40px;\"><b>Definir limites para a profundidade da recurs\u00e3o<\/b><span style=\"font-weight: 400;\"> - Sempre defina um limite para a profundidade da recurs\u00e3o para evitar loops infinitos e consumo excessivo de recursos. Use um contador ou uma condi\u00e7\u00e3o dentro do CTE recursivo para controlar a profundidade da recurs\u00e3o; inclua os limites das op\u00e7\u00f5es.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><b>Monitorar o desempenho <\/b><span style=\"font-weight: 400;\">- Os CTEs recursivos podem consumir muitos recursos. Monitore o desempenho de perto, especialmente em consultas longas ou complexas, e otimize-as conforme necess\u00e1rio. Isso pode envolver a indexa\u00e7\u00e3o ou a quebra de CTEs excessivamente complexos.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><b>Evite complexidades desnecess\u00e1rias<\/b><span style=\"font-weight: 400;\"> - Mantenha a l\u00f3gica dentro da parte recursiva do CTE o mais simples poss\u00edvel. Condi\u00e7\u00f5es ou c\u00e1lculos excessivamente complexos podem prejudicar significativamente o desempenho. Verifique se a condi\u00e7\u00e3o JOIN est\u00e1 correta.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><b>Garantir a estrutura correta dos dados<\/b><span style=\"font-weight: 400;\"> - Verifique se seus dados est\u00e3o estruturados corretamente para a recurs\u00e3o. Dados incorretos ou malformados podem levar a resultados incorretos ou a consultas ineficientes.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><b>Teste extensivamente<\/b><span style=\"font-weight: 400;\"> - Teste exaustivamente os CTEs recursivos com v\u00e1rios conjuntos de dados, inclusive casos extremos. Isso ajuda a detectar quaisquer problemas com loops infinitos, resultados incorretos ou gargalos de desempenho.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><b>Definir a cota de mem\u00f3ria<\/b><span style=\"font-weight: 400;\"> - Defina a cota de mem\u00f3ria no n\u00edvel da solicita\u00e7\u00e3o ou do n\u00f3 para evitar o uso excessivo de mem\u00f3ria na consulta recursiva.<\/span><\/p>\n<h2><span style=\"font-weight: 400;\">Limita\u00e7\u00f5es<\/span><\/h2>\n<p><span style=\"font-weight: 400;\">Os CTEs recursivos s\u00e3o um recurso poderoso do Couchbase SQL++, comumente encontrado em outros RDBMS. Eles permitem a execu\u00e7\u00e3o de consultas complexas, como percorrer dados hier\u00e1rquicos e de rede de gr\u00e1ficos ou realizar c\u00e1lculos iterativos que s\u00e3o dif\u00edceis de expressar com o SQL padr\u00e3o. Entretanto, h\u00e1 limita\u00e7\u00f5es e considera\u00e7\u00f5es que devem ser levadas em conta ao usar CTEs recursivos. Essas limita\u00e7\u00f5es geralmente est\u00e3o relacionadas ao desempenho, \u00e0s restri\u00e7\u00f5es de sintaxe e \u00e0 complexidade das consultas. Aqui est\u00e3o alguns detalhes espec\u00edficos:<\/span><\/p>\n<p style=\"padding-left: 40px;\"><b>Agregados:<\/b><span style=\"font-weight: 400;\"> Os CTEs recursivos normalmente n\u00e3o permitem fun\u00e7\u00f5es de agrega\u00e7\u00e3o (MIN(), MAX(), SUM(), AVG() etc.) ou DISTINCT na parte recursiva do CTE. Essas opera\u00e7\u00f5es n\u00e3o fazem sentido no contexto da adi\u00e7\u00e3o recursiva de linhas porque implicam em um conjunto de resultados finais ap\u00f3s a resolu\u00e7\u00e3o de toda a recurs\u00e3o.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><b>Fun\u00e7\u00f5es da janela<\/b><span style=\"font-weight: 400;\">: Assim como as fun\u00e7\u00f5es agregadas, as fun\u00e7\u00f5es de janela (ROW_NUMBER(), RANK() etc.) geralmente n\u00e3o s\u00e3o usadas na parte recursiva do CTE. Elas s\u00e3o destinadas ao uso em um conjunto de linhas retornadas pela consulta, o que as torna adequadas para o termo n\u00e3o recursivo ou em uma consulta que seleciona a partir do CTE recursivo.<\/span><\/p>\n<p style=\"padding-left: 40px;\"><b>LIMITE \/ PEDIDO POR<\/b><span style=\"font-weight: 400;\">: Essas cl\u00e1usulas n\u00e3o s\u00e3o permitidas no membro recursivo do CTE. O racioc\u00ednio \u00e9 que elas se referem \u00e0 ordena\u00e7\u00e3o do conjunto de resultados finais e n\u00e3o fazem sentido no contexto da constru\u00e7\u00e3o do conjunto recursivo, em que os resultados intermedi\u00e1rios s\u00e3o constru\u00eddos cumulativamente em cada itera\u00e7\u00e3o.<\/span><\/p>\n<h2>Pr\u00f3ximas etapas<\/h2>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Saiba mais sobre <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/products\/n1ql\/\">Couchbase SQL++<\/a><\/li>\n<li>Mais exemplos de CTE no blog: <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/recursive-query-processing-in-sql-n1ql\/\">Processamento de consultas recursivas em SQL++<\/a> (N1QL)<\/li>\n<li>Comece com um <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/products\/capella\/\">Avalia\u00e7\u00e3o gratuita do Couchbase Capella<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>Recursive Common Table Expressions (CTEs) and Oracle&#8217;s CONNECT BY are well-known SQL constructs among RDBMS users, facilitating the delegation of complex, interdependent data structure exploration to the database layer for enhanced processing efficiency. These constructs are crucial for querying interdependent [&hellip;]<\/p>","protected":false},"author":26326,"featured_media":15707,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,2225,1816,1812],"tags":[9945,1726],"ppma_author":[8919],"class_list":["post-15705","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-cloud","category-couchbase-server","category-n1ql-query","tag-couchbase-7-6","tag-graph-database"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.1 (Yoast SEO v26.1.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Query Graph Models With Couchbase Recursive CTE - The Couchbase Blog<\/title>\n<meta name=\"description\" content=\"Couchbase sets itself apart with SQL for JSON, offering a unique approach to Recursive CTEs that also extend its multi model support.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/pt\/query-graph-recursive-cte\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Query Graph Models With Couchbase Recursive CTE\" \/>\n<meta property=\"og:description\" content=\"Couchbase sets itself apart with SQL for JSON, offering a unique approach to Recursive CTEs that also extend its multi model support.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/query-graph-recursive-cte\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2024-05-09T17:03:54+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-05-22T20:47:54+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2024\/05\/graph-network-query-scaled.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2560\" \/>\n\t<meta property=\"og:image:height\" content=\"1707\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Binh Le\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Binh Le\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/\"},\"author\":{\"name\":\"Binh Le\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/f89064928e262c71eb43bee996c48c63\"},\"headline\":\"Query Graph Models With Couchbase Recursive CTE\",\"datePublished\":\"2024-05-09T17:03:54+00:00\",\"dateModified\":\"2024-05-22T20:47:54+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/\"},\"wordCount\":1549,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/graph-network-query-scaled.jpg\",\"keywords\":[\"Couchbase 7.6\",\"graph database\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Couchbase Capella\",\"Couchbase Server\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/\",\"name\":\"Query Graph Models With Couchbase Recursive CTE - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/graph-network-query-scaled.jpg\",\"datePublished\":\"2024-05-09T17:03:54+00:00\",\"dateModified\":\"2024-05-22T20:47:54+00:00\",\"description\":\"Couchbase sets itself apart with SQL for JSON, offering a unique approach to Recursive CTEs that also extend its multi model support.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/graph-network-query-scaled.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/graph-network-query-scaled.jpg\",\"width\":2560,\"height\":1707},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Query Graph Models With Couchbase Recursive CTE\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/f89064928e262c71eb43bee996c48c63\",\"name\":\"Binh Le\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/5b68c37e30928a9d7b2c8470b1a303b7\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/a939f48df6447844a8780bec264bb3be21d589336f3915fabc557075a68fa374?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/a939f48df6447844a8780bec264bb3be21d589336f3915fabc557075a68fa374?s=96&d=mm&r=g\",\"caption\":\"Binh Le\"},\"description\":\"Binh Le is a Principal Product Manager for Couchbase Query service. Prior to Couchbase, he worked at Oracle and led the product management team for Sales Cloud Analytics and CRM OnDemand. Binh holds a Bachelor's Degree in Computer Science from the University of Brighton, UK.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/binh-le-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Query Graph Models With Couchbase Recursive CTE - The Couchbase Blog","description":"O Couchbase se diferencia com o SQL para JSON, oferecendo uma abordagem exclusiva para CTEs recursivos que tamb\u00e9m ampliam seu suporte a v\u00e1rios modelos.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/pt\/query-graph-recursive-cte\/","og_locale":"pt_BR","og_type":"article","og_title":"Query Graph Models With Couchbase Recursive CTE","og_description":"Couchbase sets itself apart with SQL for JSON, offering a unique approach to Recursive CTEs that also extend its multi model support.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/query-graph-recursive-cte\/","og_site_name":"The Couchbase Blog","article_published_time":"2024-05-09T17:03:54+00:00","article_modified_time":"2024-05-22T20:47:54+00:00","og_image":[{"width":2560,"height":1707,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2024\/05\/graph-network-query-scaled.jpg","type":"image\/jpeg"}],"author":"Binh Le","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Binh Le","Est. reading time":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/"},"author":{"name":"Binh Le","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/f89064928e262c71eb43bee996c48c63"},"headline":"Query Graph Models With Couchbase Recursive CTE","datePublished":"2024-05-09T17:03:54+00:00","dateModified":"2024-05-22T20:47:54+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/"},"wordCount":1549,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/graph-network-query-scaled.jpg","keywords":["Couchbase 7.6","graph database"],"articleSection":["Best Practices and Tutorials","Couchbase Capella","Couchbase Server","SQL++ \/ N1QL Query"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/","url":"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/","name":"Query Graph Models With Couchbase Recursive CTE - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/graph-network-query-scaled.jpg","datePublished":"2024-05-09T17:03:54+00:00","dateModified":"2024-05-22T20:47:54+00:00","description":"O Couchbase se diferencia com o SQL para JSON, oferecendo uma abordagem exclusiva para CTEs recursivos que tamb\u00e9m ampliam seu suporte a v\u00e1rios modelos.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/graph-network-query-scaled.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2024\/05\/graph-network-query-scaled.jpg","width":2560,"height":1707},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/query-graph-recursive-cte\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Query Graph Models With Couchbase Recursive CTE"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"Blog do Couchbase","description":"Couchbase, o banco de dados NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/f89064928e262c71eb43bee996c48c63","name":"Binh Le","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/5b68c37e30928a9d7b2c8470b1a303b7","url":"https:\/\/secure.gravatar.com\/avatar\/a939f48df6447844a8780bec264bb3be21d589336f3915fabc557075a68fa374?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a939f48df6447844a8780bec264bb3be21d589336f3915fabc557075a68fa374?s=96&d=mm&r=g","caption":"Binh Le"},"description":"Binh Le \u00e9 gerente de produto principal do servi\u00e7o Couchbase Query. Antes da Couchbase, ele trabalhou na Oracle e liderou a equipe de gerenciamento de produtos para Sales Cloud Analytics e CRM OnDemand. Binh \u00e9 bacharel em Ci\u00eancia da Computa\u00e7\u00e3o pela Universidade de Brighton, no Reino Unido.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/binh-le-2\/"}]}},"authors":[{"term_id":8919,"user_id":26326,"is_guest":0,"slug":"binh-le-2","display_name":"Binh Le","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/a939f48df6447844a8780bec264bb3be21d589336f3915fabc557075a68fa374?s=96&d=mm&r=g","author_category":"","last_name":"Le","first_name":"Binh","job_title":"","user_url":"","description":"Binh Le \u00e9 gerente de produto principal do servi\u00e7o de consulta do Couchbase. Antes da Couchbase, ele trabalhou na Oracle e liderou a equipe de gerenciamento de produtos para Sales Clould Analytics e CRM OnDemand. Binh \u00e9 bacharel em Ci\u00eancia da Computa\u00e7\u00e3o pela Universidade de Brighton, no Reino Unido."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/15705","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/26326"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=15705"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/15705\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/15707"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=15705"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=15705"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=15705"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=15705"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}