<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-15 --> <p>JSON (JavaScript Object Notation) is the universal format for semi-structured data in modern applications. Geode provides first-class JSON support as a native data type, enabling you to store, query, index, and manipulate JSON documents alongside graph data. This integration allows flexible schema evolution, hierarchical data storage, and seamless interoperability with web services and APIs.</p> <p>As an ISO/IEC 39075:2024 GQL-compliant graph database, Geode treats JSON as a fundamental data type with rich operator support, specialized functions, and optimized storage. Whether you&rsquo;re storing user preferences, configuration data, API responses, or complex nested structures, Geode&rsquo;s JSON capabilities provide the flexibility and performance your applications need.</p> <h3 id="json-data-type" class="position-relative d-flex align-items-center group"> <span>JSON Data Type</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="json-data-type" aria-haspopup="dialog" aria-label="Share link: JSON Data Type"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><div id="headingShareModal" class="heading-share-modal" role="dialog" aria-modal="true" aria-labelledby="headingShareTitle" hidden> <div class="hsm-dialog" role="document"> <div class="hsm-header"> <h2 id="headingShareTitle" class="h6 mb-0 fw-bold">Share this section</h2> <button type="button" class="hsm-close" aria-label="Close"> <i class="fa-solid fa-xmark"></i> </button> </div> <div class="hsm-body"> <label for="headingShareInput" class="form-label small text-muted mb-1 text-uppercase fw-bold" style="font-size: 0.7rem; letter-spacing: 0.5px;">Permalink</label> <div class="input-group mb-4 hsm-url-group"> <input id="headingShareInput" type="text" class="form-control font-monospace" readonly aria-readonly="true" style="font-size: 0.85rem;" /> <button class="btn btn-primary hsm-copy" type="button" aria-label="Copy" title="Copy"> <i class="fa-duotone fa-clipboard" aria-hidden="true"></i> </button> </div> <div class="small fw-bold mb-2 text-muted text-uppercase" style="font-size: 0.7rem; letter-spacing: 0.5px;">Share via</div> <div class="hsm-share-grid"> <a id="share-twitter" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer"> <i class="fa-brands fa-twitter me-2"></i>Twitter </a> <a id="share-linkedin" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer"> <i class="fa-brands fa-linkedin me-2"></i>LinkedIn </a> <a id="share-facebook" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer"> <i class="fa-brands fa-facebook me-2"></i>Facebook </a> </div> </div> </div> </div> <style> .heading-share-modal { position: fixed; inset: 0; display: flex; justify-content: center; align-items: center; background: rgba(0, 0, 0, 0.6); z-index: 1050; padding: 1rem; backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); } .heading-share-modal[hidden] { display: none !important; } .hsm-dialog { max-width: 420px; width: 100%; background: var(--bs-body-bg, #fff); color: var(--bs-body-color, #212529); border: 1px solid var(--bs-border-color, rgba(0,0,0,0.1)); border-radius: 1rem; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); overflow: hidden; animation: hsm-fade-in 0.2s ease-out; } @keyframes hsm-fade-in { from { opacity: 0; transform: scale(0.95); } to { opacity: 1; transform: scale(1); } } [data-bs-theme="dark"] .hsm-dialog { background: #1e293b; border-color: rgba(255,255,255,0.1); color: #f8f9fa; } .hsm-header { display: flex; justify-content: space-between; align-items: center; padding: 1rem 1.5rem; border-bottom: 1px solid var(--bs-border-color, rgba(0,0,0,0.1)); background: rgba(0,0,0,0.02); } [data-bs-theme="dark"] .hsm-header { background: rgba(255,255,255,0.02); border-color: rgba(255,255,255,0.1); } .hsm-close { background: transparent; border: none; color: inherit; opacity: 0.5; padding: 0.25rem 0.5rem; border-radius: 0.25rem; font-size: 1.2rem; line-height: 1; transition: opacity 0.2s; } .hsm-close:hover { opacity: 1; } .hsm-body { padding: 1.5rem; } .hsm-url-group { display: flex !important; align-items: stretch; } .hsm-url-group .form-control { flex: 1; min-width: 0; margin: 0; background: var(--bs-secondary-bg, #f8f9fa); border-color: var(--bs-border-color, #dee2e6); border-top-right-radius: 0; border-bottom-right-radius: 0; height: 42px; } .hsm-url-group .btn { flex: 0 0 auto; margin: 0; margin-left: -1px; border-top-left-radius: 0; border-bottom-left-radius: 0; height: 42px; display: flex; align-items: center; justify-content: center; padding: 0 1.25rem; z-index: 2; } [data-bs-theme="dark"] .hsm-url-group .form-control { background: #0f172a; border-color: #334155; color: #e2e8f0; } .hsm-share-grid { display: flex; flex-direction: column; gap: 0.5rem; } .hsm-share-grid .btn { display: flex; align-items: center; justify-content: center; font-size: 0.9rem; padding: 0.6rem; border-color: var(--bs-border-color); width: 100%; } [data-bs-theme="dark"] .hsm-share-grid .btn { color: #e2e8f0; border-color: #475569; } [data-bs-theme="dark"] .hsm-share-grid .btn:hover { background: #334155; border-color: #cbd5e1; } </style> <script> (function(){ const modal = document.getElementById('headingShareModal'); if(!modal) return; const input = modal.querySelector('#headingShareInput'); const copyBtn = modal.querySelector('.hsm-copy'); const twitter = modal.querySelector('#share-twitter'); const linkedin = modal.querySelector('#share-linkedin'); const facebook = modal.querySelector('#share-facebook'); const closeBtn = modal.querySelector('.hsm-close'); let lastFocus=null; let trapBound=false; function buildUrl(id){ return window.location.origin + window.location.pathname + '#' + id; } function isOpen(){ return !modal.hasAttribute('hidden'); } function hydrate(id){ const url=buildUrl(id); input.value=url; const enc=encodeURIComponent(url); const text=encodeURIComponent(document.title); if(twitter) twitter.href=`https://twitter.com/intent/tweet?url=${enc}&text=${text}`; if(linkedin) linkedin.href=`https://www.linkedin.com/sharing/share-offsite/?url=${enc}`; if(facebook) facebook.href=`https://www.facebook.com/sharer/sharer.php?u=${enc}`; } function openModal(id){ lastFocus=document.activeElement; hydrate(id); if(!isOpen()){ modal.removeAttribute('hidden'); } requestAnimationFrame(()=>{ input.focus(); }); trapFocus(); } function closeModal(){ if(!isOpen()) return; modal.setAttribute('hidden',''); if(lastFocus && typeof lastFocus.focus==='function') lastFocus.focus(); } function copyCurrent(){ try{ navigator.clipboard.writeText(input.value).then(()=>feedback(true),()=>fallback()); } catch(e){ fallback(); } } function fallback(){ input.select(); try{ document.execCommand('copy'); feedback(true);}catch(e){ feedback(false);} } function feedback(ok){ if(!copyBtn) return; const icon=copyBtn.querySelector('i'); if(!icon) return; const prev=copyBtn.getAttribute('data-prev')||icon.className; if(!copyBtn.getAttribute('data-prev')) copyBtn.setAttribute('data-prev',prev); icon.className= ok ? 'fa-duotone fa-clipboard-check':'fa-duotone fa-circle-exclamation'; setTimeout(()=>{ icon.className=prev; },1800); } function handleShareClick(e){ e.preventDefault(); const btn=e.currentTarget; const id=btn.getAttribute('data-share-target'); if(id) openModal(id); } function bindShareButtons(){ document.querySelectorAll('.h-share').forEach(btn=>{ if(!btn.dataset.hShareBound){ btn.addEventListener('click', handleShareClick); btn.dataset.hShareBound='1'; } }); } bindShareButtons(); if(document.readyState==='loading'){ document.addEventListener('DOMContentLoaded', bindShareButtons); } else { requestAnimationFrame(bindShareButtons); } document.addEventListener('click', function(e){ const shareBtn=e.target.closest && e.target.closest('.h-share'); if(shareBtn && !shareBtn.dataset.hShareBound){ handleShareClick.call(shareBtn, e); } }, true); document.addEventListener('click', e=>{ if(e.target===modal) closeModal(); if(e.target.closest && e.target.closest('.hsm-close')){ e.preventDefault(); closeModal(); } if(copyBtn && (e.target===copyBtn || (e.target.closest && e.target.closest('.hsm-copy')))) { e.preventDefault(); copyCurrent(); } }); document.addEventListener('keydown', e=>{ if(e.key==='Escape' && isOpen()) closeModal(); }); function trapFocus(){ if(trapBound) return; trapBound=true; modal.addEventListener('keydown', f=>{ if(f.key==='Tab' && isOpen()){ const focusable=[...modal.querySelectorAll('a[href],button,input,textarea,select,[tabindex]:not([tabindex="-1"])')].filter(el=>!el.hasAttribute('disabled')); if(!focusable.length) return; const first=focusable[0]; const last=focusable[focusable.length-1]; if(f.shiftKey && document.activeElement===first){ f.preventDefault(); last.focus(); } else if(!f.shiftKey && document.activeElement===last){ f.preventDefault(); first.focus(); } } }); } if(closeBtn) closeBtn.addEventListener('click', e=>{ e.preventDefault(); closeModal(); }); })(); </script><p>Geode&rsquo;s JSON type supports the full JSON specification including objects, arrays, strings, numbers, booleans, and null values:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">nodes</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">JSON</span><span class="w"> </span><span class="py">properties</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Alice</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">preferences</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="p">{</span><span class="s">&#34;theme&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;dark&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;language&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;en&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;notifications&#34;</span><span class="p">:</span><span class="w"> </span><span class="nc">true</span><span class="p">}</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">tags</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="p">[</span><span class="s">&#34;developer&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;database&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;graph&#34;</span><span class="p">]</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">metadata</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="p">{</span><span class="s">&#34;created&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;2024-01-24T10:00:00Z&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;source&#34;</span><span class="p">:</span><span class="w"> </span><span class="s">&#34;api&#34;</span><span class="p">}</span><span class="err">&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">})</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="nc">JSON</span><span class="w"> </span><span class="nc">values</span><span class="w"> </span><span class="nc">are</span><span class="w"> </span><span class="nc">automatically</span><span class="w"> </span><span class="nc">parsed</span><span class="w"> </span><span class="py">and</span><span class="w"> </span><span class="py">validated</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Laptop</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">specs</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">cpu</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Intel</span><span class="w"> </span><span class="py">i7</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ram</span><span class="p">:</span><span class="w"> </span><span class="nc">16</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">storage</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="nc">type</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">SSD</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">capacity</span><span class="p">:</span><span class="w"> </span><span class="nc">512</span><span class="p">}</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">}</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">})</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Supported JSON Values</strong>:</p> <ul> <li><strong>Objects</strong>: <code>{&quot;key&quot;: &quot;value&quot;, &quot;nested&quot;: {&quot;data&quot;: true}}</code></li> <li><strong>Arrays</strong>: <code>[1, 2, 3, &quot;four&quot;, {&quot;five&quot;: 5}]</code></li> <li><strong>Strings</strong>: <code>&quot;text value&quot;</code></li> <li><strong>Numbers</strong>: <code>42</code>, <code>3.14</code>, <code>-10.5</code>, <code>1.23e10</code></li> <li><strong>Booleans</strong>: <code>true</code>, <code>false</code></li> <li><strong>Null</strong>: <code>null</code></li> </ul> <h3 id="storing-and-retrieving-json" class="position-relative d-flex align-items-center group"> <span>Storing and Retrieving JSON</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="storing-and-retrieving-json" aria-haspopup="dialog" aria-label="Share link: Storing and Retrieving JSON"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p><strong>Direct Property Storage</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Store</span><span class="w"> </span><span class="py">JSON</span><span class="w"> </span><span class="py">object</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">doc</span><span class="p">:</span><span class="nc">Document</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">title</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">API</span><span class="w"> </span><span class="py">Response</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">data</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">status</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">success</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">results</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">{</span><span class="nc">id</span><span class="p">:</span><span class="w"> </span><span class="nc">1</span><span class="p">,</span><span class="w"> </span><span class="py">value</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">first</span><span class="err">&#39;</span><span class="p">},</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">2</span><span class="p">,</span><span class="w"> </span><span class="py">value</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">second</span><span class="err">&#39;</span><span class="p">}</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">],</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">metadata</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">timestamp</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">2024</span><span class="err">-</span><span class="py">01</span><span class="err">-</span><span class="py">24T10</span><span class="p">:</span><span class="nc">00</span><span class="p">:</span><span class="nc">00Z</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">version</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">2</span><span class="mf">.0</span><span class="err">&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">}</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">}</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">})</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Retrieve</span><span class="w"> </span><span class="py">JSON</span><span class="w"> </span><span class="py">property</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">doc</span><span class="p">:</span><span class="nc">Document</span><span class="w"> </span><span class="p">{</span><span class="py">title</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">API</span><span class="w"> </span><span class="py">Response</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">doc</span><span class="err">.</span><span class="py">data</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>JSON String Conversion</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Parse</span><span class="w"> </span><span class="py">JSON</span><span class="w"> </span><span class="py">string</span><span class="w"> </span><span class="py">to</span><span class="w"> </span><span class="py">object</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">JSON_PARSE</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">preferences</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">prefs</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Convert</span><span class="w"> </span><span class="py">object</span><span class="w"> </span><span class="py">to</span><span class="w"> </span><span class="py">JSON</span><span class="w"> </span><span class="py">string</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">JSON_STRINGIFY</span><span class="p">(</span><span class="py">p</span><span class="err">.</span><span class="py">specs</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">specs_json</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div> <h3 id="querying-json-data" class="position-relative d-flex align-items-center group"> <span>Querying JSON Data</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="querying-json-data" aria-haspopup="dialog" aria-label="Share link: Querying JSON Data"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p><strong>Path Expressions</strong>:</p> <p>Geode supports JSON path syntax for accessing nested values:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Access</span><span class="w"> </span><span class="py">nested</span><span class="w"> </span><span class="py">properties</span><span class="w"> </span><span class="py">using</span><span class="w"> </span><span class="py">dot</span><span class="w"> </span><span class="py">notation</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">preferences</span><span class="err">.</span><span class="py">theme</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">&#39;</span><span class="py">dark</span><span class="err">&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">preferences</span><span class="err">.</span><span class="py">language</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Access</span><span class="w"> </span><span class="py">array</span><span class="w"> </span><span class="py">elements</span><span class="w"> </span><span class="py">by</span><span class="w"> </span><span class="py">index</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">tags</span><span class="p">[</span><span class="py">0</span><span class="p">]</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">&#39;</span><span class="py">developer</span><span class="err">&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">tags</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Deeply</span><span class="w"> </span><span class="py">nested</span><span class="w"> </span><span class="py">access</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">specs</span><span class="err">.</span><span class="py">storage</span><span class="err">.</span><span class="kd">type</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">SSD</span><span class="err">&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">specs</span><span class="err">.</span><span class="py">storage</span><span class="err">.</span><span class="py">capacity</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>JSON Path Functions</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Extract</span><span class="w"> </span><span class="py">value</span><span class="w"> </span><span class="py">using</span><span class="w"> </span><span class="py">JSON</span><span class="w"> </span><span class="py">path</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">doc</span><span class="p">:</span><span class="nc">Document</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">JSON_EXTRACT</span><span class="p">(</span><span class="py">doc</span><span class="err">.</span><span class="py">data</span><span class="p">,</span><span class="w"> </span><span class="err">&#39;$.</span><span class="py">results</span><span class="p">[</span><span class="py">0</span><span class="p">]</span><span class="err">.</span><span class="py">value</span><span class="err">&#39;</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">first_value</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Check</span><span class="w"> </span><span class="py">if</span><span class="w"> </span><span class="py">path</span><span class="w"> </span><span class="py">exists</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">JSON_EXISTS</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">preferences</span><span class="p">,</span><span class="w"> </span><span class="err">&#39;$.</span><span class="py">notifications</span><span class="err">&#39;</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Get</span><span class="w"> </span><span class="py">multiple</span><span class="w"> </span><span class="py">values</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">doc</span><span class="p">:</span><span class="nc">Document</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">JSON_QUERY</span><span class="p">(</span><span class="py">doc</span><span class="err">.</span><span class="py">data</span><span class="p">,</span><span class="w"> </span><span class="err">&#39;$.</span><span class="py">results</span><span class="p">[</span><span class="err">*</span><span class="p">]</span><span class="err">.</span><span class="py">id</span><span class="err">&#39;</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">all_ids</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>JSON Path Syntax</strong>:</p> <ul> <li><code>$</code> - Root object</li> <li><code>.property</code> - Object member access</li> <li><code>[index]</code> - Array element access</li> <li><code>[*]</code> - All array elements</li> <li><code>..property</code> - Recursive descent</li> <li><code>[start:end]</code> - Array slice</li> </ul> <h3 id="json-functions" class="position-relative d-flex align-items-center group"> <span>JSON Functions</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="json-functions" aria-haspopup="dialog" aria-label="Share link: JSON Functions"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p><strong>Manipulation Functions</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Merge</span><span class="w"> </span><span class="py">JSON</span><span class="w"> </span><span class="py">objects</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">JSON_MERGE</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">preferences</span><span class="p">,</span><span class="w"> </span><span class="err">&#39;</span><span class="p">{</span><span class="s">&#34;newSetting&#34;</span><span class="p">:</span><span class="w"> </span><span class="nc">true</span><span class="p">}</span><span class="err">&#39;</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">updated_prefs</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Add</span><span class="w"> </span><span class="py">property</span><span class="w"> </span><span class="py">to</span><span class="w"> </span><span class="py">JSON</span><span class="w"> </span><span class="py">object</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SET</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">specs</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">JSON_SET</span><span class="p">(</span><span class="py">p</span><span class="err">.</span><span class="py">specs</span><span class="p">,</span><span class="w"> </span><span class="err">&#39;$.</span><span class="py">warranty</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="err">&#39;</span><span class="py">2</span><span class="w"> </span><span class="py">years</span><span class="err">&#39;</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Remove</span><span class="w"> </span><span class="py">property</span><span class="w"> </span><span class="py">from</span><span class="w"> </span><span class="py">JSON</span><span class="w"> </span><span class="py">object</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SET</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">preferences</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">JSON_REMOVE</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">preferences</span><span class="p">,</span><span class="w"> </span><span class="err">&#39;$.</span><span class="py">deprecated_setting</span><span class="err">&#39;</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Insert</span><span class="w"> </span><span class="py">into</span><span class="w"> </span><span class="py">JSON</span><span class="w"> </span><span class="py">array</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SET</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">tags</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">JSON_ARRAY_APPEND</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">tags</span><span class="p">,</span><span class="w"> </span><span class="err">&#39;</span><span class="py">graph</span><span class="err">-</span><span class="py">expert</span><span class="err">&#39;</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Type Checking</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Check</span><span class="w"> </span><span class="py">JSON</span><span class="w"> </span><span class="kd">type</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">JSON_TYPE</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">preferences</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">pref_type</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">JSON_TYPE</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">tags</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">tags_type</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Validate</span><span class="w"> </span><span class="py">JSON</span><span class="w"> </span><span class="py">structure</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">doc</span><span class="p">:</span><span class="nc">Document</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">JSON_VALID</span><span class="p">(</span><span class="py">doc</span><span class="err">.</span><span class="py">data</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">doc</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Array Functions</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Get</span><span class="w"> </span><span class="py">array</span><span class="w"> </span><span class="py">length</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">JSON_LENGTH</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">tags</span><span class="p">)</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">3</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">tags</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Check</span><span class="w"> </span><span class="py">array</span><span class="w"> </span><span class="py">contains</span><span class="w"> </span><span class="py">value</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">JSON_CONTAINS</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">tags</span><span class="p">,</span><span class="w"> </span><span class="err">&#39;</span><span class="py">developer</span><span class="err">&#39;</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Get</span><span class="w"> </span><span class="py">array</span><span class="w"> </span><span class="py">elements</span><span class="w"> </span><span class="py">as</span><span class="w"> </span><span class="py">rows</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">doc</span><span class="p">:</span><span class="nc">Document</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">UNWIND</span><span class="w"> </span><span class="py">JSON_ARRAY_ELEMENTS</span><span class="p">(</span><span class="py">doc</span><span class="err">.</span><span class="py">data</span><span class="err">.</span><span class="py">results</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">result</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">result</span><span class="err">.</span><span class="py">id</span><span class="p">,</span><span class="w"> </span><span class="py">result</span><span class="err">.</span><span class="py">value</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Aggregation with JSON</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Aggregate</span><span class="w"> </span><span class="py">values</span><span class="w"> </span><span class="py">into</span><span class="w"> </span><span class="py">JSON</span><span class="w"> </span><span class="py">array</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">PURCHASED</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">JSON_AGG</span><span class="p">(</span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">purchased_products</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Aggregate</span><span class="w"> </span><span class="py">into</span><span class="w"> </span><span class="py">JSON</span><span class="w"> </span><span class="py">object</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">department</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">JSON_OBJECT_AGG</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">salary</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">salaries</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">GROUP</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">department</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div> <h3 id="indexing-json-properties" class="position-relative d-flex align-items-center group"> <span>Indexing JSON Properties</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="indexing-json-properties" aria-haspopup="dialog" aria-label="Share link: Indexing JSON Properties"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p><strong>Property Indexes on JSON Fields</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="kd">on</span><span class="w"> </span><span class="py">JSON</span><span class="w"> </span><span class="py">property</span><span class="w"> </span><span class="py">path</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">user_theme</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">preferences</span><span class="err">.</span><span class="py">theme</span><span class="p">)</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="kd">on</span><span class="w"> </span><span class="py">nested</span><span class="w"> </span><span class="py">JSON</span><span class="w"> </span><span class="py">field</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">product_storage</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Product</span><span class="p">(</span><span class="py">specs</span><span class="err">.</span><span class="py">storage</span><span class="err">.</span><span class="kd">type</span><span class="p">)</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="nc">Use</span><span class="w"> </span><span class="py">indexed</span><span class="w"> </span><span class="py">JSON</span><span class="w"> </span><span class="py">property</span><span class="w"> </span><span class="py">in</span><span class="w"> </span><span class="kd">query</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">preferences</span><span class="err">.</span><span class="py">theme</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">&#39;</span><span class="py">dark</span><span class="err">&#39;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Uses</span><span class="w"> </span><span class="py">index</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Full-Text Indexes on JSON</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">full</span><span class="err">-</span><span class="py">text</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="kd">on</span><span class="w"> </span><span class="py">JSON</span><span class="w"> </span><span class="py">string</span><span class="w"> </span><span class="py">values</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">FULLTEXT</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">doc_content</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Document</span><span class="p">(</span><span class="py">data</span><span class="err">.</span><span class="py">content</span><span class="p">)</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Search</span><span class="w"> </span><span class="py">within</span><span class="w"> </span><span class="py">JSON</span><span class="w"> </span><span class="py">properties</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">doc</span><span class="p">:</span><span class="nc">Document</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">doc</span><span class="err">.</span><span class="py">data</span><span class="err">.</span><span class="py">content</span><span class="w"> </span><span class="py">MATCHES</span><span class="w"> </span><span class="err">&#39;</span><span class="py">graph</span><span class="w"> </span><span class="py">database</span><span class="err">&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">doc</span><span class="err">.</span><span class="py">title</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Expression Indexes</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Index</span><span class="w"> </span><span class="py">computed</span><span class="w"> </span><span class="py">JSON</span><span class="w"> </span><span class="py">values</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">user_tag_count</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">JSON_LENGTH</span><span class="p">(</span><span class="py">tags</span><span class="p">))</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Query</span><span class="w"> </span><span class="py">using</span><span class="w"> </span><span class="py">indexed</span><span class="w"> </span><span class="py">expression</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">JSON_LENGTH</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">tags</span><span class="p">)</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">5</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div> <h3 id="json-schema-validation" class="position-relative d-flex align-items-center group"> <span>JSON Schema Validation</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="json-schema-validation" aria-haspopup="dialog" aria-label="Share link: JSON Schema Validation"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p>Geode supports JSON Schema validation for ensuring data quality:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Define</span><span class="w"> </span><span class="kd">schema</span><span class="w"> </span><span class="py">constraint</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">CONSTRAINT</span><span class="w"> </span><span class="py">user_preferences_schema</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ASSERT</span><span class="w"> </span><span class="py">JSON_SCHEMA</span><span class="p">(</span><span class="py">preferences</span><span class="p">,</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kd">type</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">object</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">properties</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">theme</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="nc">type</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">string</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="kd">enum</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="err">&#39;</span><span class="nc">light</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">dark</span><span class="err">&#39;</span><span class="p">]},</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">language</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="nc">type</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">string</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">pattern</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;^</span><span class="p">[</span><span class="nc">a</span><span class="err">-</span><span class="py">z</span><span class="p">]{</span><span class="py">2</span><span class="p">}</span><span class="err">$&#39;</span><span class="p">},</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">notifications</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="nc">type</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">boolean</span><span class="err">&#39;</span><span class="p">}</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">},</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">required</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="err">&#39;</span><span class="nc">theme</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="err">&#39;</span><span class="py">language</span><span class="err">&#39;</span><span class="p">]</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">})</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Invalid</span><span class="w"> </span><span class="py">data</span><span class="w"> </span><span class="py">will</span><span class="w"> </span><span class="py">be</span><span class="w"> </span><span class="py">rejected</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Bob</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">preferences</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="nc">theme</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">invalid</span><span class="err">&#39;</span><span class="p">}</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Error</span><span class="p">:</span><span class="w"> </span><span class="nc">violates</span><span class="w"> </span><span class="kd">schema</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">})</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div> <h3 id="json-in-relationships" class="position-relative d-flex align-items-center group"> <span>JSON in Relationships</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="json-in-relationships" aria-haspopup="dialog" aria-label="Share link: JSON in Relationships"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p>JSON properties work seamlessly in relationship properties:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">relationship</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">JSON</span><span class="w"> </span><span class="py">metadata</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Alice</span><span class="err">&#39;</span><span class="p">}),</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Laptop</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">VIEWED</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">session</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">timestamp</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">2024</span><span class="err">-</span><span class="py">01</span><span class="err">-</span><span class="py">24T10</span><span class="p">:</span><span class="nc">00</span><span class="p">:</span><span class="nc">00Z</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">device</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">mobile</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">location</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="nc">city</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Seattle</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">country</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">US</span><span class="err">&#39;</span><span class="p">}</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">}</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">p</span><span class="p">)</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Query</span><span class="w"> </span><span class="py">relationships</span><span class="w"> </span><span class="py">by</span><span class="w"> </span><span class="py">JSON</span><span class="w"> </span><span class="py">properties</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="err">-</span><span class="p">[</span><span class="py">v</span><span class="p">:</span><span class="nc">VIEWED</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">v</span><span class="err">.</span><span class="py">session</span><span class="err">.</span><span class="py">device</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">&#39;</span><span class="py">mobile</span><span class="err">&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">v</span><span class="err">.</span><span class="py">session</span><span class="err">.</span><span class="py">location</span><span class="err">.</span><span class="py">city</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div> <h3 id="performance-optimization" class="position-relative d-flex align-items-center group"> <span>Performance Optimization</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="performance-optimization" aria-haspopup="dialog" aria-label="Share link: Performance Optimization"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p><strong>Index Usage</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Efficient</span><span class="p">:</span><span class="w"> </span><span class="nc">Uses</span><span class="w"> </span><span class="py">property</span><span class="w"> </span><span class="py">index</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">preferences</span><span class="err">.</span><span class="py">theme</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">&#39;</span><span class="py">dark</span><span class="err">&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Less</span><span class="w"> </span><span class="py">efficient</span><span class="p">:</span><span class="w"> </span><span class="nc">Full</span><span class="w"> </span><span class="py">scan</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">JSON_EXTRACT</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">preferences</span><span class="p">,</span><span class="w"> </span><span class="err">&#39;$.</span><span class="py">theme</span><span class="err">&#39;</span><span class="p">)</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">&#39;</span><span class="py">dark</span><span class="err">&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Projection Optimization</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Retrieve</span><span class="w"> </span><span class="kd">on</span><span class="py">ly</span><span class="w"> </span><span class="py">needed</span><span class="w"> </span><span class="py">JSON</span><span class="w"> </span><span class="py">fields</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">specs</span><span class="err">.</span><span class="py">cpu</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">specs</span><span class="err">.</span><span class="py">ram</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Partial</span><span class="w"> </span><span class="py">access</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Avoid</span><span class="w"> </span><span class="py">retrieving</span><span class="w"> </span><span class="py">entire</span><span class="w"> </span><span class="py">JSON</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">specs</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Full</span><span class="w"> </span><span class="py">JSON</span><span class="w"> </span><span class="py">retrieval</span><span class="w"> </span></span></span></code></pre></div><p><strong>Denormalization Strategy</strong>:</p> <p>For frequently accessed JSON fields, consider extracting to top-level properties:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Extract</span><span class="w"> </span><span class="py">commonly</span><span class="w"> </span><span class="py">queried</span><span class="w"> </span><span class="py">fields</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SET</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">theme</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">preferences</span><span class="err">.</span><span class="py">theme</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">language</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">preferences</span><span class="err">.</span><span class="py">language</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="kd">on</span><span class="w"> </span><span class="py">extracted</span><span class="w"> </span><span class="py">field</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">user_theme_extracted</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">theme</span><span class="p">)</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div> <h3 id="integration-with-client-libraries" class="position-relative d-flex align-items-center group"> <span>Integration with Client Libraries</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="integration-with-client-libraries" aria-haspopup="dialog" aria-label="Share link: Integration with Client Libraries"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p><strong>Go Client</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">UserPreferences</span> <span class="kd">struct</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="nx">Theme</span> <span class="kt">string</span> <span class="s">`json:&#34;theme&#34;`</span> </span></span><span class="line"><span class="cl"> <span class="nx">Language</span> <span class="kt">string</span> <span class="s">`json:&#34;language&#34;`</span> </span></span><span class="line"><span class="cl"> <span class="nx">Notifications</span> <span class="kt">bool</span> <span class="s">`json:&#34;notifications&#34;`</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nx">prefs</span> <span class="o">:=</span> <span class="nx">UserPreferences</span><span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="nx">Theme</span><span class="p">:</span> <span class="s">&#34;dark&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nx">Language</span><span class="p">:</span> <span class="s">&#34;en&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nx">Notifications</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nx">prefsJSON</span><span class="p">,</span> <span class="nx">_</span> <span class="o">:=</span> <span class="nx">json</span><span class="p">.</span><span class="nf">Marshal</span><span class="p">(</span><span class="nx">prefs</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nx">_</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">conn</span><span class="p">.</span><span class="nf">Execute</span><span class="p">(</span> </span></span><span class="line"><span class="cl"> <span class="s">&#34;CREATE (u:User {name: $name, preferences: $prefs})&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="kd">map</span><span class="p">[</span><span class="kt">string</span><span class="p">]</span><span class="kd">interface</span><span class="p">{}{</span> </span></span><span class="line"><span class="cl"> <span class="s">&#34;name&#34;</span><span class="p">:</span> <span class="s">&#34;Alice&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s">&#34;prefs&#34;</span><span class="p">:</span> <span class="nb">string</span><span class="p">(</span><span class="nx">prefsJSON</span><span class="p">),</span> </span></span><span class="line"><span class="cl"> <span class="p">},</span> </span></span><span class="line"><span class="cl"><span class="p">)</span> </span></span></code></pre></div><p><strong>Python Client</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">json</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">preferences</span> <span class="o">=</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;theme&#34;</span><span class="p">:</span> <span class="s2">&#34;dark&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;language&#34;</span><span class="p">:</span> <span class="s2">&#34;en&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;notifications&#34;</span><span class="p">:</span> <span class="kc">True</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;CREATE (u:User {name: $name, preferences: $prefs})&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">parameters</span><span class="o">=</span><span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;name&#34;</span><span class="p">:</span> <span class="s2">&#34;Alice&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;prefs&#34;</span><span class="p">:</span> <span class="n">json</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">preferences</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="p">}</span> </span></span><span class="line"><span class="cl"><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Query returns parsed JSON</span> </span></span><span class="line"><span class="cl"><span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">client</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">&#34;MATCH (u:User) RETURN u.preferences AS prefs&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="n">prefs</span> <span class="o">=</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">&#34;prefs&#34;</span><span class="p">]</span> <span class="c1"># Already parsed as dict</span> </span></span></code></pre></div><p><strong>Rust Client</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="k">use</span><span class="w"> </span><span class="n">serde_json</span>::<span class="n">json</span><span class="p">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kd">let</span><span class="w"> </span><span class="n">preferences</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="fm">json!</span><span class="p">({</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="s">&#34;theme&#34;</span>: <span class="s">&#34;dark&#34;</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="s">&#34;language&#34;</span>: <span class="s">&#34;en&#34;</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="s">&#34;notifications&#34;</span>: <span class="nc">true</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">});</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="n">client</span><span class="p">.</span><span class="n">execute</span><span class="p">(</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="s">&#34;CREATE (u:User {name: $name, preferences: $prefs})&#34;</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="fm">params!</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="s">&#34;name&#34;</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="s">&#34;Alice&#34;</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="s">&#34;prefs&#34;</span><span class="w"> </span><span class="o">=&gt;</span><span class="w"> </span><span class="n">preferences</span><span class="p">.</span><span class="n">to_string</span><span class="p">()</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">}</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">).</span><span class="k">await</span><span class="o">?</span><span class="p">;</span><span class="w"> </span></span></span></code></pre></div> <h3 id="best-practices" class="position-relative d-flex align-items-center group"> <span>Best Practices</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="best-practices" aria-haspopup="dialog" aria-label="Share link: Best Practices"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><ol> <li> <p><strong>Validate JSON Structure</strong>: Use JSON Schema constraints for critical data to ensure consistency.</p> </li> <li> <p><strong>Index Frequently Queried Paths</strong>: Create indexes on JSON properties used in WHERE clauses and ORDER BY operations.</p> </li> <li> <p><strong>Avoid Deep Nesting</strong>: Keep JSON hierarchies shallow (3-4 levels max) for better performance and maintainability.</p> </li> <li> <p><strong>Extract Hot Fields</strong>: Move frequently accessed JSON fields to top-level properties for better index efficiency.</p> </li> <li> <p><strong>Use Appropriate Types</strong>: Store structured data as JSON only when schema flexibility is needed. Use native types when possible.</p> </li> <li> <p><strong>Normalize When Appropriate</strong>: Don&rsquo;t use JSON as an excuse to avoid proper graph modeling. Model relationships as edges, not JSON arrays.</p> </li> </ol> <h3 id="common-use-cases" class="position-relative d-flex align-items-center group"> <span>Common Use Cases</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="common-use-cases" aria-haspopup="dialog" aria-label="Share link: Common Use Cases"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p><strong>Configuration Storage</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">app</span><span class="p">:</span><span class="nc">Application</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">MyApp</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">config</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">database</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="nc">host</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">localhost</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">port</span><span class="p">:</span><span class="w"> </span><span class="nc">3141</span><span class="p">},</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">cache</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="nc">ttl</span><span class="p">:</span><span class="w"> </span><span class="nc">3600</span><span class="p">,</span><span class="w"> </span><span class="py">max_size</span><span class="p">:</span><span class="w"> </span><span class="nc">1000</span><span class="p">},</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">features</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="nc">new_ui</span><span class="p">:</span><span class="w"> </span><span class="nc">true</span><span class="p">,</span><span class="w"> </span><span class="py">beta_features</span><span class="p">:</span><span class="w"> </span><span class="nc">false</span><span class="p">}</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">}</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">})</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Event Logging</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">event</span><span class="p">:</span><span class="nc">Event</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kd">type</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">user_action</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">timestamp</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">2024</span><span class="err">-</span><span class="py">01</span><span class="err">-</span><span class="py">24T10</span><span class="p">:</span><span class="nc">00</span><span class="p">:</span><span class="nc">00Z</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">payload</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">action</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">login</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">user_id</span><span class="p">:</span><span class="w"> </span><span class="nc">12345</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">device</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="nc">type</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">mobile</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">os</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">iOS</span><span class="err">&#39;</span><span class="p">},</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">location</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="nc">lat</span><span class="p">:</span><span class="w"> </span><span class="nc">47</span><span class="mf">.6062</span><span class="p">,</span><span class="w"> </span><span class="py">lon</span><span class="p">:</span><span class="w"> </span><span class="err">-</span><span class="nc">122</span><span class="mf">.3321</span><span class="p">}</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">}</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">})</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>API Response Caching</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">cache</span><span class="p">:</span><span class="nc">APICache</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">endpoint</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;/</span><span class="nc">api</span><span class="err">/</span><span class="py">users</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">response</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">status</span><span class="p">:</span><span class="w"> </span><span class="nc">200</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">data</span><span class="p">:</span><span class="w"> </span><span class="p">[{</span><span class="nc">id</span><span class="p">:</span><span class="w"> </span><span class="nc">1</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Alice</span><span class="err">&#39;</span><span class="p">},</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">2</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Bob</span><span class="err">&#39;</span><span class="p">}],</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">meta</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="nc">total</span><span class="p">:</span><span class="w"> </span><span class="nc">2</span><span class="p">,</span><span class="w"> </span><span class="py">page</span><span class="p">:</span><span class="w"> </span><span class="nc">1</span><span class="p">}</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">},</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">expires_at</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">2024</span><span class="err">-</span><span class="py">01</span><span class="err">-</span><span class="py">24T11</span><span class="p">:</span><span class="nc">00</span><span class="p">:</span><span class="nc">00Z</span><span class="err">&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">})</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div> <h3 id="related-topics" class="position-relative d-flex align-items-center group"> <span>Related Topics</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="related-topics" aria-haspopup="dialog" aria-label="Share link: Related Topics"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><ul> <li>Data Types and Type System</li> <li>Property Indexing Strategies</li> <li>Query Optimization</li> <li>Schema Design and Constraints</li> <li>Text Processing and Unicode</li> <li>Data Import and Export</li> <li>Client Library Integration</li> </ul> <h3 id="further-reading" class="position-relative d-flex align-items-center group"> <span>Further Reading</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="further-reading" aria-haspopup="dialog" aria-label="Share link: Further Reading"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><ul> <li>JSON Functions Reference</li> <li>JSON Path Syntax Guide</li> <li>JSON Schema Validation</li> <li>Performance Tuning for JSON Queries</li> <li>Semi-Structured Data Modeling</li> <li>JSON Import/Export Formats</li> </ul>

Related Articles