{"id":52103,"date":"2025-04-23T00:00:00","date_gmt":"2025-04-23T07:00:00","guid":{"rendered":"https:\/\/griddb-linux-hte8hndjf8cka8ht.westus-01.azurewebsites.net\/blog\/clothes-recommendation-system-using-openai-rag\/"},"modified":"2025-04-23T00:00:00","modified_gmt":"2025-04-23T07:00:00","slug":"clothes-recommendation-system-using-openai-rag","status":"publish","type":"post","link":"https:\/\/www.griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/","title":{"rendered":"Clothes Recommendation System Using OpenAI &#038; RAG"},"content":{"rendered":"<h2>Table of Contents<\/h2>\n<ul>\n<li><a href=\"#clothes-recommendation-system-using-openai--rag\">Clothes Recommendation System Using OpenAI &amp; RAG<\/a>\n<ul>\n<li><a href=\"#introduction\">Introduction<\/a><\/li>\n<li><a href=\"#system-architecture\">System Architecture<\/a><\/li>\n<li><a href=\"#running-the-project\">Running The Project<\/a><\/li>\n<li><a href=\"#understanding-retrieval-augmented-generation-rag\">Understanding Retrieval-Augmented Generation (RAG)<\/a><\/li>\n<li><a href=\"#how-does-rag-work\">How Does RAG Work?<\/a><\/li>\n<li><a href=\"#advantages-of-openai--rag-in-fashion\">Advantages of OpenAI &amp; RAG in Fashion<\/a><\/li>\n<li><a href=\"#prerequisites\">Prerequisites<\/a><\/li>\n<li><a href=\"#openai\">OpenAI<\/a><\/li>\n<li><a href=\"#docker\">Docker<\/a><\/li>\n<li><a href=\"#nodejs\">Node.js<\/a><\/li>\n<li><a href=\"#project-development\">Project Development<\/a>  <\/li>\n<li><a href=\"#nodejs-backend\">Node.js Backend<\/a><\/li>\n<li><a href=\"#data-management-with-griddb\">Data Management with GridDB<\/a><\/li>\n<li><a href=\"#building-user-interface\">Building User Interface<\/a><\/li>\n<li><a href=\"#further-enhancements\">Further Enhancements<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2><strong>Introduction<\/strong><\/h2>\n<p>Clothes recommendation is an important feature in any e-commerce solution. It gives personalized shopping experiences in fashion and using AI-driven solutions will enhance those experiences.<\/p>\n<p>In this article, we will use the GPT-4o mini model to analyze images of clothing and extract its colors and styles. With this information, we can accurately identify the characteristics of the input clothing item and complement the identified features with our knowledge base using the RAG technique.<\/p>\n<h2>Running The Project<\/h2>\n<p>This app is tested on ARM Machines such as Apple MacBook M1 or M2 and to run the project you need <a href=\"#docker\">Docker<\/a> installed.<\/p>\n<h3>1. <code>.env<\/code> Setup<\/h3>\n<p>Create an empty directory, for example, <code>clothes-rag<\/code>, and change to that directory:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">mkdir clothes-rag\ncd clothes-rag<\/code><\/pre>\n<\/div>\n<p>Create a <code>.env<\/code> file with these keys:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">OPENAI_API_KEY=\nGRIDDB_CLUSTER_NAME=myCluster\nGRIDDB_USERNAME=admin\nGRIDDB_PASSWORD=admin\nIP_NOTIFICATION_MEMBER=griddb-server:10001<\/code><\/pre>\n<\/div>\n<p>To get the <code>OPENAI_API_KEY<\/code> please read this tutorial <a href=\"#openai\">section<\/a>.<\/p>\n<h3>2. Run with Docker Compose<\/h3>\n<p>Create the <code>docker-compose.yml<\/code> file in the directory and use this setup configuration:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">networks:\n  griddb-net:\n    driver: bridge\n\nservices:\n  griddb-server:\n    image: griddbnet\/griddb:arm-5.5.0\n    container_name: griddb-server\n    environment:\n      - GRIDDB_CLUSTER_NAME=${GRIDDB_CLUSTER_NAME}\n      - GRIDDB_PASSWORD=${GRIDDB_PASSWORD}\n      - GRIDDB_USERNAME=${GRIDDB_USERNAME}\n      - NOTIFICATION_MEMBER=1\n      - IP_NOTIFICATION_MEMBER=${IP_NOTIFICATION_MEMBER}\n    networks:\n      - griddb-net\n    ports:\n      - \"10001:10001\" # Expose GridDB port if needed for external access\n\n  clothes-rag:\n    image: junwatu\/clothes-rag:latest\n    container_name: clothes-rag-griddb\n    env_file: .env  # Load environment variables from the single .env file\n    networks:\n      - griddb-net\n    ports:\n      - \"3000:3000\" # Expose application port for local access<\/code><\/pre>\n<\/div>\n<h3>3. Run<\/h3>\n<p>When steps 1 and 2 are finished, run the app with this command:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">docker-compose up -d<\/code><\/pre>\n<\/div>\n<p>If everything running, you will get a similar response to this:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">[+] Running 3\/3\n \u2714 Network clotes-rag-griddb_griddb-net  Created                     0.0s \n \u2714 Container griddb-server               Started                     0.2s \n \u2714 Container clothes-rag-griddb          Started                     0.2s <\/code><\/pre>\n<\/div>\n<h3>4. Test the App<\/h3>\n<p>Open the browser and go to <code>http:\/\/localhost:3000<\/code>. By default the app will automatically make a request for the default selected product.<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/04\/clother-rag.gif\"><img fetchpriority=\"high\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/04\/clother-rag.gif\" alt=\"\" width=\"1112\" height=\"720\" class=\"aligncenter size-full wp-image-31469\" \/><\/a><\/p>\n<p>If you want to run the project locally from the app source code, please read this <a href=\"#project-development\">section<\/a>.<\/p>\n<h2><strong>System Architecture<\/strong><\/h2>\n<p>This system architecture leverages <strong>RAG<\/strong> to ensure that the recommendations are informed by both <strong>user-specific input<\/strong> and <strong>stored data<\/strong>, making them more relevant and customized.<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/04\/system-arch.jpg\"><img decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/04\/system-arch.jpg\" alt=\"\" width=\"920\" height=\"662\" class=\"aligncenter size-full wp-image-31472\" srcset=\"\/wp-content\/uploads\/2025\/04\/system-arch.jpg 920w, \/wp-content\/uploads\/2025\/04\/system-arch-300x216.jpg 300w, \/wp-content\/uploads\/2025\/04\/system-arch-768x553.jpg 768w, \/wp-content\/uploads\/2025\/04\/system-arch-370x265.jpg 370w, \/wp-content\/uploads\/2025\/04\/system-arch-600x432.jpg 600w\" sizes=\"(max-width: 920px) 100vw, 920px\" \/><\/a><\/p>\n<p>Here\u2019s a breakdown of the components and their interactions:<\/p>\n<p><strong>User Interaction<\/strong>:<\/p>\n<ul>\n<li>The user inputs a <strong>prompt<\/strong> (e.g., their preferences or requirements for clothing) through a <strong>React.js<\/strong> based <strong>User Interface<\/strong>.<\/li>\n<li>This UI serves as the point where the user communicates with the system, sending prompts and receiving recommendations.<\/li>\n<\/ul>\n<p><strong>Node.js Backend<\/strong>:<\/p>\n<ul>\n<li>The <strong>Node.js<\/strong> server acts as the core processing unit, handling communication between the user interface, database, and OpenAI services.<\/li>\n<li>It receives the user&#8217;s prompt from the React.js front end and processes it to determine the data and insights required for a recommendation.<\/li>\n<\/ul>\n<p><strong>Data Source (GridDB)<\/strong>:<\/p>\n<ul>\n<li><strong>GridDB<\/strong> is used to store <strong>clothing recommendation data<\/strong> such as selected clothes and recommendations.<\/li>\n<\/ul>\n<p><strong>RAG Integration with OpenAI (Embeddings)<\/strong>:<\/p>\n<ul>\n<li>\n<p>In this system, the RAG use data from CSV with Embeddings data.<\/p>\n<\/li>\n<li>\n<p>The Node.js server uses RAG to provide <strong>enhanced context<\/strong> by combining information fetched from <strong>Text Embedded Model<\/strong>, data from CSV and the user\u2019s prompt before passing it to <strong>OpenAI<\/strong>.<\/p>\n<\/li>\n<\/ul>\n<p><strong>OpenAI (Text Embedding + GPT-4.0 Mini)<\/strong>:<\/p>\n<ul>\n<li>The <strong>Text Embedding<\/strong> model is used to generate vector representations of the prompt and any retrieved-context, making it easier to match user queries with relevant data.<\/li>\n<li><strong>GPT-4.0 Mini<\/strong> (a smaller variant of GPT-4) processes the <strong>prompt, query, and enhanced context<\/strong> together to generate tailored recommendations.<\/li>\n<li>This step enables the system to provide more personalized and context-aware recommendations based on both user input and the data fetched from the CSV file.<\/li>\n<\/ul>\n<p><strong>Response Flow<\/strong>:<\/p>\n<ul>\n<li>After generating the recommendation, the response is sent back through the Node.js backend to the <strong>React.js<\/strong> user interface, where the user can view the clothing suggestions.<\/li>\n<\/ul>\n<h2><strong>Understanding Retrieval-Augmented Generation (RAG)<\/strong><\/h2>\n<p>Retrieval-augmented generation (RAG) enhances large language models (LLMs) by using external knowledge bases for more accurate responses. LLMs, trained on vast data with billions of parameters, perform tasks like answering questions or translations. RAG improves this by enabling the model to access specific domains or internal data without retraining.<\/p>\n<h2>How Does RAG Work?<\/h2>\n<p>Without RAG, the LLM takes the user input and creates a response based on the information it was trained on\u2014or what it already knows.<\/p>\n<p>With RAG, an information retrieval component is introduced that utilizes the user input to first pull information from a new knowledge source. The user query and the relevant information are both given to the LLM. The LLM uses the new knowledge and its training data to generate a better text response.<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/04\/rag.jpg\"><img decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/04\/rag.jpg\" alt=\"\" width=\"1010\" height=\"586\" class=\"aligncenter size-full wp-image-31471\" srcset=\"\/wp-content\/uploads\/2025\/04\/rag.jpg 1010w, \/wp-content\/uploads\/2025\/04\/rag-300x174.jpg 300w, \/wp-content\/uploads\/2025\/04\/rag-768x446.jpg 768w, \/wp-content\/uploads\/2025\/04\/rag-600x348.jpg 600w\" sizes=\"(max-width: 1010px) 100vw, 1010px\" \/><\/a><\/p>\n<h2><strong>Advantages of OpenAI &amp; RAG in Fashion<\/strong><\/h2>\n<p>Combining GPT-4o mini with Retrieval-Augmented Generation (RAG) offers several practical benefits for the fashion industry:<\/p>\n<ol>\n<li>\n<p><strong>Contextual Understanding<\/strong>: GPT-4o mini analyzes clothing inputs and comprehends their context, leading to more accurate responses.<\/p>\n<\/li>\n<li>\n<p><strong>Access to Information<\/strong>: RAG integrates the generative abilities of GPT-4o mini with a retrieval system that draws from a large database of fashion-related knowledge, ensuring relevant information is readily available.<\/p>\n<\/li>\n<li><strong>Personalization<\/strong>: The system can provide tailored recommendations based on user preferences and historical data, enhancing the shopping experience.<\/li>\n<\/ol>\n<p>In this post, only points 1 and 2 are utilized for the project.<\/p>\n<h2><strong>Prerequisites<\/strong><\/h2>\n<h3>OpenAI<\/h3>\n<p>There few steps needed to set up OpenAI. Go to your project dashboard and do these steps:<\/p>\n<ol>\n<li>\n<p>You need to enable two models from OpenAI:<\/p>\n<ul>\n<li>gpt-4o-mini<\/li>\n<li>text-embedding-3-large<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/04\/allow-openai-models.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/04\/allow-openai-models.png\" alt=\"\" width=\"2966\" height=\"1408\" class=\"aligncenter size-full wp-image-31487\" srcset=\"\/wp-content\/uploads\/2025\/04\/allow-openai-models.png 2966w, \/wp-content\/uploads\/2025\/04\/allow-openai-models-300x142.png 300w, \/wp-content\/uploads\/2025\/04\/allow-openai-models-1024x486.png 1024w, \/wp-content\/uploads\/2025\/04\/allow-openai-models-768x365.png 768w, \/wp-content\/uploads\/2025\/04\/allow-openai-models-1536x729.png 1536w, \/wp-content\/uploads\/2025\/04\/allow-openai-models-2048x972.png 2048w, \/wp-content\/uploads\/2025\/04\/allow-openai-models-600x285.png 600w\" sizes=\"(max-width: 2966px) 100vw, 2966px\" \/><\/a><\/p>\n<ol>\n<li>You also need to create a key. It will be used by the app so it can use those models:<\/li>\n<\/ol>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/04\/create-dev-key.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/04\/create-dev-key.png\" alt=\"\" width=\"2970\" height=\"1430\" class=\"aligncenter size-full wp-image-31489\" srcset=\"\/wp-content\/uploads\/2025\/04\/create-dev-key.png 2970w, \/wp-content\/uploads\/2025\/04\/create-dev-key-300x144.png 300w, \/wp-content\/uploads\/2025\/04\/create-dev-key-1024x493.png 1024w, \/wp-content\/uploads\/2025\/04\/create-dev-key-768x370.png 768w, \/wp-content\/uploads\/2025\/04\/create-dev-key-1536x740.png 1536w, \/wp-content\/uploads\/2025\/04\/create-dev-key-2048x986.png 2048w, \/wp-content\/uploads\/2025\/04\/create-dev-key-600x289.png 600w\" sizes=\"(max-width: 2970px) 100vw, 2970px\" \/><\/a><\/p>\n<pre><code>Use the key for the value of `OPENAI_API_KEY` in the `.env` file and this file should be ignored from the repository.\n<\/code><\/pre>\n<h3>Docker<\/h3>\n<p>For easy development and distribution, this project uses a docker container to &#8220;package&#8221; the application. For easy Docker installation, use the <a href=\"https:\/\/www.docker.com\/products\/docker-desktop\/\">Docker Desktop<\/a> tool.<\/p>\n<h4>GridDB Docker<\/h4>\n<p>This app needs a GridDB server and it should be running before the app. In this project, we will use the GridDB docker for ARM machines.  To test the GridDB on your local machine, you can run these docker commands:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">docker network create griddb-net\ndocker pull griddbnet\/griddb:arm-5.5.0\ndocker run --name griddb-server \n    --network griddb-net \n    -e GRIDDB_CLUSTER_NAME=myCluster \n    -e GRIDDB_PASSWORD=admin \n    -e NOTIFICATION_MEMBER=1 \n    -d -t griddbnet\/griddb:arm-5.5.0<\/code><\/pre>\n<\/div>\n<p>By using the Docker Desktop, you can easily check if the GridDB docker is running.<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/04\/griddb-docker-arm.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/04\/griddb-docker-arm.png\" alt=\"\" width=\"2740\" height=\"1424\" class=\"aligncenter size-full wp-image-31491\" srcset=\"\/wp-content\/uploads\/2025\/04\/griddb-docker-arm.png 2740w, \/wp-content\/uploads\/2025\/04\/griddb-docker-arm-300x156.png 300w, \/wp-content\/uploads\/2025\/04\/griddb-docker-arm-1024x532.png 1024w, \/wp-content\/uploads\/2025\/04\/griddb-docker-arm-768x399.png 768w, \/wp-content\/uploads\/2025\/04\/griddb-docker-arm-1536x798.png 1536w, \/wp-content\/uploads\/2025\/04\/griddb-docker-arm-2048x1064.png 2048w, \/wp-content\/uploads\/2025\/04\/griddb-docker-arm-600x312.png 600w\" sizes=\"(max-width: 2740px) 100vw, 2740px\" \/><\/a><\/p>\n<p>For more about GridDB docker for ARM, please check out this <a href=\"https:\/\/griddb.net\/en\/blog\/griddb-on-arm-with-docker\/\">blog<\/a>.<\/p>\n<h3>Node.js<\/h3>\n<blockquote>\n<p>This is needed for the project development. However, if you just want to <a href=\"#run-the-project\">run the project<\/a>, you don&#8217;t have to install it.<\/p>\n<\/blockquote>\n<p>Install Node.js from <a href=\"https:\/\/nodejs.org\/en\/download\">here<\/a>. For this project, we will use the <code>nvm<\/code> package manager and Node.js v20.18.0<br \/>\nLTS version.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\"># installs nvm (Node Version Manager)\ncurl -o- https:\/\/raw.githubusercontent.com\/nvm-sh\/nvm\/v0.39.7\/install.sh | bash\n\n# download and install Node.js\nnvm install 20\n\n# verifies the right Node.js version is in the environment\nnode -v # should print `v20.18.0`\n\n# verifies the right NPM version is in the environment\nnpm -v `<\/code><\/pre>\n<\/div>\n<p>To connect Node.js and GridDB database, you need the <a href=\"https:\/\/github.com\/nodejs\/node-addon-api\">gridb-node-api<\/a> npm package which is a Node.js binding developed using GridDB C Client and Node addon API.<\/p>\n<h2>Project Development<\/h2>\n<p>If you want to develop the project, you need to do these few steps:<\/p>\n<h3>1. Check the GridDB<\/h3>\n<p>To make this app work as expected, make sure the GridDB docker is running. To check it, you can use this docker command:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\"># Check container status\ndocker ps | grep griddb-server<\/code><\/pre>\n<\/div>\n<p>If the GridDB is running, you will have a similar response to this:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">fcace9e13b5f   griddbnet\/griddb:arm-5.5.0      \"\/bin\/bash \/start-gr\u2026\"   3 weeks ago   Up 20 hours   0.0.0.0:10001->10001\/tcp   griddb-server<\/code><\/pre>\n<\/div>\n<p>and if it&#8217;s not running, please check this previous <a href=\"#griddb-docker\">section<\/a>.<\/p>\n<h3>2. Clone the App Source Code<\/h3>\n<blockquote>\n<p>Before cloning the source code, please ensure that <a href=\"https:\/\/git-lfs.com\/\">Git LFS<\/a> is installed, as this app utilizes relatively large static files.<\/p>\n<\/blockquote>\n<p>Clone the app source code from this <a href=\"https:\/\/github.com\/junwatu\/clothes-recommendation\">repository<\/a>:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">git clone https:\/\/github.com\/junwatu\/clothes-recommendation.git<\/code><\/pre>\n<\/div>\n<p>The <code>app<\/code> folder is the source code for this app.<\/p>\n<h3>3. Build the App Docker<\/h3>\n<p>Change the directory into the <code>app<\/code> folder and build the app docker version:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">cd app\ndocker build -t clothes-rag .<\/code><\/pre>\n<\/div>\n<h3>4. Run the App Docker<\/h3>\n<p>Before running the dockerize app, you need to setup a few enviroment keys. You can copy these keys from the <code>.env.example<\/code> file or create an <code>.env<\/code> file and fill with these keys:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">OPENAI_API_KEY=\nGRIDDB_CLUSTER_NAME=myCluster\nGRIDDB_USERNAME=admin\nGRIDDB_PASSWORD=admin\nIP_NOTIFICATION_MEMBER=griddb-server:10001<\/code><\/pre>\n<\/div>\n<p>Make sure you have the key to access the OpenAI service. For details on how to do this, read the previous <a href=\"#openai\">section<\/a>.<\/p>\n<p>The last one is run the app docker using this command:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-sh\">docker run --name clothes-rag-griddb \n    --network griddb-net \n    --env-file .env \n    -p 3000:3000 clothes-rag<\/code><\/pre>\n<\/div>\n<p>Also, by using the Docker Desktop you can easily check if the GridDB and the dockerize app are running or not.<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/04\/app-is-running.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/04\/app-is-running.png\" alt=\"\" width=\"3074\" height=\"1424\" class=\"aligncenter size-full wp-image-31488\" srcset=\"\/wp-content\/uploads\/2025\/04\/app-is-running.png 3074w, \/wp-content\/uploads\/2025\/04\/app-is-running-300x139.png 300w, \/wp-content\/uploads\/2025\/04\/app-is-running-1024x474.png 1024w, \/wp-content\/uploads\/2025\/04\/app-is-running-768x356.png 768w, \/wp-content\/uploads\/2025\/04\/app-is-running-1536x712.png 1536w, \/wp-content\/uploads\/2025\/04\/app-is-running-2048x949.png 2048w, \/wp-content\/uploads\/2025\/04\/app-is-running-600x278.png 600w\" sizes=\"(max-width: 3074px) 100vw, 3074px\" \/><\/a><\/p>\n<p>From the screenshot above the GridDB is running on port 10001 and the app is runnning on port 3000. Now, you can test the app using the browser.<\/p>\n<h2><strong>Node.js Backend<\/strong><\/h2>\n<p>This app uses Node.js as the backend server. It serves user interface files and processes the AI recommendation for the selected product.<\/p>\n<h3>API Documentation<\/h3>\n<table>\n<thead>\n<tr>\n<th>Route<\/th>\n<th>Method<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>\/<\/code><\/td>\n<td><code>GET<\/code><\/td>\n<td>Serves the main user interface file.<\/td>\n<\/tr>\n<tr>\n<td><code>\/recommendation<\/code><\/td>\n<td><code>POST<\/code><\/td>\n<td>Generates clothing recommendations.<\/td>\n<\/tr>\n<tr>\n<td><code>\/query<\/code><\/td>\n<td><code>GET<\/code><\/td>\n<td>Retrieves stored data.<\/td>\n<\/tr>\n<tr>\n<td><code>\/query\/:id<\/code><\/td>\n<td><code>GET<\/code><\/td>\n<td>Retrieves data by a specific ID.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The core functionality for this app is in the <code>\/recommendation<\/code> route. The <code>getClothRecommendations<\/code> function will take a selected product, which is essentially a product image, and it will return an array of product recommendations.<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">const recommendationResults = await getClothRecommendations(realImagePath);<\/code><\/pre>\n<\/div>\n<h2><strong>RAG<\/strong><\/h2>\n<h3>API Documentation<\/h3>\n<p>The RAG source code is in the <code>librag.js<\/code> file. This file is responsible for getting the clothes recommendation.<\/p>\n<table>\n<thead>\n<tr>\n<th><strong>Function Name<\/strong><\/th>\n<th><strong>Description<\/strong><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>analyzeCloth<\/code><\/td>\n<td>Analyzes an image of clothing to suggest matching items, category, and gender.<\/td>\n<\/tr>\n<tr>\n<td><code>getEmbeddings<\/code><\/td>\n<td>Generates embeddings for text descriptions, creating vector representations for similarity calculations.<\/td>\n<\/tr>\n<tr>\n<td><code>findSimilarItems<\/code><\/td>\n<td>Finds items similar to an input item based on cosine similarity, filtering by threshold and top matches.<\/td>\n<\/tr>\n<tr>\n<td><code>getClothRecommendations<\/code><\/td>\n<td>Generates recommendations for clothing items to pair with an input image, with retry for better matches.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The core functionality is handled by the <code>findSimilarItems<\/code> function which use the cosine similarity function to compare between 2 vector (clothes number representation).<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">function cosineSimilarityManual(vec1, vec2) {\n vec1 = vec1.map(Number);\n vec2 = vec2.map(Number);\n const dotProduct = vec1.reduce((sum, v1, i) => sum + v1 * vec2[i], 0);\n const mag1 = Math.sqrt(vec1.reduce((sum, v) => sum + v * v, 0));\n const mag2 = Math.sqrt(vec2.reduce((sum, v) => sum + v * v, 0));\n return dotProduct \/ (mag1 * mag2);\n}<\/code><\/pre>\n<\/div>\n<p>If the vector result is tend to value 1 then the clothes is similar or recommended. You can set the minimum similarity score for clothes to be included.<\/p>\n<p>In this code, the minimum threshold where the clothes are considered as a recommendation is <code>0.5<\/code>, you can change this to a higher value for stricter recommendations:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">function findSimilarItems(inputEmbedding, embeddings, threshold = 0.5, topK = 2) {\n const similarities = embeddings.map((vec, index) =>\n  [index, cosineSimilarityManual(inputEmbedding, vec)]\n );\n const filteredSimilarities = similarities.filter(([, sim]) => sim >= threshold);\n const sortedIndices = filteredSimilarities\n  .sort((a, b) => b[1] - a[1])\n  .slice(0, topK);\n return sortedIndices;\n}<\/code><\/pre>\n<\/div>\n<h3>Data Source<\/h3>\n<p>The RAG data source uses a clothes style CSV file that contain embeddings values and from it the app get all the clothes recommendation. You can look at all the clothes style databases in the <code>dataclothes_styles_with_embeddings.csv<\/code> file.<\/p>\n<h2><strong>Data Management with GridDB<\/strong><\/h2>\n<h3>API Documentation<\/h3>\n<p>The main code that responsible for handling data input and output to GridDB is the <code>db\/griddbOperarions.js<\/code> file. Here&#8217;s the table summary for its function:<\/p>\n<table>\n<thead>\n<tr>\n<th><strong>Function<\/strong><\/th>\n<th><strong>Description<\/strong><\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>getOrCreateContainer<\/code><\/td>\n<td>Creates a new container or retrieves an existing one based on the specified container name and column info.<\/td>\n<\/tr>\n<tr>\n<td><code>insertData<\/code><\/td>\n<td>Inserts data into the specified container and logs the operation.<\/td>\n<\/tr>\n<tr>\n<td><code>queryData<\/code><\/td>\n<td>Executes a query on the specified container and fetches the results, logging the number of rows retrieved.<\/td>\n<\/tr>\n<tr>\n<td><code>queryDataById<\/code><\/td>\n<td>Queries a container for a specific row identified by a unique ID, returning the corresponding row data.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>The GridDB database can be used to save data as a collection or simply behave like a column base database. This function will use the existing container or create a new collection container:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">export async function getOrCreateContainer(containerName, columnInfoList, rowKey = true) {\n try {\n  const conInfo = new griddb.ContainerInfo({\n   'name': containerName,\n   'columnInfoList': columnInfoList,\n   'type': griddb.ContainerType.COLLECTION,\n   'rowKey': rowKey\n  });\n\n  await store.dropContainer(containerName).catch(() => console.log(\"Container doesn't exist. Creating new one...\"));\n  let container = await store.putContainer(conInfo, false);\n  return container;\n } catch (err) {\n  console.error(\"Error creating container:\", err.message);\n  throw err;\n }\n}<\/code><\/pre>\n<\/div>\n<p>In the <code>getOrCreateContainer<\/code> function the <code>type<\/code> container info key should be set as <code>griddb.ContainerType.COLLECTION<\/code> so the GridDB will save the data as a collection.<\/p>\n<h3>Save Data<\/h3>\n<p>The data model for this app contains 3 data only: <code>id<\/code>, <code>image<\/code>, and <code>recommendations<\/code>:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">const columnInfoList = [\n ['id', griddb.Type.INTEGER],\n ['image', griddb.Type.STRING],\n ['recommendations', griddb.Type.STRING]\n];<\/code><\/pre>\n<\/div>\n<p>The recommendation data will be saved after successful response from OpenAI and this will be handled in the route <code>\/recommendation<\/code>:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">const container = await getOrCreateContainer(containerName, columnInfoList);\n  await insertData(container, [generateRandomID(), product.image, JSON.stringify(cleanRecommendations)]);<\/code><\/pre>\n<\/div>\n<h3>Read Data<\/h3>\n<p>To read data in the GridDB database, you can directly use the <code>\/query<\/code> route.<\/p>\n<h2><strong>Building User Interface<\/strong><\/h2>\n<p>The user interface is built using the React library. The main user interface is built only with 2 react components:<\/p>\n<h3><code>ProductSelector.tsx<\/code><\/h3>\n<p>This component shows all the clothes products. For simplicity, the product list data is from static data:<\/p>\n<div class=\"clipboard\">\n<pre><code class=\"language-js\">const products: Product[] = [\n    {\n      id: 1,\n      name: \"Striped Sports Jersey\",\n      description: \"Red and black striped sports jersey with short sleeves\",\n      price: 39.99,\n      color: \"Red\/Black\",\n      size: [\"S\", \"M\", \"L\", \"XL\"],\n      category: \"Sports Wear\",\n      image: \"\/data\/preview\/1.png\",\n      thumbnail: \"data\/preview\/1-small.jpeg\",\n    },\n     \/\/...\n  ];<\/code><\/pre>\n<\/div>\n<p>When user select one clothes from the product list, the thumbnail will sent to the server for processing and the server will find recommendations.<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/04\/product-list.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/04\/product-list.png\" alt=\"\" width=\"1192\" height=\"506\" class=\"aligncenter size-full wp-image-31492\" srcset=\"\/wp-content\/uploads\/2025\/04\/product-list.png 1192w, \/wp-content\/uploads\/2025\/04\/product-list-300x127.png 300w, \/wp-content\/uploads\/2025\/04\/product-list-1024x435.png 1024w, \/wp-content\/uploads\/2025\/04\/product-list-768x326.png 768w, \/wp-content\/uploads\/2025\/04\/product-list-600x255.png 600w\" sizes=\"(max-width: 1192px) 100vw, 1192px\" \/><\/a><\/p>\n<h3><code>RecommendationCard.tsx<\/code><\/h3>\n<p>This component will display any recommendation for the selected product.<\/p>\n<p><a href=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/04\/recommendation-card.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/griddb.net\/wp-content\/uploads\/2025\/04\/recommendation-card.png\" alt=\"\" width=\"1402\" height=\"1020\" class=\"aligncenter size-full wp-image-31493\" srcset=\"\/wp-content\/uploads\/2025\/04\/recommendation-card.png 1402w, \/wp-content\/uploads\/2025\/04\/recommendation-card-300x218.png 300w, \/wp-content\/uploads\/2025\/04\/recommendation-card-1024x745.png 1024w, \/wp-content\/uploads\/2025\/04\/recommendation-card-768x559.png 768w, \/wp-content\/uploads\/2025\/04\/recommendation-card-600x437.png 600w\" sizes=\"(max-width: 1402px) 100vw, 1402px\" \/><\/a><\/p>\n<h2><strong>Further Enhancements<\/strong><\/h2>\n<p>To improve this product recommendation app, consider these five enhancements:<\/p>\n<ul>\n<li>Personalize Recommendations with User Profiles.<\/li>\n<li>Dynamic Product Catalog with Real-Time Database Integration.<\/li>\n<li>Optimize Data Retrieval with Incremental Caching.  <\/li>\n<li>Improve Recommendation Algorithm.  <\/li>\n<li>UI and UX Enhancements.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Table of Contents Clothes Recommendation System Using OpenAI &amp; RAG Introduction System Architecture Running The Project Understanding Retrieval-Augmented Generation (RAG) How Does RAG Work? Advantages of OpenAI &amp; RAG in Fashion Prerequisites OpenAI Docker Node.js Project Development Node.js Backend Data Management with GridDB Building User Interface Further Enhancements Introduction Clothes recommendation is an important feature [&hellip;]<\/p>\n","protected":false},"author":41,"featured_media":52104,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[121],"tags":[],"class_list":["post-52103","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.1.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Clothes Recommendation System Using OpenAI &amp; RAG | GridDB: Open Source Time Series Database for IoT<\/title>\n<meta name=\"description\" content=\"Table of Contents Clothes Recommendation System Using OpenAI &amp; RAG Introduction System Architecture Running The Project Understanding\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Clothes Recommendation System Using OpenAI &amp; RAG | GridDB: Open Source Time Series Database for IoT\" \/>\n<meta property=\"og:description\" content=\"Table of Contents Clothes Recommendation System Using OpenAI &amp; RAG Introduction System Architecture Running The Project Understanding\" \/>\n<meta property=\"og:url\" content=\"https:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/\" \/>\n<meta property=\"og:site_name\" content=\"GridDB: Open Source Time Series Database for IoT\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/griddbcommunity\/\" \/>\n<meta property=\"article:published_time\" content=\"2025-04-23T07:00:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.griddb.net\/wp-content\/uploads\/2025\/12\/cover.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1599\" \/>\n\t<meta property=\"og:image:height\" content=\"839\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"griddb-admin\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@GridDBCommunity\" \/>\n<meta name=\"twitter:site\" content=\"@GridDBCommunity\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"griddb-admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/\"},\"author\":{\"name\":\"griddb-admin\",\"@id\":\"https:\/\/www.griddb.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233\"},\"headline\":\"Clothes Recommendation System Using OpenAI &#038; RAG\",\"datePublished\":\"2025-04-23T07:00:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/\"},\"wordCount\":1821,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.griddb.net\/en\/#organization\"},\"image\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/#primaryimage\"},\"thumbnailUrl\":\"\/wp-content\/uploads\/2025\/12\/cover.jpg\",\"articleSection\":[\"Blog\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/\",\"url\":\"https:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/\",\"name\":\"Clothes Recommendation System Using OpenAI & RAG | GridDB: Open Source Time Series Database for IoT\",\"isPartOf\":{\"@id\":\"https:\/\/www.griddb.net\/en\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/#primaryimage\"},\"thumbnailUrl\":\"\/wp-content\/uploads\/2025\/12\/cover.jpg\",\"datePublished\":\"2025-04-23T07:00:00+00:00\",\"description\":\"Table of Contents Clothes Recommendation System Using OpenAI &amp; RAG Introduction System Architecture Running The Project Understanding\",\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/#primaryimage\",\"url\":\"\/wp-content\/uploads\/2025\/12\/cover.jpg\",\"contentUrl\":\"\/wp-content\/uploads\/2025\/12\/cover.jpg\",\"width\":1599,\"height\":839},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.griddb.net\/en\/#website\",\"url\":\"https:\/\/www.griddb.net\/en\/\",\"name\":\"GridDB: Open Source Time Series Database for IoT\",\"description\":\"GridDB is an open source time-series database with the performance of NoSQL and convenience of SQL\",\"publisher\":{\"@id\":\"https:\/\/www.griddb.net\/en\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.griddb.net\/en\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.griddb.net\/en\/#organization\",\"name\":\"Fixstars\",\"url\":\"https:\/\/www.griddb.net\/en\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.griddb.net\/en\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png\",\"contentUrl\":\"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png\",\"width\":200,\"height\":83,\"caption\":\"Fixstars\"},\"image\":{\"@id\":\"https:\/\/www.griddb.net\/en\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/griddbcommunity\/\",\"https:\/\/x.com\/GridDBCommunity\",\"https:\/\/www.linkedin.com\/company\/griddb-by-toshiba\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.griddb.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233\",\"name\":\"griddb-admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.griddb.net\/en\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g\",\"caption\":\"griddb-admin\"},\"url\":\"https:\/\/www.griddb.net\/en\/author\/griddb-admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Clothes Recommendation System Using OpenAI & RAG | GridDB: Open Source Time Series Database for IoT","description":"Table of Contents Clothes Recommendation System Using OpenAI &amp; RAG Introduction System Architecture Running The Project Understanding","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:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/","og_locale":"en_US","og_type":"article","og_title":"Clothes Recommendation System Using OpenAI & RAG | GridDB: Open Source Time Series Database for IoT","og_description":"Table of Contents Clothes Recommendation System Using OpenAI &amp; RAG Introduction System Architecture Running The Project Understanding","og_url":"https:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/","og_site_name":"GridDB: Open Source Time Series Database for IoT","article_publisher":"https:\/\/www.facebook.com\/griddbcommunity\/","article_published_time":"2025-04-23T07:00:00+00:00","og_image":[{"width":1599,"height":839,"url":"https:\/\/www.griddb.net\/wp-content\/uploads\/2025\/12\/cover.jpg","type":"image\/jpeg"}],"author":"griddb-admin","twitter_card":"summary_large_image","twitter_creator":"@GridDBCommunity","twitter_site":"@GridDBCommunity","twitter_misc":{"Written by":"griddb-admin","Est. reading time":"12 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/#article","isPartOf":{"@id":"https:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/"},"author":{"name":"griddb-admin","@id":"https:\/\/www.griddb.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233"},"headline":"Clothes Recommendation System Using OpenAI &#038; RAG","datePublished":"2025-04-23T07:00:00+00:00","mainEntityOfPage":{"@id":"https:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/"},"wordCount":1821,"commentCount":0,"publisher":{"@id":"https:\/\/www.griddb.net\/en\/#organization"},"image":{"@id":"https:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/#primaryimage"},"thumbnailUrl":"\/wp-content\/uploads\/2025\/12\/cover.jpg","articleSection":["Blog"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/","url":"https:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/","name":"Clothes Recommendation System Using OpenAI & RAG | GridDB: Open Source Time Series Database for IoT","isPartOf":{"@id":"https:\/\/www.griddb.net\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/#primaryimage"},"image":{"@id":"https:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/#primaryimage"},"thumbnailUrl":"\/wp-content\/uploads\/2025\/12\/cover.jpg","datePublished":"2025-04-23T07:00:00+00:00","description":"Table of Contents Clothes Recommendation System Using OpenAI &amp; RAG Introduction System Architecture Running The Project Understanding","inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/griddb.net\/en\/blog\/clothes-recommendation-system-using-openai-rag\/#primaryimage","url":"\/wp-content\/uploads\/2025\/12\/cover.jpg","contentUrl":"\/wp-content\/uploads\/2025\/12\/cover.jpg","width":1599,"height":839},{"@type":"WebSite","@id":"https:\/\/www.griddb.net\/en\/#website","url":"https:\/\/www.griddb.net\/en\/","name":"GridDB: Open Source Time Series Database for IoT","description":"GridDB is an open source time-series database with the performance of NoSQL and convenience of SQL","publisher":{"@id":"https:\/\/www.griddb.net\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.griddb.net\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.griddb.net\/en\/#organization","name":"Fixstars","url":"https:\/\/www.griddb.net\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.griddb.net\/en\/#\/schema\/logo\/image\/","url":"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png","contentUrl":"https:\/\/griddb.net\/wp-content\/uploads\/2019\/04\/fixstars_logo_web_tagline.png","width":200,"height":83,"caption":"Fixstars"},"image":{"@id":"https:\/\/www.griddb.net\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/griddbcommunity\/","https:\/\/x.com\/GridDBCommunity","https:\/\/www.linkedin.com\/company\/griddb-by-toshiba"]},{"@type":"Person","@id":"https:\/\/www.griddb.net\/en\/#\/schema\/person\/4fe914ca9576878e82f5e8dd3ba52233","name":"griddb-admin","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.griddb.net\/en\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5bceca1cafc06886a7ba873e2f0a28011a1176c4dea59709f735b63ae30d0342?s=96&d=mm&r=g","caption":"griddb-admin"},"url":"https:\/\/www.griddb.net\/en\/author\/griddb-admin\/"}]}},"_links":{"self":[{"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/posts\/52103","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/users\/41"}],"replies":[{"embeddable":true,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/comments?post=52103"}],"version-history":[{"count":0,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/posts\/52103\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/media\/52104"}],"wp:attachment":[{"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/media?parent=52103"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/categories?post=52103"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.griddb.net\/en\/wp-json\/wp\/v2\/tags?post=52103"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}