Árvore de relacionamentos

Através da árvore de relacionamentos obtida no download e decriptação de relatórios da SP-API, é possível obter a relação de onde podem ser inseridos produtos dentro da estrutura da Amazon, bem como obter os seus Product Types.

Este caso de uso utilizou o JSON da árvore de relacionamentos que pode ser encontrado no link abaixo:

❗️

IMPORTANTE

Não recomendamos a utilização do JSON em anexo, ele pode estar desatualizado.
O recomendavel é sempre extrair o XML mais recente através do relatório GET_XML_BROWSE_TREE_DATA e então convertê-lo para o formato adequado.

Bem como o projeto json2graphql que realizou a importação desse JSON em uma instância Heroku GraphQL para testes.

Abaixo duas chaves de exemplo que ilustram a estrutura do JSON da árvore de relacionamentos:

{
 "Result": {
  "Node": [
   {
    "browseNodeId": "17938239011",
    "browseNodeAttributes": {
     "@count": "1",
     "attribute": {
      "@name": "recommended_browse_nodes",
      "#text": "17938239011"
     }
    },
    "browseNodeName": "Alexa Skills",
    "browseNodeStoreContextName": "Alexa Skills",
    "browsePathById": "17938238011,17938239011",
    "browsePathByName": "Alexa Skills",
    "hasChildren": "true",
    "childNodes": {
     "@count": "23",
     "id": [
      "18078004011",
      "18078005011",
      "18078006011",
      "18078007011",
      "18078008011",
      "18078065011",
      "18078009011",
      "18078010011",
      "18078011011",
      "18078012011",
      "18078013011",
      "18078014011",
      "18078015011",
      "18078016011",
      "18078017011",
      "18078018011",
      "18078019011",
      "18078020011",
      "18078021011",
      "18078039011",
      "18078022011",
      "18078023011",
      "18078024011"
     ]
    },
    "productTypeDefinitions": null,
    "refinementsInformation": {
     "@count": "0"
    }
   },
   {
    "browseNodeId": "18078004011",
    "browseNodeAttributes": {
     "@count": "1",
     "attribute": {
      "@name": "recommended_browse_nodes",
      "#text": "18078004011"
     }
    },
    "browseNodeName": "Carro Conectado",
    "browseNodeStoreContextName": "Carro Conectado",
    "browsePathById": "17938238011,17938239011,18078004011",
    "browsePathByName": "Alexa Skills,Carro Conectado",
    "hasChildren": "false",
    "childNodes": {
     "@count": "0"
    },
    "productTypeDefinitions": null,
    "refinementsInformation": {
     "@count": "0"
    }
   }
}

❗️

IMPORTANTE

Ao realizar a importação do JSON é necessário definir um ID para cada chave. Neste caso, o "browseNodeId" NÃO pode ser utilizado como ID (Chave primária), uma vez que existem chaves que podem repetir o mesmo "browseNodeId".

Neste caso recomenda-se criar um ID único para cada chave do JSON exemplo.

O que é a Árvore de Relacionamentos?

Analisando um Browse Node Id, existem as principais chaves:

{
    "browseNodeId": "19778190011",
    "browseNodeAttributes": {
     "@count": "1",
     "attribute": {
      "@name": "recommended_browse_nodes",
      "#text": "19778190011"
     }
    },
    "browseNodeName": "Espumante e Champanhe",
    "browseNodeStoreContextName": "Espumante e Champanhe",
    "browsePathById": "18991079011,18991080011,19778003011,19778049011,19778190011",
    "browsePathByName": "Alimentos e Bebidas,Bebidas Alcoólicas,Vinho,Espumante e Champanhe",
    "hasChildren": "true",
    "childNodes": {
     "@count": "5",
     "id": [
      "19955269011",
      "19955270011",
      "19955271011",
      "19955273011",
      "19955272011"
     ]
    },
    "productTypeDefinitions": "WINE",
    "refinementsInformation": {
     "@count": "0"
    }
}

Que podemos entender do seguinte modo (Exemplo: Espumante e Champanhe):

ChaveDescrição
"browseNodeId": "19778190011"Número identificador do nó
"browseNodeName": "Espumante
e Champanhe"
Nome do nó
"browsePathById": "18991079011,
18991080011,19778003011,
19778049011,19778190011"
Sequência dos nós predecessores (Esquerda para a Direita) de onde se encontra o nó principal:

18991079011 > 18991080011 > 19778003011 > 19778049011 > 19778190011
"browsePathByName": "Alimentos e Bebidas,Bebidas Alcoólicas,
Vinho,Espumante e Champanhe",
Sequência da descrição dos nós predecessores (Esquerda para a Direita) de onde se encontra o nó principal:

Alimentos e Bebidas > Bebidas Alcoólicas > Vinho > Espumante e Champanhe
"hasChildren": "true",
"childNodes": {
"@count": "5",
"id": [
"19955269011",
"19955270011",
"19955271011",
"19955273011",
"19955272011"
]
},
Se o nó atual possui filhos ou não. Neste caso, Espumante e Champanhe possuem 5 nós filhos.

IMPORTANTE destacar que no processo de cadastro de produtos é sempre indicado alocar um produto em um nó que preferencialmente não possua filhos (Leaf Node), pois saberemos que este é o nível mais granular da árvore de relacionamentos.
"productTypeDefinitions": "WINE",Tipo do produto com o qual pode-se encontrar os atributos relevantes de cada nó.

Exemplo - Encontrando o melhor lugar para cadastrar Vinho

Um dos casos de uso para o qual o JSON da árvore de relacionamentos pode ser utilizado é encontrar PTs (Product Types) para determinadas palavras-chave.
No exemplo abaixo foram realizadas buscas para tentar cadastrar um novo Vinho no inventário.

Essa busca utilizou simplesmente a palavra chave 'Vinho' para tentar encontrar o melhor local de inserção de um novo produto. Trazendo Product Type diferentes para o seu melhor caso de uso.

query MyQuery {
  Node(where: {browsePathByName: {_ilike: "%vinho%"}}, order_by: {productTypeDefinitions: desc}, distinct_on: productTypeDefinitions) {
    browseNodeName
    productTypeDefinitions
    browsePathByName
    browseNodeId
    childNodes
  }
}

O resultado foi que para a palavra 'Vinho' existem 4 diferentes Product Types que podem ser utilizados, cada qual com seu atributo específico.

{
  "data": {
    "Node": [
      {
        "browseNodeName": "Crémant",
        "productTypeDefinitions": "WINE",
        "browsePathByName": "Alimentos e Bebidas,Bebidas Alcoólicas,Vinho,Espumante e Champanhe,Crémant",
        "browseNodeId": 19955271011,
        "childNodes": ""
      },
      {
        "browseNodeName": "Vinho Tinto",
        "productTypeDefinitions": "VINEGAR",
        "browsePathByName": "Alimentos e Bebidas,Óleos, Azeites, Vinagres e Molhos para Salada,Vinagres,Vinho Tinto",
        "browseNodeId": 19955331011,
        "childNodes": ""
      },
      {
        "browseNodeName": "Vinho e bebidas",
        "productTypeDefinitions": "MOBILE_APPLICATION",
        "browsePathByName": "Apps e Jogos,Estilo de vida,Vinho e bebidas",
        "browseNodeId": 13941796011,
        "childNodes": ""
      },
      {
        "browseNodeName": "Jatobeba",
        "productTypeDefinitions": "GROCERY",
        "browsePathByName": "Alimentos e Bebidas,Bebidas Alcoólicas,Vinho,Jatobeba",
        "browseNodeId": 19955265011,
        "childNodes": ""
      }
    ]
  }
}

Se por acaso resolvêssemos ser um pouco mais específicos ao tentar encontrar um 'Vinagre de Vinho', a busca na árvore de nós poderia nos ajudar ao utilizar diversas palavras-chave concatenadas, por exemplo:

query MyQuery {
  Node(where: {browsePathByName: {_ilike: "%vinho%"}, _and: {browsePathByName: {_ilike: "%vinagre%"}}}, order_by: {productTypeDefinitions: desc}, distinct_on: productTypeDefinitions) {
    browseNodeName
    productTypeDefinitions
    browsePathByName
    browseNodeId
    childNodes
  }
}

Retornando apenas o valor mais adequado possível para a inserção do produto dentro da árvore de nós e categorias da Amazon:

{
  "data": {
    "Node": [
      {
        "browseNodeName": "Vinho Tinto",
        "productTypeDefinitions": "VINEGAR",
        "browsePathByName": "Alimentos e Bebidas,Óleos, Azeites, Vinagres e Molhos para Salada,Vinagres,Vinho Tinto",
        "browseNodeId": 19955331011,
        "childNodes": ""
      }
    ]
  }
}