<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-15 --> <p>Advanced features in Geode represent the cutting edge of graph database technology, providing sophisticated capabilities that go beyond standard query and transaction processing. These features enable enterprise teams to build highly scalable, secure, and intelligent applications that leverage the full power of graph data structures and the ISO/IEC 39075:2024 GQL conformance profile.</p> <p>Geode&rsquo;s advanced feature set includes vector search with HNSW indexing for semantic similarity, full-text search with BM25 ranking, distributed architecture with QUIC transport, Row-Level Security (RLS) for fine-grained access control, Change Data Capture (CDC) for real-time streaming, and sophisticated graph algorithms for analytics. Each feature is designed to work seamlessly within Geode&rsquo;s ACID-compliant, production-ready architecture while maintaining the 97.4% test coverage that ensures reliability.</p> <p>This category explores these advanced capabilities in depth, providing architectural insights, implementation patterns, performance considerations, and real-world examples that demonstrate how to leverage Geode&rsquo;s most powerful features effectively.</p> <h3 id="key-advanced-features" class="position-relative d-flex align-items-center group"> <span>Key Advanced Features</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="key-advanced-features" aria-haspopup="dialog" aria-label="Share link: Key Advanced Features"> <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> <h4 id="vector-search-and-embeddings" class="position-relative d-flex align-items-center group"> <span>Vector Search and Embeddings</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="vector-search-and-embeddings" aria-haspopup="dialog" aria-label="Share link: Vector Search and Embeddings"> <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> </h4><p>Geode implements Hierarchical Navigable Small World (HNSW) indexing for approximate nearest neighbor search, enabling semantic similarity queries on vector embeddings. This feature supports AI/ML workloads including recommendation systems, semantic search, and similarity detection.</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">a</span><span class="w"> </span><span class="py">node</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">vector</span><span class="w"> </span><span class="py">embeddings</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="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">Graph</span><span class="w"> </span><span class="py">Database</span><span class="w"> </span><span class="py">Architecture</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">embedding</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="nc">0</span><span class="mf">.23</span><span class="p">,</span><span class="w"> </span><span class="py">0</span><span class="mf">.45</span><span class="p">,</span><span class="w"> </span><span class="py">0</span><span class="mf">.67</span><span class="p">,</span><span class="w"> </span><span class="kd">...</span><span class="p">]</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="py">384</span><span class="err">-</span><span class="py">dimensional</span><span class="w"> </span><span class="py">vector</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="err">//</span><span class="w"> </span><span class="py">Find</span><span class="w"> </span><span class="py">similar</span><span class="w"> </span><span class="py">documents</span><span class="w"> </span><span class="py">using</span><span class="w"> </span><span class="py">vector</span><span class="w"> </span><span class="py">search</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">d</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">vector_similarity</span><span class="p">(</span><span class="py">d</span><span class="err">.</span><span class="py">embedding</span><span class="p">,</span><span class="w"> </span><span class="nv">$query_vector</span><span class="p">)</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">0</span><span class="mf">.8</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">d</span><span class="err">.</span><span class="py">title</span><span class="p">,</span><span class="w"> </span><span class="py">vector_similarity</span><span class="p">(</span><span class="py">d</span><span class="err">.</span><span class="py">embedding</span><span class="p">,</span><span class="w"> </span><span class="nv">$query_vector</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">score</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">score</span><span class="w"> </span><span class="py">DESC</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">LIMIT</span><span class="w"> </span><span class="py">10</span><span class="w"> </span></span></span></code></pre></div><p>HNSW indexes are automatically maintained and provide sub-linear search time even with millions of nodes. The index structure uses bidirectional links at multiple layers, ensuring both insertion and search efficiency.</p> <h4 id="full-text-search-with-bm25" class="position-relative d-flex align-items-center group"> <span>Full-Text Search with BM25</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="full-text-search-with-bm25" aria-haspopup="dialog" aria-label="Share link: Full-Text Search with BM25"> <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> </h4><p>Geode&rsquo;s BM25 implementation provides production-grade full-text search with relevance ranking based on term frequency and document statistics. This enables sophisticated text search capabilities directly within your graph queries.</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">a</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></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">TEXT</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">content</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="err">//</span><span class="w"> </span><span class="py">Search</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">BM25</span><span class="w"> </span><span class="py">ranking</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">d</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">text_search</span><span class="p">(</span><span class="py">d</span><span class="err">.</span><span class="py">content</span><span class="p">,</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="w"> </span><span class="py">performance</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">d</span><span class="err">.</span><span class="py">title</span><span class="p">,</span><span class="w"> </span><span class="py">bm25_score</span><span class="p">(</span><span class="py">d</span><span class="err">.</span><span class="py">content</span><span class="p">,</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="w"> </span><span class="py">performance</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">relevance</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">relevance</span><span class="w"> </span><span class="py">DESC</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">LIMIT</span><span class="w"> </span><span class="py">20</span><span class="w"> </span></span></span></code></pre></div><p>BM25 scoring considers term saturation and document length normalization, providing more sophisticated ranking than simple term frequency approaches.</p> <h4 id="row-level-security-rls" class="position-relative d-flex align-items-center group"> <span>Row-Level Security (RLS)</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="row-level-security-rls" aria-haspopup="dialog" aria-label="Share link: Row-Level Security (RLS)"> <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> </h4><p>RLS policies provide fine-grained access control at the data level, enabling multi-tenant applications and complex authorization requirements without application-level filtering.</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">from</span> <span class="nn">geode_client</span> <span class="kn">import</span> <span class="n">Client</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">client</span> <span class="o">=</span> <span class="n">Client</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="s2">&#34;localhost&#34;</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">3141</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="c1"># Create a security policy</span> </span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE POLICY user_data_access ON :UserData </span></span></span><span class="line"><span class="cl"><span class="s2"> USING (node.user_id = current_user_id()) </span></span></span><span class="line"><span class="cl"><span class="s2"> WITH CHECK (node.user_id = current_user_id()) </span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1"># Queries automatically respect RLS policies</span> </span></span><span class="line"><span class="cl"> <span class="c1"># Users only see their own data</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">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">&#34;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (d:UserData) </span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN d.content </span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span><span class="p">)</span> </span></span></code></pre></div><p>RLS policies are evaluated at query execution time and integrate seamlessly with Geode&rsquo;s authentication system. They provide mandatory access control that cannot be bypassed by application code.</p> <h4 id="change-data-capture-cdc" class="position-relative d-flex align-items-center group"> <span>Change Data Capture (CDC)</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="change-data-capture-cdc" aria-haspopup="dialog" aria-label="Share link: Change Data Capture (CDC)"> <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> </h4><p>CDC streams provide real-time notifications of data changes, enabling event-driven architectures, data synchronization, and audit logging without polling.</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span> </span></span><span class="line"><span class="cl"> <span class="s">&#34;context&#34;</span> </span></span><span class="line"><span class="cl"> <span class="s">&#34;fmt&#34;</span> </span></span><span class="line"><span class="cl"> <span class="s">&#34;geodedb.com/geode&#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="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="nx">client</span><span class="p">,</span> <span class="nx">_</span> <span class="o">:=</span> <span class="nx">geode</span><span class="p">.</span><span class="nf">Connect</span><span class="p">(</span><span class="s">&#34;localhost:3141&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">defer</span> <span class="nx">client</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1">// Subscribe to CDC stream </span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="nx">stream</span><span class="p">,</span> <span class="nx">_</span> <span class="o">:=</span> <span class="nx">client</span><span class="p">.</span><span class="nf">SubscribeCDC</span><span class="p">(</span><span class="nx">context</span><span class="p">.</span><span class="nf">Background</span><span class="p">(),</span> <span class="nx">geode</span><span class="p">.</span><span class="nx">CDCOptions</span><span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="nx">IncludeTypes</span><span class="p">:</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">&#34;CREATE&#34;</span><span class="p">,</span> <span class="s">&#34;UPDATE&#34;</span><span class="p">,</span> <span class="s">&#34;DELETE&#34;</span><span class="p">},</span> </span></span><span class="line"><span class="cl"> <span class="nx">Labels</span><span class="p">:</span> <span class="p">[]</span><span class="kt">string</span><span class="p">{</span><span class="s">&#34;User&#34;</span><span class="p">,</span> <span class="s">&#34;Transaction&#34;</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="k">for</span> <span class="nx">event</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">stream</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;Change: %s on %s at %s\n&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nx">event</span><span class="p">.</span><span class="nx">Operation</span><span class="p">,</span> <span class="nx">event</span><span class="p">.</span><span class="nx">EntityID</span><span class="p">,</span> <span class="nx">event</span><span class="p">.</span><span class="nx">Timestamp</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Printf</span><span class="p">(</span><span class="s">&#34;Data: %v\n&#34;</span><span class="p">,</span> <span class="nx">event</span><span class="p">.</span><span class="nx">NewData</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>CDC streams are delivered via QUIC with at-least-once delivery guarantees. Events include before/after snapshots, operation metadata, and transaction context.</p> <h4 id="distributed-architecture" class="position-relative d-flex align-items-center group"> <span>Distributed Architecture</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="distributed-architecture" aria-haspopup="dialog" aria-label="Share link: Distributed Architecture"> <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> </h4><p>Geode&rsquo;s distributed mode provides horizontal scalability through sharding and replication, enabling deployments that handle billions of nodes and thousands of concurrent queries.</p> <p>Key distributed features include:</p> <ul> <li>Automatic data partitioning across shards</li> <li>Configurable replication factors for fault tolerance</li> <li>Distributed transaction coordination with two-phase commit</li> <li>Query routing and distributed execution</li> <li>Automatic failover and recovery</li> </ul> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Start a distributed cluster</span> </span></span><span class="line"><span class="cl">geode serve --mode distributed <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --node-id node-1 <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --cluster-peers node-2:3141,node-3:3141 <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --replication-factor <span class="m">3</span> </span></span></code></pre></div> <h4 id="time-travel-queries" class="position-relative d-flex align-items-center group"> <span>Time-Travel Queries</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="time-travel-queries" aria-haspopup="dialog" aria-label="Share link: Time-Travel Queries"> <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> </h4><p>Geode&rsquo;s MVCC (Multi-Version Concurrency Control) implementation enables time-travel queries that access historical data states without impacting current operations.</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">Query</span><span class="w"> </span><span class="py">data</span><span class="w"> </span><span class="py">as</span><span class="w"> </span><span class="py">it</span><span class="w"> </span><span class="py">existed</span><span class="w"> </span><span class="py">at</span><span class="w"> </span><span class="py">a</span><span class="w"> </span><span class="py">specific</span><span class="w"> </span><span class="py">time</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">AS</span><span class="w"> </span><span class="py">OF</span><span class="w"> </span><span class="py">TIMESTAMP</span><span class="w"> </span><span class="err">&#39;</span><span class="py">2025</span><span class="err">-</span><span class="py">01</span><span class="err">-</span><span class="py">01T00</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="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">title</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">all</span><span class="w"> </span><span class="py">versions</span><span class="w"> </span><span class="py">of</span><span class="w"> </span><span class="py">a</span><span class="w"> </span><span class="py">node</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">id</span><span class="p">:</span><span class="w"> </span><span class="nv">$user_id</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">FOR</span><span class="w"> </span><span class="py">ALL</span><span class="w"> </span><span class="py">VERSIONS</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">email</span><span class="p">,</span><span class="w"> </span><span class="py">version_timestamp</span><span class="p">()</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">version_timestamp</span><span class="p">()</span><span class="w"> </span></span></span></code></pre></div><p>Time-travel queries are useful for auditing, debugging, and analyzing historical trends without maintaining separate audit tables.</p> <h3 id="advanced-graph-algorithms" class="position-relative d-flex align-items-center group"> <span>Advanced Graph Algorithms</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="advanced-graph-algorithms" aria-haspopup="dialog" aria-label="Share link: Advanced Graph Algorithms"> <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 provides built-in implementations of sophisticated graph algorithms optimized for its storage engine:</p> <h4 id="community-detection" class="position-relative d-flex align-items-center group"> <span>Community Detection</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="community-detection" aria-haspopup="dialog" aria-label="Share link: Community Detection"> <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> </h4><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">Detect</span><span class="w"> </span><span class="py">communities</span><span class="w"> </span><span class="py">using</span><span class="w"> </span><span class="py">Louvain</span><span class="w"> </span><span class="py">algorithm</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CALL</span><span class="w"> </span><span class="py">graph</span><span class="err">.</span><span class="py">algorithms</span><span class="err">.</span><span class="py">community_detection</span><span class="p">(</span><span class="err">&#39;</span><span class="py">friendship_network</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">YIELD</span><span class="w"> </span><span class="py">community_id</span><span class="p">,</span><span class="w"> </span><span class="py">modularity</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">community_id</span><span class="p">,</span><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="err">*</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">size</span><span class="p">,</span><span class="w"> </span><span class="py">modularity</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">size</span><span class="w"> </span><span class="py">DESC</span><span class="w"> </span></span></span></code></pre></div> <h4 id="centrality-analysis" class="position-relative d-flex align-items-center group"> <span>Centrality Analysis</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="centrality-analysis" aria-haspopup="dialog" aria-label="Share link: Centrality Analysis"> <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> </h4><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">Calculate</span><span class="w"> </span><span class="py">PageRank</span><span class="w"> </span><span class="py">centrality</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">n</span><span class="p">:</span><span class="nc">WebPage</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WITH</span><span class="w"> </span><span class="py">graph</span><span class="err">.</span><span class="py">algorithms</span><span class="err">.</span><span class="py">pagerank</span><span class="p">(</span><span class="py">n</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="py">iterations</span><span class="p">:</span><span class="w"> </span><span class="nc">20</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">dampingFactor</span><span class="p">:</span><span class="w"> </span><span class="nc">0</span><span class="mf">.85</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 class="py">AS</span><span class="w"> </span><span class="py">rank</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">n</span><span class="err">.</span><span class="py">url</span><span class="p">,</span><span class="w"> </span><span class="py">rank</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">rank</span><span class="w"> </span><span class="py">DESC</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">LIMIT</span><span class="w"> </span><span class="py">100</span><span class="w"> </span></span></span></code></pre></div> <h4 id="path-finding" class="position-relative d-flex align-items-center group"> <span>Path Finding</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="path-finding" aria-haspopup="dialog" aria-label="Share link: Path Finding"> <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> </h4><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">Find</span><span class="w"> </span><span class="py">shortest</span><span class="w"> </span><span class="py">weighted</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="py">path</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">shortestPath</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">a</span><span class="p">:</span><span class="nc">Location</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">San</span><span class="w"> </span><span class="py">Francisco</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">b</span><span class="p">:</span><span class="nc">Location</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">New</span><span class="w"> </span><span class="py">York</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">a</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">ROUTE</span><span class="err">*</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">b</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">weightProperty</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">distance</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">RETURN</span><span class="w"> </span><span class="py">path</span><span class="p">,</span><span class="w"> </span><span class="py">reduce</span><span class="p">(</span><span class="py">d</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">0</span><span class="p">,</span><span class="w"> </span><span class="py">r</span><span class="w"> </span><span class="py">IN</span><span class="w"> </span><span class="py">relationships</span><span class="p">(</span><span class="py">path</span><span class="p">)</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="py">d</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="py">r</span><span class="err">.</span><span class="py">distance</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">total_distance</span><span class="w"> </span></span></span></code></pre></div> <h3 id="performance-optimization-features" class="position-relative d-flex align-items-center group"> <span>Performance Optimization Features</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-features" aria-haspopup="dialog" aria-label="Share link: Performance Optimization Features"> <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> <h4 id="query-plan-caching" class="position-relative d-flex align-items-center group"> <span>Query Plan Caching</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="query-plan-caching" aria-haspopup="dialog" aria-label="Share link: Query Plan Caching"> <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> </h4><p>Geode automatically caches prepared query plans, eliminating parse and optimization overhead for repeated queries. Plan caching is particularly effective for parameterized queries.</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># Prepared statements benefit from plan caching</span> </span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">prepare</span><span class="p">(</span><span class="s2">&#34;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (u:User {id: $user_id})-[:FRIEND]-&gt;(f:User) </span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN f.name, f.email </span></span></span><span class="line"><span class="cl"><span class="s2">&#34;&#34;&#34;</span><span class="p">)</span> <span class="k">as</span> <span class="n">stmt</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">user_id</span> <span class="ow">in</span> <span class="n">user_ids</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="n">results</span> <span class="o">=</span> <span class="k">await</span> <span class="n">stmt</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="n">user_id</span><span class="o">=</span><span class="n">user_id</span><span class="p">)</span> </span></span></code></pre></div> <h4 id="adaptive-indexing" class="position-relative d-flex align-items-center group"> <span>Adaptive Indexing</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="adaptive-indexing" aria-haspopup="dialog" aria-label="Share link: Adaptive Indexing"> <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> </h4><p>Geode monitors query patterns and can automatically suggest or create indexes for frequently accessed properties and patterns.</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Enable adaptive indexing</span> </span></span><span class="line"><span class="cl">geode config <span class="nb">set</span> adaptive_indexing.enabled <span class="nb">true</span> </span></span><span class="line"><span class="cl">geode config <span class="nb">set</span> adaptive_indexing.threshold <span class="m">1000</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># View index recommendations</span> </span></span><span class="line"><span class="cl">geode index recommendations </span></span></code></pre></div> <h4 id="write-ahead-log-wal-tuning" class="position-relative d-flex align-items-center group"> <span>Write-Ahead Log (WAL) Tuning</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="write-ahead-log-wal-tuning" aria-haspopup="dialog" aria-label="Share link: Write-Ahead Log (WAL) Tuning"> <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> </h4><p>Advanced WAL configuration enables trading durability guarantees for write performance in scenarios where some data loss is acceptable.</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># config.yaml</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nt">wal</span><span class="p">:</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">sync_mode</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;group_commit&#34;</span><span class="w"> </span><span class="c"># Batch commits for throughput</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">flush_interval_ms</span><span class="p">:</span><span class="w"> </span><span class="m">100</span><span class="w"> </span><span class="c"># Group commit window</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">compression</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;zstd&#34;</span><span class="w"> </span><span class="c"># Compress WAL entries</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nt">segment_size_mb</span><span class="p">:</span><span class="w"> </span><span class="m">64</span><span class="w"> </span><span class="c"># Larger segments reduce overhead</span><span class="w"> </span></span></span></code></pre></div> <h3 id="security-features" class="position-relative d-flex align-items-center group"> <span>Security Features</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="security-features" aria-haspopup="dialog" aria-label="Share link: Security Features"> <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> <h4 id="transparent-data-encryption-tde" class="position-relative d-flex align-items-center group"> <span>Transparent Data Encryption (TDE)</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="transparent-data-encryption-tde" aria-haspopup="dialog" aria-label="Share link: Transparent Data Encryption (TDE)"> <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> </h4><p>TDE encrypts data at rest using AES-256, protecting against unauthorized physical access to storage media.</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Enable TDE with key rotation</span> </span></span><span class="line"><span class="cl">geode config <span class="nb">set</span> encryption.tde.enabled <span class="nb">true</span> </span></span><span class="line"><span class="cl">geode config <span class="nb">set</span> encryption.tde.algorithm <span class="s2">&#34;aes-256-gcm&#34;</span> </span></span><span class="line"><span class="cl">geode config <span class="nb">set</span> encryption.tde.key_rotation_days <span class="m">90</span> </span></span></code></pre></div> <h4 id="field-level-encryption-fle" class="position-relative d-flex align-items-center group"> <span>Field-Level Encryption (FLE)</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="field-level-encryption-fle" aria-haspopup="dialog" aria-label="Share link: Field-Level Encryption (FLE)"> <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> </h4><p>FLE encrypts specific properties client-side before transmission, ensuring sensitive data remains encrypted even within Geode&rsquo;s memory.</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">from</span> <span class="nn">geode_client</span> <span class="kn">import</span> <span class="n">EncryptedField</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Create a node with encrypted properties</span> </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 class="s2">&#34;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE (:Patient { </span></span></span><span class="line"><span class="cl"><span class="s2"> name: &#39;John Doe&#39;, </span></span></span><span class="line"><span class="cl"><span class="s2"> ssn: $encrypted_ssn, </span></span></span><span class="line"><span class="cl"><span class="s2"> diagnosis: $encrypted_diagnosis </span></span></span><span class="line"><span class="cl"><span class="s2"> }) </span></span></span><span class="line"><span class="cl"><span class="s2">&#34;&#34;&#34;</span><span class="p">,</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="s1">&#39;encrypted_ssn&#39;</span><span class="p">:</span> <span class="n">EncryptedField</span><span class="p">(</span><span class="s1">&#39;123-45-6789&#39;</span><span class="p">,</span> <span class="n">key_id</span><span class="o">=</span><span class="s1">&#39;patient_pii&#39;</span><span class="p">),</span> </span></span><span class="line"><span class="cl"> <span class="s1">&#39;encrypted_diagnosis&#39;</span><span class="p">:</span> <span class="n">EncryptedField</span><span class="p">(</span><span class="s1">&#39;Type 2 Diabetes&#39;</span><span class="p">,</span> <span class="n">key_id</span><span class="o">=</span><span class="s1">&#39;patient_phi&#39;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="p">})</span> </span></span></code></pre></div> <h3 id="monitoring-and-observability" class="position-relative d-flex align-items-center group"> <span>Monitoring and Observability</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="monitoring-and-observability" aria-haspopup="dialog" aria-label="Share link: Monitoring and Observability"> <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> <h4 id="prometheus-integration" class="position-relative d-flex align-items-center group"> <span>Prometheus Integration</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="prometheus-integration" aria-haspopup="dialog" aria-label="Share link: Prometheus Integration"> <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> </h4><p>Geode exposes detailed metrics in Prometheus format, enabling comprehensive monitoring and alerting.</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Scrape Geode metrics</span> </span></span><span class="line"><span class="cl">curl http://localhost:9090/metrics </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Key metrics include:</span> </span></span><span class="line"><span class="cl"><span class="c1"># - geode_query_duration_seconds</span> </span></span><span class="line"><span class="cl"><span class="c1"># - geode_transaction_commits_total</span> </span></span><span class="line"><span class="cl"><span class="c1"># - geode_index_operations_total</span> </span></span><span class="line"><span class="cl"><span class="c1"># - geode_wal_sync_duration_seconds</span> </span></span><span class="line"><span class="cl"><span class="c1"># - geode_mvcc_snapshot_age_seconds</span> </span></span></code></pre></div> <h4 id="query-profiling" class="position-relative d-flex align-items-center group"> <span>Query Profiling</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="query-profiling" aria-haspopup="dialog" aria-label="Share link: Query Profiling"> <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> </h4><p>PROFILE provides detailed execution metrics for performance tuning:</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">PROFILE</span><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">FRIEND</span><span class="err">*</span><span class="py">2</span><span class="err">.</span><span class="mf">.3</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">f</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">city</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">&#39;</span><span class="py">San</span><span class="w"> </span><span class="py">Francisco</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">DISTINCT</span><span class="w"> </span><span class="py">f</span><span class="err">.</span><span class="py">name</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">Returns</span><span class="w"> </span><span class="py">execution</span><span class="w"> </span><span class="py">plan</span><span class="w"> </span><span class="py">with</span><span class="p">:</span><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="err">-</span><span class="w"> </span><span class="nc">Row</span><span class="w"> </span><span class="py">counts</span><span class="w"> </span><span class="py">at</span><span class="w"> </span><span class="py">each</span><span class="w"> </span><span class="py">stage</span><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="err">-</span><span class="w"> </span><span class="py">Time</span><span class="w"> </span><span class="py">spent</span><span class="w"> </span><span class="py">in</span><span class="w"> </span><span class="py">each</span><span class="w"> </span><span class="py">operation</span><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="err">-</span><span class="w"> </span><span class="py">Index</span><span class="w"> </span><span class="py">usage</span><span class="w"> </span><span class="py">statistics</span><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="err">-</span><span class="w"> </span><span class="py">Memory</span><span class="w"> </span><span class="py">allocation</span><span class="w"> </span><span class="py">details</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> <h4 id="feature-selection" class="position-relative d-flex align-items-center group"> <span>Feature Selection</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="feature-selection" aria-haspopup="dialog" aria-label="Share link: Feature Selection"> <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> </h4><p>Not all applications need all advanced features. Consider:</p> <ul> <li><strong>Vector search</strong>: Use for semantic similarity, recommendations, and AI/ML integration</li> <li><strong>Full-text search</strong>: Use for content discovery and search interfaces</li> <li><strong>RLS</strong>: Use for multi-tenant SaaS applications and fine-grained security</li> <li><strong>CDC</strong>: Use for event-driven architectures and data synchronization</li> <li><strong>Distributed mode</strong>: Use when scaling beyond single-node capacity</li> </ul> <h4 id="performance-considerations" class="position-relative d-flex align-items-center group"> <span>Performance Considerations</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-considerations" aria-haspopup="dialog" aria-label="Share link: Performance Considerations"> <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> </h4><p>Advanced features have performance implications:</p> <ul> <li>HNSW indexes consume significant memory (O(N) with index size)</li> <li>RLS policies add overhead to every query (typically 5-10%)</li> <li>CDC streams require WAL retention (disk space)</li> <li>Distributed queries have network latency overhead</li> </ul> <p>Benchmark your specific workload and enable features incrementally.</p> <h4 id="security-hardening" class="position-relative d-flex align-items-center group"> <span>Security Hardening</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="security-hardening" aria-haspopup="dialog" aria-label="Share link: Security Hardening"> <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> </h4><p>When using advanced security features:</p> <ul> <li>Combine TDE + FLE for defense in depth</li> <li>Use RLS policies instead of application-level filtering</li> <li>Rotate encryption keys regularly</li> <li>Monitor CDC streams for suspicious patterns</li> <li>Enable audit logging for security-critical operations</li> </ul> <h3 id="integration-patterns" class="position-relative d-flex align-items-center group"> <span>Integration Patterns</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-patterns" aria-haspopup="dialog" aria-label="Share link: Integration Patterns"> <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> <h4 id="hybrid-search" class="position-relative d-flex align-items-center group"> <span>Hybrid Search</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="hybrid-search" aria-haspopup="dialog" aria-label="Share link: Hybrid Search"> <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> </h4><p>Combine full-text and vector search for powerful semantic + keyword search:</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">Hybrid</span><span class="w"> </span><span class="py">search</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">score</span><span class="w"> </span><span class="py">fusion</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">d</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">text_search</span><span class="p">(</span><span class="py">d</span><span class="err">.</span><span class="py">content</span><span class="p">,</span><span class="w"> </span><span class="nv">$query_text</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WITH</span><span class="w"> </span><span class="py">d</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">bm25_score</span><span class="p">(</span><span class="py">d</span><span class="err">.</span><span class="py">content</span><span class="p">,</span><span class="w"> </span><span class="nv">$query_text</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">text_score</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">vector_similarity</span><span class="p">(</span><span class="py">d</span><span class="err">.</span><span class="py">embedding</span><span class="p">,</span><span class="w"> </span><span class="nv">$query_vector</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">vector_score</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">d</span><span class="err">.</span><span class="py">title</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">0</span><span class="mf">.7</span><span class="w"> </span><span class="err">*</span><span class="w"> </span><span class="py">text_score</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="py">0</span><span class="mf">.3</span><span class="w"> </span><span class="err">*</span><span class="w"> </span><span class="py">vector_score</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">combined_score</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">combined_score</span><span class="w"> </span><span class="py">DESC</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">LIMIT</span><span class="w"> </span><span class="py">20</span><span class="w"> </span></span></span></code></pre></div> <h4 id="event-driven-architecture" class="position-relative d-flex align-items-center group"> <span>Event-Driven Architecture</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="event-driven-architecture" aria-haspopup="dialog" aria-label="Share link: Event-Driven Architecture"> <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> </h4><p>Use CDC to trigger external workflows:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">process_cdc_events</span><span class="p">():</span> </span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">Client</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="s2">&#34;localhost&#34;</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">3141</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">last_seen</span> <span class="o">=</span> <span class="s2">&#34;1970-01-01T00:00:00Z&#34;</span> </span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">while</span> <span class="kc">True</span><span class="p">:</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">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (e:ChangeLog) </span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE e.emitted_at &gt; $since </span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN e.operation AS operation, </span></span></span><span class="line"><span class="cl"><span class="s2"> e.labels AS labels, </span></span></span><span class="line"><span class="cl"><span class="s2"> e.entity_id AS entity_id, </span></span></span><span class="line"><span class="cl"><span class="s2"> e.after AS after, </span></span></span><span class="line"><span class="cl"><span class="s2"> e.emitted_at AS emitted_at </span></span></span><span class="line"><span class="cl"><span class="s2"> ORDER BY emitted_at </span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="p">{</span><span class="s2">&#34;since&#34;</span><span class="p">:</span> <span class="n">last_seen</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="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="n">labels</span> <span class="o">=</span> <span class="n">row</span><span class="p">[</span><span class="s2">&#34;labels&#34;</span><span class="p">]</span><span class="o">.</span><span class="n">raw_value</span> <span class="ow">or</span> <span class="p">[]</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">row</span><span class="p">[</span><span class="s2">&#34;operation&#34;</span><span class="p">]</span><span class="o">.</span><span class="n">raw_value</span> <span class="o">==</span> <span class="s2">&#34;CREATE&#34;</span> <span class="ow">and</span> <span class="s2">&#34;Order&#34;</span> <span class="ow">in</span> <span class="n">labels</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">process_order</span><span class="p">(</span><span class="n">row</span><span class="p">[</span><span class="s2">&#34;after&#34;</span><span class="p">]</span><span class="o">.</span><span class="n">raw_value</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">elif</span> <span class="n">row</span><span class="p">[</span><span class="s2">&#34;operation&#34;</span><span class="p">]</span><span class="o">.</span><span class="n">raw_value</span> <span class="o">==</span> <span class="s2">&#34;UPDATE&#34;</span> <span class="ow">and</span> <span class="s2">&#34;Inventory&#34;</span> <span class="ow">in</span> <span class="n">labels</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">refresh_recommendations</span><span class="p">(</span><span class="n">row</span><span class="p">[</span><span class="s2">&#34;entity_id&#34;</span><span class="p">]</span><span class="o">.</span><span class="n">raw_value</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">last_seen</span> <span class="o">=</span> <span class="n">row</span><span class="p">[</span><span class="s2">&#34;emitted_at&#34;</span><span class="p">]</span><span class="o">.</span><span class="n">raw_value</span> </span></span></code></pre></div> <h3 id="advanced-transaction-patterns" class="position-relative d-flex align-items-center group"> <span>Advanced Transaction Patterns</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="advanced-transaction-patterns" aria-haspopup="dialog" aria-label="Share link: Advanced Transaction Patterns"> <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> <h4 id="optimistic-concurrency-control" class="position-relative d-flex align-items-center group"> <span>Optimistic Concurrency Control</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="optimistic-concurrency-control" aria-haspopup="dialog" aria-label="Share link: Optimistic Concurrency Control"> <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> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">update_with_optimistic_locking</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">node_id</span><span class="p">,</span> <span class="n">version</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&#34;&#34;Update with version checking to prevent lost updates.&#34;&#34;&#34;</span> </span></span><span class="line"><span class="cl"> <span class="k">try</span><span class="p">:</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;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (n:Node {id: $id, version: $expected_version}) </span></span></span><span class="line"><span class="cl"><span class="s2"> SET n.data = $new_data, </span></span></span><span class="line"><span class="cl"><span class="s2"> n.version = $expected_version + 1 </span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN n.version AS new_version </span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span><span class="p">,</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;id&#34;</span><span class="p">:</span> <span class="n">node_id</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;expected_version&#34;</span><span class="p">:</span> <span class="n">version</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;new_data&#34;</span><span class="p">:</span> <span class="s2">&#34;updated&#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="k">return</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="k">if</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span> <span class="k">else</span> <span class="kc">None</span> </span></span><span class="line"><span class="cl"> <span class="k">except</span> <span class="n">geode_client</span><span class="o">.</span><span class="n">NoResultsError</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">raise</span> <span class="n">ConflictError</span><span class="p">(</span><span class="s2">&#34;Version mismatch - data was modified&#34;</span><span class="p">)</span> </span></span></code></pre></div> <h4 id="saga-pattern-for-distributed-transactions" class="position-relative d-flex align-items-center group"> <span>Saga Pattern for Distributed Transactions</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="saga-pattern-for-distributed-transactions" aria-haspopup="dialog" aria-label="Share link: Saga Pattern for Distributed Transactions"> <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> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">dataclasses</span> <span class="kn">import</span> <span class="n">dataclass</span> </span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">Callable</span><span class="p">,</span> <span class="n">Any</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nd">@dataclass</span> </span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">SagaStep</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="n">forward</span><span class="p">:</span> <span class="n">Callable</span> </span></span><span class="line"><span class="cl"> <span class="n">compensate</span><span class="p">:</span> <span class="n">Callable</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">execute_saga</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">steps</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">SagaStep</span><span class="p">]):</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&#34;&#34;Execute multi-step saga with compensation.&#34;&#34;&#34;</span> </span></span><span class="line"><span class="cl"> <span class="n">completed_steps</span> <span class="o">=</span> <span class="p">[]</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="k">try</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">begin</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">step</span> <span class="ow">in</span> <span class="n">steps</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">step</span><span class="o">.</span><span class="n">forward</span><span class="p">(</span><span class="n">conn</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">completed_steps</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">step</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="c1"># Compensate completed steps in reverse order</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">step</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="n">completed_steps</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="k">try</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">step</span><span class="o">.</span><span class="n">compensate</span><span class="p">(</span><span class="n">client</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">comp_error</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="n">logger</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="sa">f</span><span class="s2">&#34;Compensation failed: </span><span class="si">{</span><span class="n">comp_error</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">raise</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Example saga</span> </span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">transfer_money_saga</span><span class="p">(</span><span class="n">from_account</span><span class="p">,</span> <span class="n">to_account</span><span class="p">,</span> <span class="n">amount</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="n">steps</span> <span class="o">=</span> <span class="p">[</span> </span></span><span class="line"><span class="cl"> <span class="n">SagaStep</span><span class="p">(</span> </span></span><span class="line"><span class="cl"> <span class="n">forward</span><span class="o">=</span><span class="k">lambda</span> <span class="n">conn</span><span class="p">:</span> <span class="n">debit_account</span><span class="p">(</span><span class="n">conn</span><span class="p">,</span> <span class="n">from_account</span><span class="p">,</span> <span class="n">amount</span><span class="p">),</span> </span></span><span class="line"><span class="cl"> <span class="n">compensate</span><span class="o">=</span><span class="k">lambda</span> <span class="n">c</span><span class="p">:</span> <span class="n">credit_account</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">from_account</span><span class="p">,</span> <span class="n">amount</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="n">SagaStep</span><span class="p">(</span> </span></span><span class="line"><span class="cl"> <span class="n">forward</span><span class="o">=</span><span class="k">lambda</span> <span class="n">conn</span><span class="p">:</span> <span class="n">credit_account</span><span class="p">(</span><span class="n">conn</span><span class="p">,</span> <span class="n">to_account</span><span class="p">,</span> <span class="n">amount</span><span class="p">),</span> </span></span><span class="line"><span class="cl"> <span class="n">compensate</span><span class="o">=</span><span class="k">lambda</span> <span class="n">c</span><span class="p">:</span> <span class="n">debit_account</span><span class="p">(</span><span class="n">c</span><span class="p">,</span> <span class="n">to_account</span><span class="p">,</span> <span class="n">amount</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 class="k">await</span> <span class="n">execute_saga</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">steps</span><span class="p">)</span> </span></span></code></pre></div> <h3 id="advanced-indexing-strategies" class="position-relative d-flex align-items-center group"> <span>Advanced Indexing Strategies</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="advanced-indexing-strategies" aria-haspopup="dialog" aria-label="Share link: Advanced Indexing Strategies"> <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> <h4 id="composite-index-optimization" class="position-relative d-flex align-items-center group"> <span>Composite Index 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="composite-index-optimization" aria-haspopup="dialog" aria-label="Share link: Composite Index 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> </h4><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">composite</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">multi</span><span class="err">-</span><span class="py">column</span><span class="w"> </span><span class="py">queries</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_location_age</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">city</span><span class="p">,</span><span class="w"> </span><span class="py">age</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="err">--</span><span class="w"> </span><span class="py">Queries</span><span class="w"> </span><span class="py">benefit</span><span class="w"> </span><span class="py">from</span><span class="w"> </span><span class="py">composite</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">city</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">&#39;</span><span class="py">San</span><span class="w"> </span><span class="py">Francisco</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">AND</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">age</span><span class="w"> </span><span class="err">&gt;</span><span class="p">=</span><span class="w"> </span><span class="py">25</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">age</span><span class="w"> </span><span class="err">&lt;</span><span class="p">=</span><span class="w"> </span><span class="py">35</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="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">Index</span><span class="w"> </span><span class="py">covers</span><span class="w"> </span><span class="py">both</span><span class="w"> </span><span class="py">predicates</span><span class="w"> </span><span class="py">efficiently</span><span class="w"> </span></span></span></code></pre></div> <h4 id="partial-indexes-for-specific-conditions" class="position-relative d-flex align-items-center group"> <span>Partial Indexes for Specific Conditions</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="partial-indexes-for-specific-conditions" aria-haspopup="dialog" aria-label="Share link: Partial Indexes for Specific Conditions"> <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> </h4><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="py">ly</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">active</span><span class="w"> </span><span class="py">users</span><span class="w"> </span><span class="p">(</span><span class="py">reduces</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="py">size</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="py">INDEX</span><span class="w"> </span><span class="py">active_users</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">email</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">active</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">true</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">Queries</span><span class="w"> </span><span class="kd">on</span><span class="w"> </span><span class="py">active</span><span class="w"> </span><span class="py">users</span><span class="w"> </span><span class="py">use</span><span class="w"> </span><span class="py">partial</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">active</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">true</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">email</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nv">$email</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="w"> </span></span></span></code></pre></div> <h4 id="covering-indexes" class="position-relative d-flex align-items-center group"> <span>Covering Indexes</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="covering-indexes" aria-haspopup="dialog" aria-label="Share link: Covering Indexes"> <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> </h4><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="py">that</span><span class="w"> </span><span class="py">includes</span><span class="w"> </span><span class="py">returned</span><span class="w"> </span><span class="py">columns</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_profile</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">email</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">city</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="err">--</span><span class="w"> </span><span class="py">Query</span><span class="w"> </span><span class="py">is</span><span class="w"> </span><span class="py">answered</span><span class="w"> </span><span class="py">entirely</span><span class="w"> </span><span class="py">from</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">email</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nv">$email</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">city</span><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">No</span><span class="w"> </span><span class="py">need</span><span class="w"> </span><span class="py">to</span><span class="w"> </span><span class="py">access</span><span class="w"> </span><span class="py">node</span><span class="w"> </span><span class="py">storage</span><span class="w"> </span></span></span></code></pre></div> <h3 id="advanced-security-features" class="position-relative d-flex align-items-center group"> <span>Advanced Security Features</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="advanced-security-features" aria-haspopup="dialog" aria-label="Share link: Advanced Security Features"> <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> <h4 id="multi-factor-authentication-integration" class="position-relative d-flex align-items-center group"> <span>Multi-Factor Authentication Integration</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="multi-factor-authentication-integration" aria-haspopup="dialog" aria-label="Share link: Multi-Factor Authentication Integration"> <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> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">geode_client</span> <span class="kn">import</span> <span class="n">Client</span> </span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">pyotp</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">authenticate_with_mfa</span><span class="p">(</span><span class="n">username</span><span class="p">,</span> <span class="n">password</span><span class="p">,</span> <span class="n">totp_code</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&#34;&#34;Authenticate with username, password, and TOTP.&#34;&#34;&#34;</span> </span></span><span class="line"><span class="cl"> <span class="c1"># First verify password</span> </span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">Client</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="s2">&#34;localhost&#34;</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">3141</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="n">user</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (u:User {username: $username}) </span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE crypto.verify_password($password, u.password_hash) </span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN u.totp_secret AS secret, u.id AS id </span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&#34;username&#34;</span><span class="p">:</span> <span class="n">username</span><span class="p">,</span> <span class="s2">&#34;password&#34;</span><span class="p">:</span> <span class="n">password</span><span class="p">})</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="n">user_data</span> <span class="o">=</span> <span class="n">user</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="k">if</span> <span class="n">user</span><span class="o">.</span><span class="n">rows</span> <span class="k">else</span> <span class="kc">None</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="ow">not</span> <span class="n">user_data</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">raise</span> <span class="n">AuthenticationError</span><span class="p">(</span><span class="s2">&#34;Invalid credentials&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1"># Verify TOTP</span> </span></span><span class="line"><span class="cl"> <span class="n">totp</span> <span class="o">=</span> <span class="n">pyotp</span><span class="o">.</span><span class="n">TOTP</span><span class="p">(</span><span class="n">user_data</span><span class="p">[</span><span class="s1">&#39;secret&#39;</span><span class="p">])</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="ow">not</span> <span class="n">totp</span><span class="o">.</span><span class="n">verify</span><span class="p">(</span><span class="n">totp_code</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="k">raise</span> <span class="n">AuthenticationError</span><span class="p">(</span><span class="s2">&#34;Invalid TOTP code&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1"># Create session</span> </span></span><span class="line"><span class="cl"> <span class="n">session_token</span> <span class="o">=</span> <span class="n">generate_secure_token</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (u:User {id: $user_id}) </span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE (s:Session { </span></span></span><span class="line"><span class="cl"><span class="s2"> token: $token, </span></span></span><span class="line"><span class="cl"><span class="s2"> created: current_timestamp(), </span></span></span><span class="line"><span class="cl"><span class="s2"> expires: current_timestamp() + INTERVAL &#39;24&#39; HOUR </span></span></span><span class="line"><span class="cl"><span class="s2"> }) </span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE (u)-[:HAS_SESSION]-&gt;(s) </span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&#34;user_id&#34;</span><span class="p">:</span> <span class="n">user_data</span><span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">],</span> <span class="s2">&#34;token&#34;</span><span class="p">:</span> <span class="n">session_token</span><span class="p">})</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">session_token</span> </span></span></code></pre></div> <h4 id="attribute-based-access-control-abac" class="position-relative d-flex align-items-center group"> <span>Attribute-Based Access Control (ABAC)</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="attribute-based-access-control-abac" aria-haspopup="dialog" aria-label="Share link: Attribute-Based Access Control (ABAC)"> <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> </h4><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="py">ABAC</span><span class="w"> </span><span class="py">policy</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">POLICY</span><span class="w"> </span><span class="py">document_access</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="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">USING</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="err">//</span><span class="w"> </span><span class="py">Allow</span><span class="w"> </span><span class="py">access</span><span class="w"> </span><span class="py">if</span><span class="w"> </span><span class="py">user</span><span class="w"> </span><span class="py">has</span><span class="w"> </span><span class="py">clearance</span><span class="w"> </span><span class="py">level</span><span class="w"> </span><span class="err">&gt;</span><span class="p">=</span><span class="w"> </span><span class="py">document</span><span class="w"> </span><span class="py">classification</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">EXISTS</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">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">current_user</span><span class="p">:</span><span class="nc">User</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">current_user_id</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">current_user</span><span class="err">.</span><span class="py">clearance_level</span><span class="w"> </span><span class="err">&gt;</span><span class="p">=</span><span class="w"> </span><span class="py">node</span><span class="err">.</span><span class="py">classification_level</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">OR</span><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">Or</span><span class="w"> </span><span class="py">if</span><span class="w"> </span><span class="py">user</span><span class="w"> </span><span class="py">is</span><span class="w"> </span><span class="py">document</span><span class="w"> </span><span class="py">owner</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">EXISTS</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">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">current_user</span><span class="p">:</span><span class="nc">User</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">current_user_id</span><span class="p">()})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">-</span><span class="p">[:</span><span class="nc">OWNS</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">node</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">OR</span><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">Or</span><span class="w"> </span><span class="py">if</span><span class="w"> </span><span class="py">user</span><span class="w"> </span><span class="py">is</span><span class="w"> </span><span class="py">in</span><span class="w"> </span><span class="py">authorized</span><span class="w"> </span><span class="py">group</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">EXISTS</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">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">current_user</span><span class="p">:</span><span class="nc">User</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">current_user_id</span><span class="p">()})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">-</span><span class="p">[:</span><span class="nc">MEMBER_OF</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(:</span><span class="nc">Group</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">&lt;-</span><span class="p">[:</span><span class="nc">AUTHORIZED</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">node</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="w"> </span></span></span></code></pre></div> <h4 id="audit-trail-implementation" class="position-relative d-flex align-items-center group"> <span>Audit Trail Implementation</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="audit-trail-implementation" aria-haspopup="dialog" aria-label="Share link: Audit Trail Implementation"> <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> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">create_audit_log</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">user_id</span><span class="p">,</span> <span class="n">action</span><span class="p">,</span> <span class="n">entity_type</span><span class="p">,</span> <span class="n">entity_id</span><span class="p">,</span> <span class="n">details</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&#34;&#34;Create comprehensive audit log entry.&#34;&#34;&#34;</span> </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 class="s2">&#34;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE (log:AuditLog { </span></span></span><span class="line"><span class="cl"><span class="s2"> timestamp: current_timestamp(), </span></span></span><span class="line"><span class="cl"><span class="s2"> user_id: $user_id, </span></span></span><span class="line"><span class="cl"><span class="s2"> action: $action, </span></span></span><span class="line"><span class="cl"><span class="s2"> entity_type: $entity_type, </span></span></span><span class="line"><span class="cl"><span class="s2"> entity_id: $entity_id, </span></span></span><span class="line"><span class="cl"><span class="s2"> details: $details, </span></span></span><span class="line"><span class="cl"><span class="s2"> ip_address: $ip, </span></span></span><span class="line"><span class="cl"><span class="s2"> user_agent: $user_agent </span></span></span><span class="line"><span class="cl"><span class="s2"> }) </span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span><span class="p">,</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;user_id&#34;</span><span class="p">:</span> <span class="n">user_id</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;action&#34;</span><span class="p">:</span> <span class="n">action</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;entity_type&#34;</span><span class="p">:</span> <span class="n">entity_type</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;entity_id&#34;</span><span class="p">:</span> <span class="n">entity_id</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;details&#34;</span><span class="p">:</span> <span class="n">details</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;ip&#34;</span><span class="p">:</span> <span class="n">request</span><span class="o">.</span><span class="n">remote_addr</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;user_agent&#34;</span><span class="p">:</span> <span class="n">request</span><span class="o">.</span><span class="n">headers</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;User-Agent&#39;</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="c1"># Query audit logs</span> </span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">get_audit_trail</span><span class="p">(</span><span class="n">entity_id</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&#34;&#34;Retrieve complete audit trail for entity.&#34;&#34;&#34;</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;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (log:AuditLog {entity_id: $entity_id}) </span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN log.timestamp AS when, </span></span></span><span class="line"><span class="cl"><span class="s2"> log.user_id AS who, </span></span></span><span class="line"><span class="cl"><span class="s2"> log.action AS what, </span></span></span><span class="line"><span class="cl"><span class="s2"> log.details AS details </span></span></span><span class="line"><span class="cl"><span class="s2"> ORDER BY log.timestamp DESC </span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&#34;entity_id&#34;</span><span class="p">:</span> <span class="n">entity_id</span><span class="p">})</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="p">[</span><span class="n">row</span> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span><span class="p">]</span> </span></span></code></pre></div> <h3 id="stream-processing-integration" class="position-relative d-flex align-items-center group"> <span>Stream Processing Integration</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="stream-processing-integration" aria-haspopup="dialog" aria-label="Share link: Stream Processing Integration"> <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> <h4 id="apache-kafka-integration" class="position-relative d-flex align-items-center group"> <span>Apache Kafka Integration</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="apache-kafka-integration" aria-haspopup="dialog" aria-label="Share link: Apache Kafka Integration"> <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> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">kafka</span> <span class="kn">import</span> <span class="n">KafkaProducer</span><span class="p">,</span> <span class="n">KafkaConsumer</span> </span></span><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="k">async</span> <span class="k">def</span> <span class="nf">stream_changes_to_kafka</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">topic</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&#34;&#34;Stream Geode CDC events to Kafka.&#34;&#34;&#34;</span> </span></span><span class="line"><span class="cl"> <span class="n">producer</span> <span class="o">=</span> <span class="n">KafkaProducer</span><span class="p">(</span> </span></span><span class="line"><span class="cl"> <span class="n">bootstrap_servers</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;localhost:9092&#39;</span><span class="p">],</span> </span></span><span class="line"><span class="cl"> <span class="n">value_serializer</span><span class="o">=</span><span class="k">lambda</span> <span class="n">v</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">v</span><span class="p">)</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</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="n">last_seen</span> <span class="o">=</span> <span class="s2">&#34;1970-01-01T00:00:00Z&#34;</span> </span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">while</span> <span class="kc">True</span><span class="p">:</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">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (e:ChangeLog) </span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE e.emitted_at &gt; $since </span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN e.operation AS operation, </span></span></span><span class="line"><span class="cl"><span class="s2"> e.entity_type AS entity_type, </span></span></span><span class="line"><span class="cl"><span class="s2"> e.entity_id AS entity_id, </span></span></span><span class="line"><span class="cl"><span class="s2"> e.emitted_at AS emitted_at, </span></span></span><span class="line"><span class="cl"><span class="s2"> e.after AS after </span></span></span><span class="line"><span class="cl"><span class="s2"> ORDER BY emitted_at </span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="p">{</span><span class="s2">&#34;since&#34;</span><span class="p">:</span> <span class="n">last_seen</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="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="n">kafka_message</span> <span class="o">=</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="s1">&#39;operation&#39;</span><span class="p">:</span> <span class="n">row</span><span class="p">[</span><span class="s2">&#34;operation&#34;</span><span class="p">]</span><span class="o">.</span><span class="n">raw_value</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s1">&#39;entity_type&#39;</span><span class="p">:</span> <span class="n">row</span><span class="p">[</span><span class="s2">&#34;entity_type&#34;</span><span class="p">]</span><span class="o">.</span><span class="n">raw_value</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s1">&#39;entity_id&#39;</span><span class="p">:</span> <span class="n">row</span><span class="p">[</span><span class="s2">&#34;entity_id&#34;</span><span class="p">]</span><span class="o">.</span><span class="n">raw_value</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s1">&#39;timestamp&#39;</span><span class="p">:</span> <span class="n">row</span><span class="p">[</span><span class="s2">&#34;emitted_at&#34;</span><span class="p">]</span><span class="o">.</span><span class="n">raw_value</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s1">&#39;data&#39;</span><span class="p">:</span> <span class="n">row</span><span class="p">[</span><span class="s2">&#34;after&#34;</span><span class="p">]</span><span class="o">.</span><span class="n">raw_value</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="n">producer</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">topic</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="n">kafka_message</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">last_seen</span> <span class="o">=</span> <span class="n">row</span><span class="p">[</span><span class="s2">&#34;emitted_at&#34;</span><span class="p">]</span><span class="o">.</span><span class="n">raw_value</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">consume_from_kafka_to_geode</span><span class="p">(</span><span class="n">topic</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&#34;&#34;Consume Kafka messages and write to Geode.&#34;&#34;&#34;</span> </span></span><span class="line"><span class="cl"> <span class="n">consumer</span> <span class="o">=</span> <span class="n">KafkaConsumer</span><span class="p">(</span> </span></span><span class="line"><span class="cl"> <span class="n">topic</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">bootstrap_servers</span><span class="o">=</span><span class="p">[</span><span class="s1">&#39;localhost:9092&#39;</span><span class="p">],</span> </span></span><span class="line"><span class="cl"> <span class="n">value_deserializer</span><span class="o">=</span><span class="k">lambda</span> <span class="n">m</span><span class="p">:</span> <span class="n">json</span><span class="o">.</span><span class="n">loads</span><span class="p">(</span><span class="n">m</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s1">&#39;utf-8&#39;</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="n">client</span> <span class="o">=</span> <span class="n">Client</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="s2">&#34;localhost&#34;</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">3141</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">message</span> <span class="ow">in</span> <span class="n">consumer</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="n">event</span> <span class="o">=</span> <span class="n">message</span><span class="o">.</span><span class="n">value</span> </span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE (n:Event { </span></span></span><span class="line"><span class="cl"><span class="s2"> type: $type, </span></span></span><span class="line"><span class="cl"><span class="s2"> timestamp: $timestamp, </span></span></span><span class="line"><span class="cl"><span class="s2"> data: $data </span></span></span><span class="line"><span class="cl"><span class="s2"> }) </span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span><span class="p">,</span> <span class="n">event</span><span class="p">)</span> </span></span></code></pre></div> <h3 id="advanced-query-optimization" class="position-relative d-flex align-items-center group"> <span>Advanced Query 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="advanced-query-optimization" aria-haspopup="dialog" aria-label="Share link: Advanced Query 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> <h4 id="query-hints-and-directives" class="position-relative d-flex align-items-center group"> <span>Query Hints and Directives</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="query-hints-and-directives" aria-haspopup="dialog" aria-label="Share link: Query Hints and Directives"> <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> </h4><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">Force</span><span class="w"> </span><span class="py">specific</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="py">usage</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">USING</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">email</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">email</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nv">$email</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="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">Disable</span><span class="w"> </span><span class="py">certain</span><span class="w"> </span><span class="py">optimizations</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">a</span><span class="p">:</span><span class="nc">Node</span><span class="p">)</span><span class="err">-</span><span class="p">[</span><span class="py">r</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">b</span><span class="p">:</span><span class="nc">Node</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">OPTION</span><span class="w"> </span><span class="p">(</span><span class="py">hash_join</span><span class="p">=</span><span class="py">off</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">a</span><span class="p">,</span><span class="w"> </span><span class="py">b</span><span class="w"> </span></span></span></code></pre></div> <h4 id="materialized-path-patterns" class="position-relative d-flex align-items-center group"> <span>Materialized Path Patterns</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="materialized-path-patterns" aria-haspopup="dialog" aria-label="Share link: Materialized Path Patterns"> <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> </h4><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">pre</span><span class="err">-</span><span class="py">computed</span><span class="w"> </span><span class="py">paths</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">fast</span><span class="w"> </span><span class="py">traversal</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">root</span><span class="p">:</span><span class="nc">Category</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">Electronics</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">path</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;/</span><span class="nc">Electronics</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">level</span><span class="p">:</span><span class="w"> </span><span class="nc">0</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="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">laptop</span><span class="p">:</span><span class="nc">Category</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">Laptops</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">path</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;/</span><span class="nc">Electronics</span><span class="err">/</span><span class="py">Laptops</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">level</span><span class="p">:</span><span class="w"> </span><span class="nc">1</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="err">--</span><span class="w"> </span><span class="py">Query</span><span class="w"> </span><span class="py">entire</span><span class="w"> </span><span class="py">subtree</span><span class="w"> </span><span class="py">efficiently</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">cat</span><span class="p">:</span><span class="nc">Category</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">cat</span><span class="err">.</span><span class="py">path</span><span class="w"> </span><span class="py">STARTS</span><span class="w"> </span><span class="py">WITH</span><span class="w"> </span><span class="err">&#39;/</span><span class="py">Electronics</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">cat</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">cat</span><span class="err">.</span><span class="py">level</span><span class="p">,</span><span class="w"> </span><span class="py">cat</span><span class="err">.</span><span class="py">name</span><span class="w"> </span></span></span></code></pre></div> <h4 id="denormalization-for-read-performance" class="position-relative d-flex align-items-center group"> <span>Denormalization for Read Performance</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="denormalization-for-read-performance" aria-haspopup="dialog" aria-label="Share link: Denormalization for Read Performance"> <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> </h4><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">Denormalize</span><span class="w"> </span><span class="py">frequently</span><span class="w"> </span><span class="py">accessed</span><span class="w"> </span><span class="py">aggregates</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">product</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="err">&lt;-</span><span class="p">[:</span><span class="nc">PURCHASED</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">order</span><span class="p">:</span><span class="nc">Order</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WITH</span><span class="w"> </span><span class="py">product</span><span class="p">,</span><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="py">order</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">purchase_count</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">product</span><span class="err">.</span><span class="py">cached_purchase_count</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">purchase_count</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">product</span><span class="err">.</span><span class="py">cache_updated</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">current_timestamp</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="err">--</span><span class="w"> </span><span class="py">Fast</span><span class="w"> </span><span class="py">reads</span><span class="w"> </span><span class="py">from</span><span class="w"> </span><span class="py">denormalized</span><span class="w"> </span><span class="py">data</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">cached_purchase_count</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">100</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">cached_purchase_count</span><span class="w"> </span></span></span></code></pre></div> <h3 id="graph-machine-learning-workflows" class="position-relative d-flex align-items-center group"> <span>Graph Machine Learning Workflows</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="graph-machine-learning-workflows" aria-haspopup="dialog" aria-label="Share link: Graph Machine Learning Workflows"> <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> <h4 id="link-prediction" class="position-relative d-flex align-items-center group"> <span>Link Prediction</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="link-prediction" aria-haspopup="dialog" aria-label="Share link: Link Prediction"> <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> </h4><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">numpy</span> <span class="k">as</span> <span class="nn">np</span> </span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">sklearn.ensemble</span> <span class="kn">import</span> <span class="n">RandomForestClassifier</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">train_link_predictor</span><span class="p">(</span><span class="n">client</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&#34;&#34;Train ML model to predict future links.&#34;&#34;&#34;</span> </span></span><span class="line"><span class="cl"> <span class="c1"># Extract features for existing links</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;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (u1:User)-[r:KNOWS]-&gt;(u2:User) </span></span></span><span class="line"><span class="cl"><span class="s2"> WITH u1, u2, </span></span></span><span class="line"><span class="cl"><span class="s2"> COUNT{(u1)-[:KNOWS]-&gt;()&lt;-[:KNOWS]-(u2)} AS common_friends, </span></span></span><span class="line"><span class="cl"><span class="s2"> u1.join_date AS u1_join, </span></span></span><span class="line"><span class="cl"><span class="s2"> u2.join_date AS u2_join </span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN common_friends, </span></span></span><span class="line"><span class="cl"><span class="s2"> duration_between(u1_join, u2_join) AS join_diff, </span></span></span><span class="line"><span class="cl"><span class="s2"> 1 AS label </span></span></span><span class="line"><span class="cl"><span class="s2"> LIMIT 10000 </span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="n">features</span> <span class="o">=</span> <span class="p">[]</span> </span></span><span class="line"><span class="cl"> <span class="n">labels</span> <span class="o">=</span> <span class="p">[]</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="n">features</span><span class="o">.</span><span class="n">append</span><span class="p">([</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;common_friends&#39;</span><span class="p">],</span> <span class="n">row</span><span class="p">[</span><span class="s1">&#39;join_diff&#39;</span><span class="p">]])</span> </span></span><span class="line"><span class="cl"> <span class="n">labels</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;label&#39;</span><span class="p">])</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1"># Train model</span> </span></span><span class="line"><span class="cl"> <span class="n">model</span> <span class="o">=</span> <span class="n">RandomForestClassifier</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> <span class="n">model</span><span class="o">.</span><span class="n">fit</span><span class="p">(</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">features</span><span class="p">),</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">labels</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">model</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">predict_new_links</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">model</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&#34;&#34;Predict which user pairs will connect.&#34;&#34;&#34;</span> </span></span><span class="line"><span class="cl"> <span class="c1"># Get candidate pairs (users who aren&#39;t connected)</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;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (u1:User), (u2:User) </span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE u1.id &lt; u2.id </span></span></span><span class="line"><span class="cl"><span class="s2"> AND NOT EXISTS {MATCH (u1)-[:KNOWS]-(u2)} </span></span></span><span class="line"><span class="cl"><span class="s2"> WITH u1, u2, </span></span></span><span class="line"><span class="cl"><span class="s2"> COUNT{(u1)-[:KNOWS]-&gt;()&lt;-[:KNOWS]-(u2)} AS common_friends </span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE common_friends &gt; 0 </span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN u1.id AS user1, </span></span></span><span class="line"><span class="cl"><span class="s2"> u2.id AS user2, </span></span></span><span class="line"><span class="cl"><span class="s2"> common_friends, </span></span></span><span class="line"><span class="cl"><span class="s2"> duration_between(u1.join_date, u2.join_date) AS join_diff </span></span></span><span class="line"><span class="cl"><span class="s2"> LIMIT 1000 </span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="n">predictions</span> <span class="o">=</span> <span class="p">[]</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="n">features</span> <span class="o">=</span> <span class="p">[[</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;common_friends&#39;</span><span class="p">],</span> <span class="n">row</span><span class="p">[</span><span class="s1">&#39;join_diff&#39;</span><span class="p">]]]</span> </span></span><span class="line"><span class="cl"> <span class="n">probability</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">predict_proba</span><span class="p">(</span><span class="n">features</span><span class="p">)[</span><span class="mi">0</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> <span class="n">predictions</span><span class="o">.</span><span class="n">append</span><span class="p">({</span> </span></span><span class="line"><span class="cl"> <span class="s1">&#39;user1&#39;</span><span class="p">:</span> <span class="n">row</span><span class="p">[</span><span class="s1">&#39;user1&#39;</span><span class="p">],</span> </span></span><span class="line"><span class="cl"> <span class="s1">&#39;user2&#39;</span><span class="p">:</span> <span class="n">row</span><span class="p">[</span><span class="s1">&#39;user2&#39;</span><span class="p">],</span> </span></span><span class="line"><span class="cl"> <span class="s1">&#39;probability&#39;</span><span class="p">:</span> <span class="n">probability</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">return</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">predictions</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="s1">&#39;probability&#39;</span><span class="p">],</span> <span class="n">reverse</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> </span></span></code></pre></div> <h4 id="graph-classification" class="position-relative d-flex align-items-center group"> <span>Graph Classification</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="graph-classification" aria-haspopup="dialog" aria-label="Share link: Graph Classification"> <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> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">classify_graph_nodes</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">trained_gnn_model</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&#34;&#34;Classify nodes using Graph Neural Network.&#34;&#34;&#34;</span> </span></span><span class="line"><span class="cl"> <span class="c1"># Extract node embeddings</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;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (n:Node) </span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN n.id AS id, </span></span></span><span class="line"><span class="cl"><span class="s2"> n.embedding AS embedding, </span></span></span><span class="line"><span class="cl"><span class="s2"> [(n)-[:CONNECTED]-(neighbor) | neighbor.id] AS neighbor_ids </span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="n">node_features</span> <span class="o">=</span> <span class="p">{}</span> </span></span><span class="line"><span class="cl"> <span class="n">edges</span> <span class="o">=</span> <span class="p">[]</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="n">node_features</span><span class="p">[</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">]]</span> <span class="o">=</span> <span class="n">row</span><span class="p">[</span><span class="s1">&#39;embedding&#39;</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">neighbor</span> <span class="ow">in</span> <span class="n">row</span><span class="p">[</span><span class="s1">&#39;neighbor_ids&#39;</span><span class="p">]:</span> </span></span><span class="line"><span class="cl"> <span class="n">edges</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">row</span><span class="p">[</span><span class="s1">&#39;id&#39;</span><span class="p">],</span> <span class="n">neighbor</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1"># Run GNN inference</span> </span></span><span class="line"><span class="cl"> <span class="n">predictions</span> <span class="o">=</span> <span class="n">trained_gnn_model</span><span class="o">.</span><span class="n">predict</span><span class="p">(</span><span class="n">node_features</span><span class="p">,</span> <span class="n">edges</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1"># Update graph with classifications</span> </span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">node_id</span><span class="p">,</span> <span class="n">predicted_class</span> <span class="ow">in</span> <span class="n">predictions</span><span class="o">.</span><span class="n">items</span><span class="p">():</span> </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 class="s2">&#34;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (n:Node {id: $id}) </span></span></span><span class="line"><span class="cl"><span class="s2"> SET n.predicted_class = $class, </span></span></span><span class="line"><span class="cl"><span class="s2"> n.classification_timestamp = current_timestamp() </span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&#34;id&#34;</span><span class="p">:</span> <span class="n">node_id</span><span class="p">,</span> <span class="s2">&#34;class&#34;</span><span class="p">:</span> <span class="n">predicted_class</span><span class="p">})</span> </span></span></code></pre></div> <h3 id="multi-tenancy-patterns" class="position-relative d-flex align-items-center group"> <span>Multi-Tenancy Patterns</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="multi-tenancy-patterns" aria-haspopup="dialog" aria-label="Share link: Multi-Tenancy Patterns"> <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> <h4 id="schema-based-isolation" class="position-relative d-flex align-items-center group"> <span>Schema-Based Isolation</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="schema-based-isolation" aria-haspopup="dialog" aria-label="Share link: Schema-Based Isolation"> <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> </h4><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">Each</span><span class="w"> </span><span class="py">tenant</span><span class="w"> </span><span class="py">has</span><span class="w"> </span><span class="py">labeled</span><span class="w"> </span><span class="py">nodes</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">d</span><span class="p">:</span><span class="nc">Document</span><span class="p">:</span><span class="nc">Tenant1</span><span class="w"> </span><span class="p">{</span><span class="py">content</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">data</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">d</span><span class="p">:</span><span class="nc">Document</span><span class="p">:</span><span class="nc">Tenant2</span><span class="w"> </span><span class="p">{</span><span class="py">content</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">data</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></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">RLS</span><span class="w"> </span><span class="py">policy</span><span class="w"> </span><span class="py">enforces</span><span class="w"> </span><span class="py">isolation</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">POLICY</span><span class="w"> </span><span class="py">tenant_isolation</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="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">USING</span><span class="w"> </span><span class="p">(</span><span class="py">current_tenant</span><span class="p">()</span><span class="w"> </span><span class="py">IN</span><span class="w"> </span><span class="py">labels</span><span class="p">(</span><span class="py">node</span><span class="p">))</span><span class="w"> </span></span></span></code></pre></div> <h4 id="connection-pooling-per-tenant" class="position-relative d-flex align-items-center group"> <span>Connection Pooling Per Tenant</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="connection-pooling-per-tenant" aria-haspopup="dialog" aria-label="Share link: Connection Pooling Per Tenant"> <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> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">MultiTenantConnectionManager</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="bp">self</span><span class="o">.</span><span class="n">pools</span> <span class="o">=</span> <span class="p">{}</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">def</span> <span class="nf">get_connection</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">tenant_id</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&#34;&#34;Get tenant-specific connection with RLS context.&#34;&#34;&#34;</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">tenant_id</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">pools</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="bp">self</span><span class="o">.</span><span class="n">pools</span><span class="p">[</span><span class="n">tenant_id</span><span class="p">]</span> <span class="o">=</span> <span class="k">await</span> <span class="n">Client</span><span class="o">.</span><span class="n">create_pool</span><span class="p">(</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;localhost:3141&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">context</span><span class="o">=</span><span class="p">{</span><span class="s2">&#34;tenant_id&#34;</span><span class="p">:</span> <span class="n">tenant_id</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="k">return</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">pools</span><span class="p">[</span><span class="n">tenant_id</span><span class="p">]</span><span class="o">.</span><span class="n">acquire</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Usage</span> </span></span><span class="line"><span class="cl"><span class="n">manager</span> <span class="o">=</span> <span class="n">MultiTenantConnectionManager</span><span class="p">()</span> </span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">with</span> <span class="n">manager</span><span class="o">.</span><span class="n">get_connection</span><span class="p">(</span><span class="s2">&#34;tenant1&#34;</span><span class="p">)</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="c1"># Queries automatically filtered to tenant1</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">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">&#34;MATCH (d:Document) RETURN d&#34;</span><span class="p">)</span> </span></span></code></pre></div> <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><a href="/docs/tutorials/vector-search-tutorial/" >Vector Search Tutorial</a> - HNSW implementation details</li> <li><a href="/docs/query/full-text-search/" >Full-Text Search</a> - BM25 text search and ranking</li> <li><a href="/tags/row-level-security/" >Row-Level Security</a> - RLS policies and implementation</li> <li><a href="/tags/cdc/" >Change Data Capture</a> - CDC streams and patterns</li> <li><a href="/docs/architecture/distributed-architecture/" >Distributed Architecture</a> - Scaling and deployment</li> <li><a href="/docs/transactions/" >Transactions</a> - MVCC and time-travel queries</li> <li><a href="/categories/performance/" >Performance Optimization</a> - Tuning advanced features</li> <li><a href="/categories/security/" >Security and Compliance</a> - TDE, FLE, and encryption</li> <li><a href="/docs/analytics/graph-algorithms/" >Graph Algorithms</a> - Graph algorithm patterns</li> <li><a href="/docs/analytics/real-time-analytics/" >Real-Time Analytics</a> - Real-time data pipelines</li> <li><a href="/docs/query/indexing-and-optimization/" >Indexing and Optimization</a> - Index optimization</li> </ul>

Related Articles