<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-15 --> <p>Geode documentation tagged with <strong>Read-Eval-Print Loop (REPL)</strong>. The REPL is an interactive shell that reads GQL commands, evaluates them against your database, and prints results immediately—the primary tool for exploratory analysis, query development, and learning GQL.</p> <h3 id="introduction-to-the-repl" class="position-relative d-flex align-items-center group"> <span>Introduction to the REPL</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="introduction-to-the-repl" aria-haspopup="dialog" aria-label="Share link: Introduction to the REPL"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><div id="headingShareModal" class="heading-share-modal" role="dialog" aria-modal="true" aria-labelledby="headingShareTitle" hidden> <div class="hsm-dialog" role="document"> <div class="hsm-header"> <h2 id="headingShareTitle" class="h6 mb-0 fw-bold">Share this section</h2> <button type="button" class="hsm-close" aria-label="Close"> <i class="fa-solid fa-xmark"></i> </button> </div> <div class="hsm-body"> <label for="headingShareInput" class="form-label small text-muted mb-1 text-uppercase fw-bold" style="font-size: 0.7rem; letter-spacing: 0.5px;">Permalink</label> <div class="input-group mb-4 hsm-url-group"> <input id="headingShareInput" type="text" class="form-control font-monospace" readonly aria-readonly="true" style="font-size: 0.85rem;" /> <button class="btn btn-primary hsm-copy" type="button" aria-label="Copy" title="Copy"> <i class="fa-duotone fa-clipboard" aria-hidden="true"></i> </button> </div> <div class="small fw-bold mb-2 text-muted text-uppercase" style="font-size: 0.7rem; letter-spacing: 0.5px;">Share via</div> <div class="hsm-share-grid"> <a id="share-twitter" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer"> <i class="fa-brands fa-twitter me-2"></i>Twitter </a> <a id="share-linkedin" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer"> <i class="fa-brands fa-linkedin me-2"></i>LinkedIn </a> <a id="share-facebook" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer"> <i class="fa-brands fa-facebook me-2"></i>Facebook </a> </div> </div> </div> </div> <style> .heading-share-modal { position: fixed; inset: 0; display: flex; justify-content: center; align-items: center; background: rgba(0, 0, 0, 0.6); z-index: 1050; padding: 1rem; backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); } .heading-share-modal[hidden] { display: none !important; } .hsm-dialog { max-width: 420px; width: 100%; background: var(--bs-body-bg, #fff); color: var(--bs-body-color, #212529); border: 1px solid var(--bs-border-color, rgba(0,0,0,0.1)); border-radius: 1rem; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); overflow: hidden; animation: hsm-fade-in 0.2s ease-out; } @keyframes hsm-fade-in { from { opacity: 0; transform: scale(0.95); } to { opacity: 1; transform: scale(1); } } [data-bs-theme="dark"] .hsm-dialog { background: #1e293b; border-color: rgba(255,255,255,0.1); color: #f8f9fa; } .hsm-header { display: flex; justify-content: space-between; align-items: center; padding: 1rem 1.5rem; border-bottom: 1px solid var(--bs-border-color, rgba(0,0,0,0.1)); background: rgba(0,0,0,0.02); } [data-bs-theme="dark"] .hsm-header { background: rgba(255,255,255,0.02); border-color: rgba(255,255,255,0.1); } .hsm-close { background: transparent; border: none; color: inherit; opacity: 0.5; padding: 0.25rem 0.5rem; border-radius: 0.25rem; font-size: 1.2rem; line-height: 1; transition: opacity 0.2s; } .hsm-close:hover { opacity: 1; } .hsm-body { padding: 1.5rem; } .hsm-url-group { display: flex !important; align-items: stretch; } .hsm-url-group .form-control { flex: 1; min-width: 0; margin: 0; background: var(--bs-secondary-bg, #f8f9fa); border-color: var(--bs-border-color, #dee2e6); border-top-right-radius: 0; border-bottom-right-radius: 0; height: 42px; } .hsm-url-group .btn { flex: 0 0 auto; margin: 0; margin-left: -1px; border-top-left-radius: 0; border-bottom-left-radius: 0; height: 42px; display: flex; align-items: center; justify-content: center; padding: 0 1.25rem; z-index: 2; } [data-bs-theme="dark"] .hsm-url-group .form-control { background: #0f172a; border-color: #334155; color: #e2e8f0; } .hsm-share-grid { display: flex; flex-direction: column; gap: 0.5rem; } .hsm-share-grid .btn { display: flex; align-items: center; justify-content: center; font-size: 0.9rem; padding: 0.6rem; border-color: var(--bs-border-color); width: 100%; } [data-bs-theme="dark"] .hsm-share-grid .btn { color: #e2e8f0; border-color: #475569; } [data-bs-theme="dark"] .hsm-share-grid .btn:hover { background: #334155; border-color: #cbd5e1; } </style> <script> (function(){ const modal = document.getElementById('headingShareModal'); if(!modal) return; const input = modal.querySelector('#headingShareInput'); const copyBtn = modal.querySelector('.hsm-copy'); const twitter = modal.querySelector('#share-twitter'); const linkedin = modal.querySelector('#share-linkedin'); const facebook = modal.querySelector('#share-facebook'); const closeBtn = modal.querySelector('.hsm-close'); let lastFocus=null; let trapBound=false; function buildUrl(id){ return window.location.origin + window.location.pathname + '#' + id; } function isOpen(){ return !modal.hasAttribute('hidden'); } function hydrate(id){ const url=buildUrl(id); input.value=url; const enc=encodeURIComponent(url); const text=encodeURIComponent(document.title); if(twitter) twitter.href=`https://twitter.com/intent/tweet?url=${enc}&text=${text}`; if(linkedin) linkedin.href=`https://www.linkedin.com/sharing/share-offsite/?url=${enc}`; if(facebook) facebook.href=`https://www.facebook.com/sharer/sharer.php?u=${enc}`; } function openModal(id){ lastFocus=document.activeElement; hydrate(id); if(!isOpen()){ modal.removeAttribute('hidden'); } requestAnimationFrame(()=>{ input.focus(); }); trapFocus(); } function closeModal(){ if(!isOpen()) return; modal.setAttribute('hidden',''); if(lastFocus && typeof lastFocus.focus==='function') lastFocus.focus(); } function copyCurrent(){ try{ navigator.clipboard.writeText(input.value).then(()=>feedback(true),()=>fallback()); } catch(e){ fallback(); } } function fallback(){ input.select(); try{ document.execCommand('copy'); feedback(true);}catch(e){ feedback(false);} } function feedback(ok){ if(!copyBtn) return; const icon=copyBtn.querySelector('i'); if(!icon) return; const prev=copyBtn.getAttribute('data-prev')||icon.className; if(!copyBtn.getAttribute('data-prev')) copyBtn.setAttribute('data-prev',prev); icon.className= ok ? 'fa-duotone fa-clipboard-check':'fa-duotone fa-circle-exclamation'; setTimeout(()=>{ icon.className=prev; },1800); } function handleShareClick(e){ e.preventDefault(); const btn=e.currentTarget; const id=btn.getAttribute('data-share-target'); if(id) openModal(id); } function bindShareButtons(){ document.querySelectorAll('.h-share').forEach(btn=>{ if(!btn.dataset.hShareBound){ btn.addEventListener('click', handleShareClick); btn.dataset.hShareBound='1'; } }); } bindShareButtons(); if(document.readyState==='loading'){ document.addEventListener('DOMContentLoaded', bindShareButtons); } else { requestAnimationFrame(bindShareButtons); } document.addEventListener('click', function(e){ const shareBtn=e.target.closest && e.target.closest('.h-share'); if(shareBtn && !shareBtn.dataset.hShareBound){ handleShareClick.call(shareBtn, e); } }, true); document.addEventListener('click', e=>{ if(e.target===modal) closeModal(); if(e.target.closest && e.target.closest('.hsm-close')){ e.preventDefault(); closeModal(); } if(copyBtn && (e.target===copyBtn || (e.target.closest && e.target.closest('.hsm-copy')))) { e.preventDefault(); copyCurrent(); } }); document.addEventListener('keydown', e=>{ if(e.key==='Escape' && isOpen()) closeModal(); }); function trapFocus(){ if(trapBound) return; trapBound=true; modal.addEventListener('keydown', f=>{ if(f.key==='Tab' && isOpen()){ const focusable=[...modal.querySelectorAll('a[href],button,input,textarea,select,[tabindex]:not([tabindex="-1"])')].filter(el=>!el.hasAttribute('disabled')); if(!focusable.length) return; const first=focusable[0]; const last=focusable[focusable.length-1]; if(f.shiftKey && document.activeElement===first){ f.preventDefault(); last.focus(); } else if(!f.shiftKey && document.activeElement===last){ f.preventDefault(); first.focus(); } } }); } if(closeBtn) closeBtn.addEventListener('click', e=>{ e.preventDefault(); closeModal(); }); })(); </script><p>A Read-Eval-Print Loop (REPL) is an interactive programming environment that accepts user input, executes it, and displays the result. REPLs have been fundamental to programming since the 1960s, popularized by Lisp and later adopted by languages like Python, Ruby, and JavaScript. For databases, REPLs provide immediate feedback for query development, making them essential tools for exploration and debugging.</p> <p>Geode&rsquo;s REPL, invoked with <code>geode shell</code>, provides a rich interactive environment for working with graph data. Unlike batch query execution or programmatic access through client libraries, the REPL emphasizes immediate feedback and iterative refinement. You type a GQL query, press Enter, and see results instantly. This tight feedback loop accelerates learning, enables rapid prototyping, and makes debugging far more efficient than edit-compile-run cycles.</p> <p>The Geode REPL goes beyond simple query execution to provide a comprehensive development environment. Features include syntax highlighting, auto-completion for keywords and labels, query history with search, multi-line editing for complex queries, and formatted result display with automatic table rendering. Transaction management, meta-commands for database introspection, and session persistence make the REPL suitable for both quick experiments and extended development sessions.</p> <h3 id="key-concepts" class="position-relative d-flex align-items-center group"> <span>Key Concepts</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-concepts" aria-haspopup="dialog" aria-label="Share link: Key Concepts"> <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="interactive-query-execution" class="position-relative d-flex align-items-center group"> <span>Interactive Query Execution</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="interactive-query-execution" aria-haspopup="dialog" aria-label="Share link: Interactive Query Execution"> <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>The core REPL workflow:</p> <ol> <li><strong>Prompt</strong>: Display <code>geode&gt;</code> prompt waiting for input</li> <li><strong>Read</strong>: Accept GQL query or meta-command from user</li> <li><strong>Evaluate</strong>: Execute query against database</li> <li><strong>Print</strong>: Display formatted results</li> <li><strong>Loop</strong>: Return to prompt for next command</li> </ol> <h4 id="multi-line-editing" class="position-relative d-flex align-items-center group"> <span>Multi-Line Editing</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-line-editing" aria-haspopup="dialog" aria-label="Share link: Multi-Line Editing"> <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>Complex queries span multiple lines:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">geode&gt; MATCH (p:Person)-[:WORKS_AT]-&gt;(c:Company) </span></span><span class="line"><span class="cl"> WHERE p.age &gt; 30 </span></span><span class="line"><span class="cl"> AND c.industry = &#39;Technology&#39; </span></span><span class="line"><span class="cl"> RETURN p.name, c.name, p.salary </span></span><span class="line"><span class="cl"> ORDER BY p.salary DESC </span></span><span class="line"><span class="cl"> LIMIT 10; </span></span></code></pre></div><p>The REPL detects incomplete statements and continues accepting input until a semicolon or empty line.</p> <h4 id="result-formatting" class="position-relative d-flex align-items-center group"> <span>Result Formatting</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="result-formatting" aria-haspopup="dialog" aria-label="Share link: Result Formatting"> <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>Results are displayed in readable tables:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">geode&gt; MATCH (p:Person) RETURN p.name, p.age LIMIT 3; </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">╭──────────────┬──────────╮ </span></span><span class="line"><span class="cl">│ p.name │ p.age │ </span></span><span class="line"><span class="cl">├──────────────┼──────────┤ </span></span><span class="line"><span class="cl">│ Alice Smith │ 32 │ </span></span><span class="line"><span class="cl">│ Bob Johnson │ 28 │ </span></span><span class="line"><span class="cl">│ Carol Davis │ 45 │ </span></span><span class="line"><span class="cl">╰──────────────┴──────────╯ </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">3 rows (15.2ms) </span></span></code></pre></div> <h4 id="meta-commands" class="position-relative d-flex align-items-center group"> <span>Meta-Commands</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="meta-commands" aria-haspopup="dialog" aria-label="Share link: Meta-Commands"> <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>Meta-commands provide database introspection:</p> <ul> <li><code>\l</code> - List available graphs</li> <li><code>\dt</code> - List node labels and relationship types</li> <li><code>\d &lt;label&gt;</code> - Describe label properties</li> <li><code>\timing on</code> - Enable query timing</li> <li><code>\explain &lt;query&gt;</code> - Show query execution plan</li> <li><code>\profile &lt;query&gt;</code> - Profile query execution</li> <li><code>\history</code> - Show command history</li> <li><code>\save &lt;file&gt;</code> - Save session to file</li> <li><code>\load &lt;file&gt;</code> - Load and execute file</li> </ul> <h4 id="session-management" class="position-relative d-flex align-items-center group"> <span>Session Management</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="session-management" aria-haspopup="dialog" aria-label="Share link: Session Management"> <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>REPL sessions maintain state:</p> <ul> <li><strong>Transaction Context</strong>: BEGIN/COMMIT/ROLLBACK manage transaction scope</li> <li><strong>Variable Binding</strong>: Store query results for later reference</li> <li><strong>History</strong>: Full command history with Up/Down arrow navigation</li> <li><strong>Settings</strong>: Persistent configuration (display format, timing, etc.)</li> </ul> <h3 id="how-the-repl-works-in-geode" class="position-relative d-flex align-items-center group"> <span>How the REPL Works in Geode</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="how-the-repl-works-in-geode" aria-haspopup="dialog" aria-label="Share link: How the REPL Works in Geode"> <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="starting-the-repl" class="position-relative d-flex align-items-center group"> <span>Starting the REPL</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="starting-the-repl" aria-haspopup="dialog" aria-label="Share link: Starting the REPL"> <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>Launch the interactive shell:</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"># Start REPL connected to local server</span> </span></span><span class="line"><span class="cl">geode shell </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Connect to remote server</span> </span></span><span class="line"><span class="cl">geode shell --host db.example.com --port <span class="m">3141</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Authenticate with username/password</span> </span></span><span class="line"><span class="cl">geode shell --user admin --password </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Connect with TLS certificate</span> </span></span><span class="line"><span class="cl">geode shell --cert client.crt --key client.key </span></span></code></pre></div> <h4 id="query-execution-flow" class="position-relative d-flex align-items-center group"> <span>Query Execution Flow</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-execution-flow" aria-haspopup="dialog" aria-label="Share link: Query Execution Flow"> <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 you execute a query in the REPL:</p> <ol> <li><strong>Input Collection</strong>: REPL accumulates input lines until complete statement</li> <li><strong>Syntax Highlighting</strong>: Keywords, strings, and operators highlighted in color</li> <li><strong>Client Transmission</strong>: Query sent to server via QUIC connection</li> <li><strong>Server Processing</strong>: Query parsed, optimized, and executed</li> <li><strong>Result Streaming</strong>: Results stream back to client</li> <li><strong>Rendering</strong>: REPL formats results as tables or JSON</li> <li><strong>Timing Display</strong>: Execution time displayed</li> </ol> <h4 id="interactive-features" class="position-relative d-flex align-items-center group"> <span>Interactive 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="interactive-features" aria-haspopup="dialog" aria-label="Share link: Interactive 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> </h4><p>The REPL provides rich editing capabilities:</p> <ul> <li><strong>Tab Completion</strong>: Complete keywords, labels, properties</li> <li><strong>History Search</strong>: Ctrl+R for reverse history search</li> <li><strong>Line Editing</strong>: Emacs or Vi key bindings</li> <li><strong>Syntax Validation</strong>: Real-time syntax checking</li> <li><strong>Error Display</strong>: Detailed error messages with line/column</li> </ul> <h4 id="transaction-management" class="position-relative d-flex align-items-center group"> <span>Transaction Management</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="transaction-management" aria-haspopup="dialog" aria-label="Share link: Transaction Management"> <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>Manage transactions interactively:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">geode&gt; BEGIN; </span></span><span class="line"><span class="cl">Transaction started (txn:550e8400) </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; INSERT (:Person {name: &#39;Eve&#39;, age: 29}); </span></span><span class="line"><span class="cl">1 row inserted (5.2ms) </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; MATCH (p:Person {name: &#39;Eve&#39;}) RETURN p.name; </span></span><span class="line"><span class="cl">╭────────╮ </span></span><span class="line"><span class="cl">│ p.name │ </span></span><span class="line"><span class="cl">├────────┤ </span></span><span class="line"><span class="cl">│ Eve │ </span></span><span class="line"><span class="cl">╰────────╯ </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; COMMIT; </span></span><span class="line"><span class="cl">Transaction committed (12.3ms) </span></span></code></pre></div> <h3 id="use-cases" class="position-relative d-flex align-items-center group"> <span>Use Cases</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="use-cases" aria-haspopup="dialog" aria-label="Share link: Use Cases"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3> <h4 id="exploratory-data-analysis" class="position-relative d-flex align-items-center group"> <span>Exploratory Data 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="exploratory-data-analysis" aria-haspopup="dialog" aria-label="Share link: Exploratory Data 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-fallback" data-lang="fallback"><span class="line"><span class="cl">geode&gt; -- Explore graph structure </span></span><span class="line"><span class="cl">geode&gt; MATCH (n) RETURN DISTINCT labels(n) AS label, count(*) AS count; </span></span><span class="line"><span class="cl">╭────────────┬───────╮ </span></span><span class="line"><span class="cl">│ label │ count │ </span></span><span class="line"><span class="cl">├────────────┼───────┤ </span></span><span class="line"><span class="cl">│ Person │ 1523 │ </span></span><span class="line"><span class="cl">│ Company │ 245 │ </span></span><span class="line"><span class="cl">│ Product │ 3421 │ </span></span><span class="line"><span class="cl">╰────────────┴───────╯ </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; -- Examine specific node </span></span><span class="line"><span class="cl">geode&gt; MATCH (p:Person {name: &#39;Alice&#39;}) RETURN p; </span></span><span class="line"><span class="cl">╭────────────────────────────────────────╮ </span></span><span class="line"><span class="cl">│ p │ </span></span><span class="line"><span class="cl">├────────────────────────────────────────┤ </span></span><span class="line"><span class="cl">│ { │ </span></span><span class="line"><span class="cl">│ &#34;id&#34;: &#34;node:12345&#34;, │ </span></span><span class="line"><span class="cl">│ &#34;labels&#34;: [&#34;Person&#34;], │ </span></span><span class="line"><span class="cl">│ &#34;properties&#34;: { │ </span></span><span class="line"><span class="cl">│ &#34;name&#34;: &#34;Alice&#34;, │ </span></span><span class="line"><span class="cl">│ &#34;age&#34;: 32, │ </span></span><span class="line"><span class="cl">│ &#34;email&#34;: &#34;[email protected]&#34; │ </span></span><span class="line"><span class="cl">│ } │ </span></span><span class="line"><span class="cl">│ } │ </span></span><span class="line"><span class="cl">╰────────────────────────────────────────╯ </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; -- Find relationship patterns </span></span><span class="line"><span class="cl">geode&gt; MATCH (p:Person)-[r]-&gt;(c:Company) </span></span><span class="line"><span class="cl"> RETURN type(r) AS rel_type, count(*) AS count </span></span><span class="line"><span class="cl"> ORDER BY count DESC; </span></span><span class="line"><span class="cl">╭──────────────┬───────╮ </span></span><span class="line"><span class="cl">│ rel_type │ count │ </span></span><span class="line"><span class="cl">├──────────────┼───────┤ </span></span><span class="line"><span class="cl">│ WORKS_AT │ 1205 │ </span></span><span class="line"><span class="cl">│ INVESTED_IN │ 142 │ </span></span><span class="line"><span class="cl">│ FOUNDED │ 38 │ </span></span><span class="line"><span class="cl">╰──────────────┴───────╯ </span></span></code></pre></div> <h4 id="query-development-and-testing" class="position-relative d-flex align-items-center group"> <span>Query Development and Testing</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-development-and-testing" aria-haspopup="dialog" aria-label="Share link: Query Development and Testing"> <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-fallback" data-lang="fallback"><span class="line"><span class="cl">geode&gt; -- Test query incrementally </span></span><span class="line"><span class="cl">geode&gt; MATCH (p:Person) </span></span><span class="line"><span class="cl"> WHERE p.age &gt; 30 </span></span><span class="line"><span class="cl"> RETURN count(*); </span></span><span class="line"><span class="cl">╭──────────╮ </span></span><span class="line"><span class="cl">│ count(*) │ </span></span><span class="line"><span class="cl">├──────────┤ </span></span><span class="line"><span class="cl">│ 823 │ </span></span><span class="line"><span class="cl">╰──────────╯ </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; -- Add more conditions </span></span><span class="line"><span class="cl">geode&gt; MATCH (p:Person) </span></span><span class="line"><span class="cl"> WHERE p.age &gt; 30 AND p.city = &#39;Seattle&#39; </span></span><span class="line"><span class="cl"> RETURN count(*); </span></span><span class="line"><span class="cl">╭──────────╮ </span></span><span class="line"><span class="cl">│ count(*) │ </span></span><span class="line"><span class="cl">├──────────┤ </span></span><span class="line"><span class="cl">│ 156 │ </span></span><span class="line"><span class="cl">╰──────────╯ </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; -- Profile for performance </span></span><span class="line"><span class="cl">geode&gt; \profile MATCH (p:Person) </span></span><span class="line"><span class="cl"> WHERE p.age &gt; 30 AND p.city = &#39;Seattle&#39; </span></span><span class="line"><span class="cl"> RETURN p.name, p.email; </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">Query Plan: </span></span><span class="line"><span class="cl">┌─ Filter (cost=0.1, rows=156) </span></span><span class="line"><span class="cl">│ └─ IndexScan (Person.city = &#39;Seattle&#39;) </span></span><span class="line"><span class="cl">│ └─ Filter (age &gt; 30) </span></span><span class="line"><span class="cl">│ └─ Return (p.name, p.email) </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">Execution: 2.3ms (156 rows) </span></span></code></pre></div> <h4 id="learning-gql" class="position-relative d-flex align-items-center group"> <span>Learning GQL</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="learning-gql" aria-haspopup="dialog" aria-label="Share link: Learning GQL"> <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-fallback" data-lang="fallback"><span class="line"><span class="cl">geode&gt; -- Try basic MATCH patterns </span></span><span class="line"><span class="cl">geode&gt; MATCH (n) RETURN n LIMIT 5; </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; -- Experiment with relationships </span></span><span class="line"><span class="cl">geode&gt; MATCH (a)-[r]-&gt;(b) RETURN a, type(r), b LIMIT 5; </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; -- Learn aggregation </span></span><span class="line"><span class="cl">geode&gt; MATCH (p:Person) </span></span><span class="line"><span class="cl"> RETURN p.city, count(*) AS population </span></span><span class="line"><span class="cl"> ORDER BY population DESC; </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; -- Practice pattern matching </span></span><span class="line"><span class="cl">geode&gt; MATCH (p:Person)-[:KNOWS]-&gt;()-[:KNOWS]-&gt;(friend) </span></span><span class="line"><span class="cl"> WHERE p.name = &#39;Alice&#39; </span></span><span class="line"><span class="cl"> RETURN DISTINCT friend.name; </span></span></code></pre></div> <h4 id="database-administration" class="position-relative d-flex align-items-center group"> <span>Database Administration</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="database-administration" aria-haspopup="dialog" aria-label="Share link: Database Administration"> <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-fallback" data-lang="fallback"><span class="line"><span class="cl">geode&gt; -- Check database size </span></span><span class="line"><span class="cl">geode&gt; \dt </span></span><span class="line"><span class="cl">Labels: </span></span><span class="line"><span class="cl"> Person (1523 nodes) </span></span><span class="line"><span class="cl"> Company (245 nodes) </span></span><span class="line"><span class="cl"> Product (3421 nodes) </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">Relationship Types: </span></span><span class="line"><span class="cl"> WORKS_AT (1205 relationships) </span></span><span class="line"><span class="cl"> KNOWS (3421 relationships) </span></span><span class="line"><span class="cl"> PURCHASED (12456 relationships) </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; -- View indexes </span></span><span class="line"><span class="cl">geode&gt; SHOW INDEXES; </span></span><span class="line"><span class="cl">╭────────────────┬──────────────────┬─────────╮ </span></span><span class="line"><span class="cl">│ label │ properties │ type │ </span></span><span class="line"><span class="cl">├────────────────┼──────────────────┼─────────┤ </span></span><span class="line"><span class="cl">│ Person │ [name] │ BTREE │ </span></span><span class="line"><span class="cl">│ Person │ [email] │ UNIQUE │ </span></span><span class="line"><span class="cl">│ Product │ [sku] │ UNIQUE │ </span></span><span class="line"><span class="cl">│ Person │ [embedding] │ HNSW │ </span></span><span class="line"><span class="cl">╰────────────────┴──────────────────┴─────────╯ </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; -- Create new index </span></span><span class="line"><span class="cl">geode&gt; CREATE INDEX person_age FOR (p:Person) ON (p.age); </span></span><span class="line"><span class="cl">Index created (234.5ms) </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="query-development-workflow" class="position-relative d-flex align-items-center group"> <span>Query Development Workflow</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-development-workflow" aria-haspopup="dialog" aria-label="Share link: Query Development Workflow"> <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><ol> <li><strong>Start Simple</strong>: Begin with basic MATCH patterns</li> <li><strong>Add Incrementally</strong>: Add WHERE clauses and filters one at a time</li> <li><strong>Profile Early</strong>: Use EXPLAIN/PROFILE to understand execution</li> <li><strong>Test with LIMIT</strong>: Use LIMIT during development to avoid large result sets</li> <li><strong>Refine Performance</strong>: Iterate based on profiling feedback</li> </ol> <h4 id="interactive-session-management" class="position-relative d-flex align-items-center group"> <span>Interactive Session Management</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="interactive-session-management" aria-haspopup="dialog" aria-label="Share link: Interactive Session Management"> <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><ol> <li><strong>Use Transactions</strong>: Wrap related operations in BEGIN/COMMIT</li> <li><strong>Save Work</strong>: Use <code>\save</code> to preserve successful queries</li> <li><strong>History Search</strong>: Use Ctrl+R to find previous commands</li> <li><strong>Clear Output</strong>: Use <code>\clear</code> for long sessions</li> <li><strong>Tab Completion</strong>: Leverage auto-completion for efficiency</li> </ol> <h4 id="result-display-optimization" class="position-relative d-flex align-items-center group"> <span>Result Display 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="result-display-optimization" aria-haspopup="dialog" aria-label="Share link: Result Display 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><ol> <li><strong>Limit Results</strong>: Always use LIMIT for unbounded queries</li> <li><strong>Format Selection</strong>: Choose JSON or table format based on data</li> <li><strong>Column Width</strong>: Adjust terminal width for readable tables</li> <li><strong>Vertical Display</strong>: Use <code>\x</code> for wide result sets</li> <li><strong>Paging</strong>: Use <code>\pset pager on</code> for long results</li> </ol> <h4 id="learning-and-exploration" class="position-relative d-flex align-items-center group"> <span>Learning and Exploration</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="learning-and-exploration" aria-haspopup="dialog" aria-label="Share link: Learning and Exploration"> <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><ol> <li><strong>Experiment Freely</strong>: REPL is perfect for trying new syntax</li> <li><strong>Use Meta-Commands</strong>: Explore <code>\?</code> for all available commands</li> <li><strong>Read Error Messages</strong>: REPL shows detailed error information</li> <li><strong>Copy Queries</strong>: Transfer successful queries to application code</li> <li><strong>Practice Daily</strong>: Regular REPL use builds GQL fluency</li> </ol> <h3 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> </h3> <h4 id="repl-overhead" class="position-relative d-flex align-items-center group"> <span>REPL Overhead</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="repl-overhead" aria-haspopup="dialog" aria-label="Share link: REPL Overhead"> <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>REPL introduces minimal overhead:</p> <ul> <li><strong>Parsing</strong>: Client-side syntax highlighting adds &lt;1ms</li> <li><strong>Rendering</strong>: Table formatting adds 1-5ms for typical results</li> <li><strong>Network</strong>: Same QUIC protocol as programmatic clients</li> <li><strong>Buffering</strong>: Results stream with low memory overhead</li> </ul> <h4 id="large-result-sets" class="position-relative d-flex align-items-center group"> <span>Large Result Sets</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="large-result-sets" aria-haspopup="dialog" aria-label="Share link: Large Result Sets"> <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>Handle large results efficiently:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="n">geode</span><span class="o">&gt;</span> <span class="o">--</span> <span class="n">Use</span> <span class="n">LIMIT</span> <span class="n">during</span> <span class="n">exploration</span> </span></span><span class="line"><span class="cl"><span class="n">geode</span><span class="o">&gt;</span> <span class="n">MATCH</span> <span class="p">(</span><span class="n">n</span><span class="p">:</span><span class="n">Person</span><span class="p">)</span> <span class="n">RETURN</span> <span class="n">n</span> <span class="n">LIMIT</span> <span class="mi">100</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">geode</span><span class="o">&gt;</span> <span class="o">--</span> <span class="n">Count</span> <span class="n">before</span> <span class="n">retrieving</span> </span></span><span class="line"><span class="cl"><span class="n">geode</span><span class="o">&gt;</span> <span class="n">MATCH</span> <span class="p">(</span><span class="n">n</span><span class="p">:</span><span class="n">Person</span><span class="p">)</span> <span class="n">RETURN</span> <span class="n">count</span><span class="p">(</span><span class="n">n</span><span class="p">);</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">geode</span><span class="o">&gt;</span> <span class="o">--</span> <span class="n">Use</span> <span class="n">cursors</span> <span class="k">for</span> <span class="n">large</span> <span class="n">exports</span> </span></span><span class="line"><span class="cl"><span class="n">geode</span><span class="o">&gt;</span> \<span class="k">export</span> <span class="n">persons</span><span class="o">.</span><span class="n">json</span> </span></span><span class="line"><span class="cl"><span class="n">geode</span><span class="o">&gt;</span> <span class="n">MATCH</span> <span class="p">(</span><span class="n">n</span><span class="p">:</span><span class="n">Person</span><span class="p">)</span> <span class="n">RETURN</span> <span class="n">n</span><span class="p">;</span> </span></span></code></pre></div> <h4 id="query-timing" class="position-relative d-flex align-items-center group"> <span>Query Timing</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-timing" aria-haspopup="dialog" aria-label="Share link: Query Timing"> <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>Enable timing to monitor performance:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">geode&gt; \timing on </span></span><span class="line"><span class="cl">Timing is on. </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; MATCH (p:Person {email: &#39;[email protected]&#39;}) RETURN p; </span></span><span class="line"><span class="cl">╭─────────────────────────────────╮ </span></span><span class="line"><span class="cl">│ p │ </span></span><span class="line"><span class="cl">├─────────────────────────────────┤ </span></span><span class="line"><span class="cl">│ {&#34;name&#34;: &#34;Alice&#34;, &#34;age&#34;: 32} │ </span></span><span class="line"><span class="cl">╰─────────────────────────────────╯ </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">1 row (0.8ms) </span></span></code></pre></div> <h3 id="troubleshooting" class="position-relative d-flex align-items-center group"> <span>Troubleshooting</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="troubleshooting" aria-haspopup="dialog" aria-label="Share link: Troubleshooting"> <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="connection-issues" class="position-relative d-flex align-items-center group"> <span>Connection Issues</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-issues" aria-haspopup="dialog" aria-label="Share link: Connection Issues"> <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><strong>Symptom</strong>: Cannot connect to database</p> <p><strong>Solutions</strong>:</p> <ul> <li>Verify server is running (<code>geode serve</code>)</li> <li>Check host/port configuration</li> <li>Confirm network connectivity</li> <li>Validate TLS certificates</li> <li>Review authentication credentials</li> </ul> <h4 id="slow-query-performance" class="position-relative d-flex align-items-center group"> <span>Slow Query 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="slow-query-performance" aria-haspopup="dialog" aria-label="Share link: Slow Query 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><p><strong>Symptom</strong>: Queries take longer than expected</p> <p><strong>Solutions</strong>:</p> <ul> <li>Use <code>\explain</code> to view query plan</li> <li>Check for missing indexes</li> <li>Add LIMIT to unbounded queries</li> <li>Verify network latency</li> <li>Profile with <code>\profile</code></li> </ul> <h4 id="display-issues" class="position-relative d-flex align-items-center group"> <span>Display Issues</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="display-issues" aria-haspopup="dialog" aria-label="Share link: Display Issues"> <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><strong>Symptom</strong>: Results not displaying correctly</p> <p><strong>Solutions</strong>:</p> <ul> <li>Adjust terminal width</li> <li>Switch format with <code>\format json</code></li> <li>Use vertical display <code>\x on</code></li> <li>Check for Unicode characters</li> <li>Clear screen with <code>\clear</code></li> </ul> <h4 id="history-problems" class="position-relative d-flex align-items-center group"> <span>History Problems</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="history-problems" aria-haspopup="dialog" aria-label="Share link: History Problems"> <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><strong>Symptom</strong>: Command history not working</p> <p><strong>Solutions</strong>:</p> <ul> <li>Check history file permissions</li> <li>Verify <code>~/.geode_history</code> exists</li> <li>Clear corrupted history file</li> <li>Restart REPL session</li> </ul> <h3 id="related-topics" class="position-relative d-flex align-items-center group"> <span>Related Topics</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="related-topics" aria-haspopup="dialog" aria-label="Share link: Related Topics"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><ul> <li><a href="/tags/cli/" >CLI</a> - Command-line interface and tools</li> <li><a href="/tags/development/" >Query Development</a> - Query development workflow</li> <li><a href="/tags/gql-syntax/" >GQL Syntax</a> - GQL language syntax</li> <li><a href="/tags/tools/" >Interactive Tools</a> - Development tools</li> <li><a href="/tags/debugging/" >Debugging</a> - Query debugging techniques</li> <li><a href="/tags/query-optimization/" >Query Optimization</a> - Performance tuning</li> </ul> <h3 id="advanced-repl-features" class="position-relative d-flex align-items-center group"> <span>Advanced REPL 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-repl-features" aria-haspopup="dialog" aria-label="Share link: Advanced REPL 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-history-and-search" class="position-relative d-flex align-items-center group"> <span>Query History and 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="query-history-and-search" aria-haspopup="dialog" aria-label="Share link: Query History and 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>The REPL maintains a searchable history of all commands:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">geode&gt; \history </span></span><span class="line"><span class="cl"> 1: MATCH (n) RETURN count(n); </span></span><span class="line"><span class="cl"> 2: MATCH (p:Person) RETURN p.name LIMIT 10; </span></span><span class="line"><span class="cl"> 3: MATCH (p:Person {name: &#39;Alice&#39;}) RETURN p; </span></span><span class="line"><span class="cl"> ... </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; # Search history with Ctrl+R </span></span><span class="line"><span class="cl">(reverse-i-search)`MATCH&#39;: MATCH (p:Person) RETURN p.name LIMIT 10; </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; # Re-execute previous command with !! </span></span><span class="line"><span class="cl">geode&gt; !! </span></span><span class="line"><span class="cl">MATCH (p:Person) RETURN p.name LIMIT 10; </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; # Execute specific history entry with !&lt;number&gt; </span></span><span class="line"><span class="cl">geode&gt; !2 </span></span><span class="line"><span class="cl">MATCH (p:Person) RETURN p.name LIMIT 10; </span></span></code></pre></div> <h4 id="session-persistence" class="position-relative d-flex align-items-center group"> <span>Session Persistence</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="session-persistence" aria-haspopup="dialog" aria-label="Share link: Session Persistence"> <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>Save and load REPL sessions:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="n">geode</span><span class="o">&gt;</span> \<span class="n">save</span> <span class="n">session</span><span class="o">.</span><span class="n">gql</span> </span></span><span class="line"><span class="cl"><span class="n">Saved</span> <span class="mi">15</span> <span class="n">queries</span> <span class="n">to</span> <span class="n">session</span><span class="o">.</span><span class="n">gql</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">geode</span><span class="o">&gt;</span> \<span class="nb">load</span> <span class="n">session</span><span class="o">.</span><span class="n">gql</span> </span></span><span class="line"><span class="cl"><span class="n">Loading</span> <span class="ow">and</span> <span class="n">executing</span> <span class="n">session</span><span class="o">.</span><span class="n">gql</span><span class="o">...</span> </span></span><span class="line"><span class="cl"><span class="n">Query</span> <span class="mi">1</span><span class="o">/</span><span class="mi">15</span><span class="p">:</span> <span class="n">MATCH</span> <span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="n">RETURN</span> <span class="n">count</span><span class="p">(</span><span class="n">n</span><span class="p">);</span> <span class="err">✓</span> </span></span><span class="line"><span class="cl"><span class="n">Query</span> <span class="mi">2</span><span class="o">/</span><span class="mi">15</span><span class="p">:</span> <span class="n">CREATE</span> <span class="n">INDEX</span> <span class="n">FOR</span> <span class="p">(</span><span class="n">p</span><span class="p">:</span><span class="n">Person</span><span class="p">)</span> <span class="n">ON</span> <span class="p">(</span><span class="n">p</span><span class="o">.</span><span class="n">email</span><span class="p">);</span> <span class="err">✓</span> </span></span><span class="line"><span class="cl"><span class="o">...</span> </span></span><span class="line"><span class="cl"><span class="n">Session</span> <span class="n">loaded</span> <span class="n">successfully</span><span class="o">.</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">geode</span><span class="o">&gt;</span> \<span class="k">export</span> <span class="n">results</span><span class="o">.</span><span class="n">json</span> </span></span><span class="line"><span class="cl"><span class="n">Exporting</span> <span class="n">query</span> <span class="n">results</span> <span class="n">to</span> <span class="n">results</span><span class="o">.</span><span class="n">json</span><span class="o">...</span> </span></span><span class="line"><span class="cl"><span class="n">Exported</span> <span class="mi">1523</span> <span class="n">rows</span> </span></span></code></pre></div> <h4 id="variable-binding-and-reuse" class="position-relative d-flex align-items-center group"> <span>Variable Binding and Reuse</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="variable-binding-and-reuse" aria-haspopup="dialog" aria-label="Share link: Variable Binding and Reuse"> <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>Bind query results to variables for reuse:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="n">geode</span><span class="o">&gt;</span> <span class="err">@</span><span class="n">high_value_users</span> <span class="p">:</span><span class="o">=</span> <span class="n">MATCH</span> <span class="p">(</span><span class="n">u</span><span class="p">:</span><span class="n">User</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">WHERE</span> <span class="n">u</span><span class="o">.</span><span class="n">lifetime_value</span> <span class="o">&gt;</span> <span class="mi">10000</span> </span></span><span class="line"><span class="cl"> <span class="n">RETURN</span> <span class="n">u</span><span class="o">.</span><span class="n">id</span><span class="p">,</span> <span class="n">u</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">u</span><span class="o">.</span><span class="n">email</span><span class="p">;</span> </span></span><span class="line"><span class="cl"><span class="n">Bound</span> <span class="mi">142</span> <span class="n">rows</span> <span class="n">to</span> <span class="err">@</span><span class="n">high_value_users</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">geode</span><span class="o">&gt;</span> <span class="c1"># Use bound variable in subsequent queries</span> </span></span><span class="line"><span class="cl"><span class="n">geode</span><span class="o">&gt;</span> <span class="n">MATCH</span> <span class="p">(</span><span class="n">u</span><span class="p">:</span><span class="n">User</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">WHERE</span> <span class="n">u</span><span class="o">.</span><span class="n">id</span> <span class="n">IN</span> <span class="p">[</span><span class="n">x</span><span class="o">.</span><span class="n">id</span> <span class="n">FOR</span> <span class="n">x</span> <span class="n">IN</span> <span class="err">@</span><span class="n">high_value_users</span><span class="p">]</span> </span></span><span class="line"><span class="cl"> <span class="n">MATCH</span> <span class="p">(</span><span class="n">u</span><span class="p">)</span><span class="o">-</span><span class="p">[:</span><span class="n">PURCHASED</span><span class="p">]</span><span class="o">-&gt;</span><span class="p">(</span><span class="n">p</span><span class="p">:</span><span class="n">Product</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">RETURN</span> <span class="n">u</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="n">count</span><span class="p">(</span><span class="n">p</span><span class="p">)</span> <span class="n">AS</span> <span class="n">purchases</span> </span></span><span class="line"><span class="cl"> <span class="n">ORDER</span> <span class="n">BY</span> <span class="n">purchases</span> <span class="n">DESC</span><span class="p">;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="err">╭──────────────┬────────────╮</span> </span></span><span class="line"><span class="cl"><span class="err">│</span> <span class="n">u</span><span class="o">.</span><span class="n">name</span> <span class="err">│</span> <span class="n">purchases</span> <span class="err">│</span> </span></span><span class="line"><span class="cl"><span class="err">├──────────────┼────────────┤</span> </span></span><span class="line"><span class="cl"><span class="err">│</span> <span class="n">Alice</span> <span class="n">Smith</span> <span class="err">│</span> <span class="mi">87</span> <span class="err">│</span> </span></span><span class="line"><span class="cl"><span class="err">│</span> <span class="n">Bob</span> <span class="n">Johnson</span> <span class="err">│</span> <span class="mi">72</span> <span class="err">│</span> </span></span><span class="line"><span class="cl"><span class="o">...</span> </span></span><span class="line"><span class="cl"><span class="err">╰──────────────┴────────────╯</span> </span></span></code></pre></div> <h4 id="multi-line-query-editing" class="position-relative d-flex align-items-center group"> <span>Multi-Line Query Editing</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-line-query-editing" aria-haspopup="dialog" aria-label="Share link: Multi-Line Query Editing"> <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 editing capabilities for complex queries:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">geode&gt; # Press Ctrl+X Ctrl+E to open query in $EDITOR </span></span><span class="line"><span class="cl">geode&gt; # Edit multi-line query with full text editor support </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"># Opens in vim/emacs/nano with syntax highlighting: </span></span><span class="line"><span class="cl">MATCH (u:User)-[:WORKS_AT]-&gt;(c:Company), </span></span><span class="line"><span class="cl"> (u)-[:LIVES_IN]-&gt;(city:City) </span></span><span class="line"><span class="cl">WHERE c.industry = &#39;Technology&#39; </span></span><span class="line"><span class="cl"> AND city.name IN [&#39;San Francisco&#39;, &#39;Seattle&#39;, &#39;Austin&#39;] </span></span><span class="line"><span class="cl"> AND u.salary &gt; 100000 </span></span><span class="line"><span class="cl">WITH u, c, city, </span></span><span class="line"><span class="cl"> duration.between(u.hire_date, date()) AS tenure </span></span><span class="line"><span class="cl">WHERE tenure.years &gt; 2 </span></span><span class="line"><span class="cl">RETURN u.name AS employee, </span></span><span class="line"><span class="cl"> c.name AS company, </span></span><span class="line"><span class="cl"> city.name AS location, </span></span><span class="line"><span class="cl"> u.salary AS salary, </span></span><span class="line"><span class="cl"> tenure.years AS years_employed </span></span><span class="line"><span class="cl">ORDER BY u.salary DESC </span></span><span class="line"><span class="cl">LIMIT 50; </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"># Save and exit editor, query executes in REPL </span></span></code></pre></div> <h4 id="advanced-meta-commands" class="position-relative d-flex align-items-center group"> <span>Advanced Meta-Commands</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-meta-commands" aria-haspopup="dialog" aria-label="Share link: Advanced Meta-Commands"> <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>Comprehensive database introspection:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">geode&gt; \d Person </span></span><span class="line"><span class="cl">Label: Person </span></span><span class="line"><span class="cl">Properties: </span></span><span class="line"><span class="cl"> id INTEGER PRIMARY KEY, INDEXED </span></span><span class="line"><span class="cl"> name STRING NOT NULL </span></span><span class="line"><span class="cl"> email STRING UNIQUE, INDEXED </span></span><span class="line"><span class="cl"> age INTEGER </span></span><span class="line"><span class="cl"> city STRING INDEXED </span></span><span class="line"><span class="cl"> created_at TIMESTAMP DEFAULT now() </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">Indexes: </span></span><span class="line"><span class="cl"> person_id_idx (id) - BTREE </span></span><span class="line"><span class="cl"> person_email_idx (email) - UNIQUE BTREE </span></span><span class="line"><span class="cl"> person_city_idx (city) - BTREE </span></span><span class="line"><span class="cl"> person_embedding_idx (embedding) - HNSW </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">Constraints: </span></span><span class="line"><span class="cl"> person_id_unique (id IS UNIQUE) </span></span><span class="line"><span class="cl"> person_email_unique (email IS UNIQUE) </span></span><span class="line"><span class="cl"> person_name_exists (name IS NOT NULL) </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">Relationships: </span></span><span class="line"><span class="cl"> (Person)-[:WORKS_AT]-&gt;(Company) 14523 relationships </span></span><span class="line"><span class="cl"> (Person)-[:FRIEND]-&gt;(Person) 35621 relationships </span></span><span class="line"><span class="cl"> (Person)-[:LIVES_IN]-&gt;(City) 14523 relationships </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; \timing on </span></span><span class="line"><span class="cl">Timing is on. </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; \explain on </span></span><span class="line"><span class="cl">Query plans will be displayed. </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; MATCH (p:Person {email: &#39;[email protected]&#39;}) RETURN p; </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">Query Plan: </span></span><span class="line"><span class="cl">┌─ IndexScan (person_email_idx) </span></span><span class="line"><span class="cl">│ ├─ Condition: email = &#39;[email protected]&#39; </span></span><span class="line"><span class="cl">│ ├─ Estimated rows: 1 </span></span><span class="line"><span class="cl">│ └─ Cost: 0.1 </span></span><span class="line"><span class="cl">└─ Return </span></span><span class="line"><span class="cl"> ├─ Columns: p </span></span><span class="line"><span class="cl"> └─ Cost: 0.01 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">Execution: 0.8ms (1 row) </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; \watch 5 </span></span><span class="line"><span class="cl">Repeating query every 5 seconds. Press Ctrl+C to stop. </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; MATCH (u:User) WHERE u.online = true RETURN count(u); </span></span><span class="line"><span class="cl">╭──────────╮ </span></span><span class="line"><span class="cl">│ count(u) │ </span></span><span class="line"><span class="cl">├──────────┤ </span></span><span class="line"><span class="cl">│ 1523 │ </span></span><span class="line"><span class="cl">╰──────────╯ </span></span><span class="line"><span class="cl">[2024-01-15 14:30:00] </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">╭──────────╮ </span></span><span class="line"><span class="cl">│ count(u) │ </span></span><span class="line"><span class="cl">├──────────┤ </span></span><span class="line"><span class="cl">│ 1531 │ </span></span><span class="line"><span class="cl">╰──────────╯ </span></span><span class="line"><span class="cl">[2024-01-15 14:30:05] </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">... </span></span></code></pre></div> <h4 id="output-formatting-options" class="position-relative d-flex align-items-center group"> <span>Output Formatting Options</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="output-formatting-options" aria-haspopup="dialog" aria-label="Share link: Output Formatting Options"> <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>Control result display format:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">geode&gt; \format table </span></span><span class="line"><span class="cl">Output format set to table. </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; MATCH (p:Person) RETURN p.name, p.age LIMIT 3; </span></span><span class="line"><span class="cl">╭──────────────┬──────╮ </span></span><span class="line"><span class="cl">│ p.name │ p.age│ </span></span><span class="line"><span class="cl">├──────────────┼──────┤ </span></span><span class="line"><span class="cl">│ Alice Smith │ 32 │ </span></span><span class="line"><span class="cl">│ Bob Johnson │ 28 │ </span></span><span class="line"><span class="cl">│ Carol Davis │ 45 │ </span></span><span class="line"><span class="cl">╰──────────────┴──────╯ </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; \format json </span></span><span class="line"><span class="cl">Output format set to JSON. </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; MATCH (p:Person) RETURN p.name, p.age LIMIT 3; </span></span><span class="line"><span class="cl">[ </span></span><span class="line"><span class="cl"> {&#34;p.name&#34;: &#34;Alice Smith&#34;, &#34;p.age&#34;: 32}, </span></span><span class="line"><span class="cl"> {&#34;p.name&#34;: &#34;Bob Johnson&#34;, &#34;p.age&#34;: 28}, </span></span><span class="line"><span class="cl"> {&#34;p.name&#34;: &#34;Carol Davis&#34;, &#34;p.age&#34;: 45} </span></span><span class="line"><span class="cl">] </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; \format csv </span></span><span class="line"><span class="cl">Output format set to CSV. </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; MATCH (p:Person) RETURN p.name, p.age LIMIT 3; </span></span><span class="line"><span class="cl">p.name,p.age </span></span><span class="line"><span class="cl">Alice Smith,32 </span></span><span class="line"><span class="cl">Bob Johnson,28 </span></span><span class="line"><span class="cl">Carol Davis,45 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; \format vertical </span></span><span class="line"><span class="cl">Output format set to vertical. </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; MATCH (p:Person) RETURN p.name, p.email, p.age LIMIT 1; </span></span><span class="line"><span class="cl">─────────────── Row 1 ─────────────── </span></span><span class="line"><span class="cl">p.name │ Alice Smith </span></span><span class="line"><span class="cl">p.email │ [email protected] </span></span><span class="line"><span class="cl">p.age │ 32 </span></span></code></pre></div> <h4 id="batch-operations" class="position-relative d-flex align-items-center group"> <span>Batch Operations</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="batch-operations" aria-haspopup="dialog" aria-label="Share link: Batch Operations"> <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>Execute multiple queries efficiently:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">geode&gt; \batch </span></span><span class="line"><span class="cl">Batch mode enabled. Commands will queue until &#39;\execute&#39;. </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">batch&gt; CREATE (:User {id: 1, name: &#39;Alice&#39;}); </span></span><span class="line"><span class="cl">Queued (1) </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">batch&gt; CREATE (:User {id: 2, name: &#39;Bob&#39;}); </span></span><span class="line"><span class="cl">Queued (2) </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">batch&gt; CREATE (:User {id: 3, name: &#39;Carol&#39;}); </span></span><span class="line"><span class="cl">Queued (3) </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">batch&gt; MATCH (a:User {id: 1}), (b:User {id: 2}) </span></span><span class="line"><span class="cl"> CREATE (a)-[:FRIEND]-&gt;(b); </span></span><span class="line"><span class="cl">Queued (4) </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">batch&gt; \execute </span></span><span class="line"><span class="cl">Executing 4 queued queries in transaction... </span></span><span class="line"><span class="cl">✓ Query 1 completed (1.2ms) </span></span><span class="line"><span class="cl">✓ Query 2 completed (0.9ms) </span></span><span class="line"><span class="cl">✓ Query 3 completed (0.8ms) </span></span><span class="line"><span class="cl">✓ Query 4 completed (1.1ms) </span></span><span class="line"><span class="cl">Batch completed: 4/4 succeeded (4.0ms total) </span></span></code></pre></div> <h4 id="remote-server-management" class="position-relative d-flex align-items-center group"> <span>Remote Server Management</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="remote-server-management" aria-haspopup="dialog" aria-label="Share link: Remote Server Management"> <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>Manage Geode servers from REPL:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">geode&gt; \connect production-db.example.com:3141 </span></span><span class="line"><span class="cl">Connecting to production-db.example.com:3141... </span></span><span class="line"><span class="cl">Connected to Geode v0.2.18 (cluster mode, 5 nodes) </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; \cluster status </span></span><span class="line"><span class="cl">Cluster Status: </span></span><span class="line"><span class="cl">┌────────┬─────────────────────┬─────────┬────────┬────────────┐ </span></span><span class="line"><span class="cl">│ Node │ Address │ Role │ Status │ Lag (ms) │ </span></span><span class="line"><span class="cl">├────────┼─────────────────────┼─────────┼────────┼────────────┤ </span></span><span class="line"><span class="cl">│ node1 │ 10.0.1.10:7000 │ Leader │ Healthy│ 0 │ </span></span><span class="line"><span class="cl">│ node2 │ 10.0.1.11:7000 │ Follower│ Healthy│ 2 │ </span></span><span class="line"><span class="cl">│ node3 │ 10.0.1.12:7000 │ Follower│ Healthy│ 1 │ </span></span><span class="line"><span class="cl">│ node4 │ 10.0.2.10:7000 │ Observer│ Healthy│ 45 │ </span></span><span class="line"><span class="cl">│ node5 │ 10.0.2.11:7000 │ Observer│ Healthy│ 48 │ </span></span><span class="line"><span class="cl">└────────┴─────────────────────┴─────────┴────────┴────────────┘ </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; \admin rebalance </span></span><span class="line"><span class="cl">Initiating cluster rebalance... </span></span><span class="line"><span class="cl">Progress: [████████████████████████████████] 100% (15.2s) </span></span><span class="line"><span class="cl">Rebalanced 128 shards across 5 nodes </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode&gt; \admin backup /backups/prod-$(date +%Y%m%d) </span></span><span class="line"><span class="cl">Starting backup to /backups/prod-20240115... </span></span><span class="line"><span class="cl">Backing up data files... ████████████████ 100% (2.1GB) </span></span><span class="line"><span class="cl">Backing up WAL files... ████████████████ 100% (512MB) </span></span><span class="line"><span class="cl">Backup completed: /backups/prod-20240115.tar.gz (2.6GB) </span></span></code></pre></div> <h4 id="keyboard-shortcuts-reference" class="position-relative d-flex align-items-center group"> <span>Keyboard Shortcuts Reference</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="keyboard-shortcuts-reference" aria-haspopup="dialog" aria-label="Share link: Keyboard Shortcuts Reference"> <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-fallback" data-lang="fallback"><span class="line"><span class="cl">Navigation: </span></span><span class="line"><span class="cl"> Ctrl+A / Home - Beginning of line </span></span><span class="line"><span class="cl"> Ctrl+E / End - End of line </span></span><span class="line"><span class="cl"> Ctrl+F / → - Forward one character </span></span><span class="line"><span class="cl"> Ctrl+B / ← - Backward one character </span></span><span class="line"><span class="cl"> Alt+F - Forward one word </span></span><span class="line"><span class="cl"> Alt+B - Backward one word </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">Editing: </span></span><span class="line"><span class="cl"> Ctrl+D / Delete - Delete character </span></span><span class="line"><span class="cl"> Ctrl+H / Backspace - Delete previous character </span></span><span class="line"><span class="cl"> Ctrl+K - Kill (cut) to end of line </span></span><span class="line"><span class="cl"> Ctrl+U - Kill to beginning of line </span></span><span class="line"><span class="cl"> Ctrl+W - Kill previous word </span></span><span class="line"><span class="cl"> Alt+D - Kill next word </span></span><span class="line"><span class="cl"> Ctrl+Y - Yank (paste) killed text </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">History: </span></span><span class="line"><span class="cl"> Ctrl+R - Reverse search history </span></span><span class="line"><span class="cl"> Ctrl+S - Forward search history </span></span><span class="line"><span class="cl"> ↑ / Ctrl+P - Previous command </span></span><span class="line"><span class="cl"> ↓ / Ctrl+N - Next command </span></span><span class="line"><span class="cl"> Alt+&lt; - First command in history </span></span><span class="line"><span class="cl"> Alt+&gt; - Last command in history </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">Completion: </span></span><span class="line"><span class="cl"> Tab - Auto-complete </span></span><span class="line"><span class="cl"> Alt+? - List all completions </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">Control: </span></span><span class="line"><span class="cl"> Ctrl+C - Cancel current input </span></span><span class="line"><span class="cl"> Ctrl+D - Exit (if input empty) </span></span><span class="line"><span class="cl"> Ctrl+L - Clear screen </span></span><span class="line"><span class="cl"> Ctrl+X Ctrl+E - Edit query in $EDITOR </span></span></code></pre></div> <h4 id="scripting-with-repl" class="position-relative d-flex align-items-center group"> <span>Scripting with REPL</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="scripting-with-repl" aria-haspopup="dialog" aria-label="Share link: Scripting with REPL"> <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>Automate tasks with REPL scripts:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/usr/bin/env bash </span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1"># Daily analytics script</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">geode shell --non-interactive <span class="s">&lt;&lt;&#39;EOF&#39; </span></span></span><span class="line"><span class="cl"><span class="s">-- Daily user activity report </span></span></span><span class="line"><span class="cl"><span class="s">\output daily_report_$(date +%Y%m%d).csv </span></span></span><span class="line"><span class="cl"><span class="s">\format csv </span></span></span><span class="line"><span class="cl"><span class="s"> </span></span></span><span class="line"><span class="cl"><span class="s">MATCH (u:User)-[:PERFORMED]-&gt;(e:Event) </span></span></span><span class="line"><span class="cl"><span class="s">WHERE e.timestamp &gt; datetime().minusDays(1) </span></span></span><span class="line"><span class="cl"><span class="s">WITH u, count(e) AS event_count, collect(DISTINCT e.type) AS event_types </span></span></span><span class="line"><span class="cl"><span class="s">ORDER BY event_count DESC </span></span></span><span class="line"><span class="cl"><span class="s">RETURN u.id, u.name, event_count, event_types </span></span></span><span class="line"><span class="cl"><span class="s">LIMIT 1000; </span></span></span><span class="line"><span class="cl"><span class="s"> </span></span></span><span class="line"><span class="cl"><span class="s">-- Export to JSON for downstream processing </span></span></span><span class="line"><span class="cl"><span class="s">\output user_cohorts.json </span></span></span><span class="line"><span class="cl"><span class="s">\format json </span></span></span><span class="line"><span class="cl"><span class="s"> </span></span></span><span class="line"><span class="cl"><span class="s">MATCH (u:User) </span></span></span><span class="line"><span class="cl"><span class="s">WITH u, </span></span></span><span class="line"><span class="cl"><span class="s"> duration.between(u.created_at, datetime()).days AS days_since_signup </span></span></span><span class="line"><span class="cl"><span class="s">WITH CASE </span></span></span><span class="line"><span class="cl"><span class="s"> WHEN days_since_signup &lt;= 7 THEN &#39;new&#39; </span></span></span><span class="line"><span class="cl"><span class="s"> WHEN days_since_signup &lt;= 30 THEN &#39;active&#39; </span></span></span><span class="line"><span class="cl"><span class="s"> ELSE &#39;established&#39; </span></span></span><span class="line"><span class="cl"><span class="s"> END AS cohort, </span></span></span><span class="line"><span class="cl"><span class="s"> count(u) AS user_count </span></span></span><span class="line"><span class="cl"><span class="s">RETURN cohort, user_count; </span></span></span><span class="line"><span class="cl"><span class="s"> </span></span></span><span class="line"><span class="cl"><span class="s">\quit </span></span></span><span class="line"><span class="cl"><span class="s">EOF</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Reports generated:&#34;</span> </span></span><span class="line"><span class="cl">ls -lh daily_report_*.csv user_cohorts.json </span></span></code></pre></div> <h4 id="ide-integration" class="position-relative d-flex align-items-center group"> <span>IDE 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="ide-integration" aria-haspopup="dialog" aria-label="Share link: IDE 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>Use REPL output in development workflows:</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"># Generate schema documentation</span> </span></span><span class="line"><span class="cl">geode shell --execute <span class="s2">&#34;\dt&#34;</span> &gt; docs/schema.txt </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Extract sample data for testing</span> </span></span><span class="line"><span class="cl">geode shell --execute <span class="s2">&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (u:User) RETURN u LIMIT 100; </span></span></span><span class="line"><span class="cl"><span class="s2"> \format json </span></span></span><span class="line"><span class="cl"><span class="s2">&#34;</span> &gt; test/fixtures/users.json </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Monitor query performance</span> </span></span><span class="line"><span class="cl">geode shell --execute <span class="s2">&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> \timing on </span></span></span><span class="line"><span class="cl"><span class="s2"> \profile </span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (u:User)-[:PURCHASED]-&gt;(p:Product) </span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE p.category = &#39;Electronics&#39; </span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN u.name, count(p) AS purchases </span></span></span><span class="line"><span class="cl"><span class="s2"> ORDER BY purchases DESC LIMIT 10; </span></span></span><span class="line"><span class="cl"><span class="s2">&#34;</span> &gt; performance_report.txt </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/development/repl-advanced/" >REPL Advanced Guide</a> - Complete REPL documentation</li> <li><a href="/docs/quick-reference/" >GQL Quick Reference</a> - GQL syntax cheat sheet</li> <li><a href="/docs/tutorials/repl-basics/" >REPL Basics Tutorial</a> - Hands-on REPL tutorial</li> <li><a href="https://tiswww.case.edu/php/chet/readline/rluserman.html" aria-label="Readline Documentation – opens in new window" target="_blank" rel="noopener noreferrer" >Readline Documentation <span aria-hidden="true" class="external-icon">↗</span> </a> - Keyboard shortcuts</li> <li><a href="https://www.postgresql.org/docs/current/app-psql.html" aria-label="PostgreSQL psql – opens in new window" target="_blank" rel="noopener noreferrer" >PostgreSQL psql <span aria-hidden="true" class="external-icon">↗</span> </a> - Inspiration for meta-commands</li> </ul>

Related Articles