<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-15 --> <p>Modern development requires sophisticated IDE support for productivity, code quality, and developer experience. Geode provides comprehensive IDE integration through Language Server Protocol (LSP) implementation, syntax highlighting, intelligent auto-completion, real-time error checking, and debugging capabilities for GQL query development across popular editors and IDEs.</p> <p>Whether you&rsquo;re using Visual Studio Code, IntelliJ IDEA, Vim, Emacs, or other LSP-compatible editors, Geode&rsquo;s tooling provides the rich development experience developers expect from enterprise database platforms.</p> <h3 id="language-server-protocol-lsp" class="position-relative d-flex align-items-center group"> <span>Language Server Protocol (LSP)</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="language-server-protocol-lsp" aria-haspopup="dialog" aria-label="Share link: Language Server Protocol (LSP)"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><div id="headingShareModal" class="heading-share-modal" role="dialog" aria-modal="true" aria-labelledby="headingShareTitle" hidden> <div class="hsm-dialog" role="document"> <div class="hsm-header"> <h2 id="headingShareTitle" class="h6 mb-0 fw-bold">Share this section</h2> <button type="button" class="hsm-close" aria-label="Close"> <i class="fa-solid fa-xmark"></i> </button> </div> <div class="hsm-body"> <label for="headingShareInput" class="form-label small text-muted mb-1 text-uppercase fw-bold" style="font-size: 0.7rem; letter-spacing: 0.5px;">Permalink</label> <div class="input-group mb-4 hsm-url-group"> <input id="headingShareInput" type="text" class="form-control font-monospace" readonly aria-readonly="true" style="font-size: 0.85rem;" /> <button class="btn btn-primary hsm-copy" type="button" aria-label="Copy" title="Copy"> <i class="fa-duotone fa-clipboard" aria-hidden="true"></i> </button> </div> <div class="small fw-bold mb-2 text-muted text-uppercase" style="font-size: 0.7rem; letter-spacing: 0.5px;">Share via</div> <div class="hsm-share-grid"> <a id="share-twitter" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer"> <i class="fa-brands fa-twitter me-2"></i>Twitter </a> <a id="share-linkedin" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer"> <i class="fa-brands fa-linkedin me-2"></i>LinkedIn </a> <a id="share-facebook" class="btn btn-outline-secondary w-100" target="_blank" rel="noopener noreferrer"> <i class="fa-brands fa-facebook me-2"></i>Facebook </a> </div> </div> </div> </div> <style> .heading-share-modal { position: fixed; inset: 0; display: flex; justify-content: center; align-items: center; background: rgba(0, 0, 0, 0.6); z-index: 1050; padding: 1rem; backdrop-filter: blur(4px); -webkit-backdrop-filter: blur(4px); } .heading-share-modal[hidden] { display: none !important; } .hsm-dialog { max-width: 420px; width: 100%; background: var(--bs-body-bg, #fff); color: var(--bs-body-color, #212529); border: 1px solid var(--bs-border-color, rgba(0,0,0,0.1)); border-radius: 1rem; box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); overflow: hidden; animation: hsm-fade-in 0.2s ease-out; } @keyframes hsm-fade-in { from { opacity: 0; transform: scale(0.95); } to { opacity: 1; transform: scale(1); } } [data-bs-theme="dark"] .hsm-dialog { background: #1e293b; border-color: rgba(255,255,255,0.1); color: #f8f9fa; } .hsm-header { display: flex; justify-content: space-between; align-items: center; padding: 1rem 1.5rem; border-bottom: 1px solid var(--bs-border-color, rgba(0,0,0,0.1)); background: rgba(0,0,0,0.02); } [data-bs-theme="dark"] .hsm-header { background: rgba(255,255,255,0.02); border-color: rgba(255,255,255,0.1); } .hsm-close { background: transparent; border: none; color: inherit; opacity: 0.5; padding: 0.25rem 0.5rem; border-radius: 0.25rem; font-size: 1.2rem; line-height: 1; transition: opacity 0.2s; } .hsm-close:hover { opacity: 1; } .hsm-body { padding: 1.5rem; } .hsm-url-group { display: flex !important; align-items: stretch; } .hsm-url-group .form-control { flex: 1; min-width: 0; margin: 0; background: var(--bs-secondary-bg, #f8f9fa); border-color: var(--bs-border-color, #dee2e6); border-top-right-radius: 0; border-bottom-right-radius: 0; height: 42px; } .hsm-url-group .btn { flex: 0 0 auto; margin: 0; margin-left: -1px; border-top-left-radius: 0; border-bottom-left-radius: 0; height: 42px; display: flex; align-items: center; justify-content: center; padding: 0 1.25rem; z-index: 2; } [data-bs-theme="dark"] .hsm-url-group .form-control { background: #0f172a; border-color: #334155; color: #e2e8f0; } .hsm-share-grid { display: flex; flex-direction: column; gap: 0.5rem; } .hsm-share-grid .btn { display: flex; align-items: center; justify-content: center; font-size: 0.9rem; padding: 0.6rem; border-color: var(--bs-border-color); width: 100%; } [data-bs-theme="dark"] .hsm-share-grid .btn { color: #e2e8f0; border-color: #475569; } [data-bs-theme="dark"] .hsm-share-grid .btn:hover { background: #334155; border-color: #cbd5e1; } </style> <script> (function(){ const modal = document.getElementById('headingShareModal'); if(!modal) return; const input = modal.querySelector('#headingShareInput'); const copyBtn = modal.querySelector('.hsm-copy'); const twitter = modal.querySelector('#share-twitter'); const linkedin = modal.querySelector('#share-linkedin'); const facebook = modal.querySelector('#share-facebook'); const closeBtn = modal.querySelector('.hsm-close'); let lastFocus=null; let trapBound=false; function buildUrl(id){ return window.location.origin + window.location.pathname + '#' + id; } function isOpen(){ return !modal.hasAttribute('hidden'); } function hydrate(id){ const url=buildUrl(id); input.value=url; const enc=encodeURIComponent(url); const text=encodeURIComponent(document.title); if(twitter) twitter.href=`https://twitter.com/intent/tweet?url=${enc}&text=${text}`; if(linkedin) linkedin.href=`https://www.linkedin.com/sharing/share-offsite/?url=${enc}`; if(facebook) facebook.href=`https://www.facebook.com/sharer/sharer.php?u=${enc}`; } function openModal(id){ lastFocus=document.activeElement; hydrate(id); if(!isOpen()){ modal.removeAttribute('hidden'); } requestAnimationFrame(()=>{ input.focus(); }); trapFocus(); } function closeModal(){ if(!isOpen()) return; modal.setAttribute('hidden',''); if(lastFocus && typeof lastFocus.focus==='function') lastFocus.focus(); } function copyCurrent(){ try{ navigator.clipboard.writeText(input.value).then(()=>feedback(true),()=>fallback()); } catch(e){ fallback(); } } function fallback(){ input.select(); try{ document.execCommand('copy'); feedback(true);}catch(e){ feedback(false);} } function feedback(ok){ if(!copyBtn) return; const icon=copyBtn.querySelector('i'); if(!icon) return; const prev=copyBtn.getAttribute('data-prev')||icon.className; if(!copyBtn.getAttribute('data-prev')) copyBtn.setAttribute('data-prev',prev); icon.className= ok ? 'fa-duotone fa-clipboard-check':'fa-duotone fa-circle-exclamation'; setTimeout(()=>{ icon.className=prev; },1800); } function handleShareClick(e){ e.preventDefault(); const btn=e.currentTarget; const id=btn.getAttribute('data-share-target'); if(id) openModal(id); } function bindShareButtons(){ document.querySelectorAll('.h-share').forEach(btn=>{ if(!btn.dataset.hShareBound){ btn.addEventListener('click', handleShareClick); btn.dataset.hShareBound='1'; } }); } bindShareButtons(); if(document.readyState==='loading'){ document.addEventListener('DOMContentLoaded', bindShareButtons); } else { requestAnimationFrame(bindShareButtons); } document.addEventListener('click', function(e){ const shareBtn=e.target.closest && e.target.closest('.h-share'); if(shareBtn && !shareBtn.dataset.hShareBound){ handleShareClick.call(shareBtn, e); } }, true); document.addEventListener('click', e=>{ if(e.target===modal) closeModal(); if(e.target.closest && e.target.closest('.hsm-close')){ e.preventDefault(); closeModal(); } if(copyBtn && (e.target===copyBtn || (e.target.closest && e.target.closest('.hsm-copy')))) { e.preventDefault(); copyCurrent(); } }); document.addEventListener('keydown', e=>{ if(e.key==='Escape' && isOpen()) closeModal(); }); function trapFocus(){ if(trapBound) return; trapBound=true; modal.addEventListener('keydown', f=>{ if(f.key==='Tab' && isOpen()){ const focusable=[...modal.querySelectorAll('a[href],button,input,textarea,select,[tabindex]:not([tabindex="-1"])')].filter(el=>!el.hasAttribute('disabled')); if(!focusable.length) return; const first=focusable[0]; const last=focusable[focusable.length-1]; if(f.shiftKey && document.activeElement===first){ f.preventDefault(); last.focus(); } else if(!f.shiftKey && document.activeElement===last){ f.preventDefault(); first.focus(); } } }); } if(closeBtn) closeBtn.addEventListener('click', e=>{ e.preventDefault(); closeModal(); }); })(); </script><p>Geode implements the Language Server Protocol, providing standardized language intelligence features across all LSP-compatible editors:</p> <p><strong>Features Provided</strong>:</p> <ul> <li><strong>Syntax Highlighting</strong>: Context-aware colorization of GQL syntax</li> <li><strong>Auto-Completion</strong>: Intelligent suggestions for keywords, functions, labels, and properties</li> <li><strong>Diagnostics</strong>: Real-time error and warning detection</li> <li><strong>Hover Information</strong>: Documentation and type information on hover</li> <li><strong>Go to Definition</strong>: Jump to label, property, or function definitions</li> <li><strong>Find References</strong>: Locate all usages of labels, properties, or variables</li> <li><strong>Signature Help</strong>: Parameter information for functions</li> <li><strong>Code Formatting</strong>: Automatic GQL query formatting</li> <li><strong>Rename Refactoring</strong>: Rename variables, labels, or properties across queries</li> </ul> <p><strong>Starting the Language Server</strong>:</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 GQL language server</span> </span></span><span class="line"><span class="cl">geode lsp --stdio </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Start with debug logging</span> </span></span><span class="line"><span class="cl">geode lsp --stdio --log-level debug --log-file /tmp/geode-lsp.log </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Start with TCP socket (for remote editing)</span> </span></span><span class="line"><span class="cl">geode lsp --listen 127.0.0.1:5007 </span></span></code></pre></div> <h3 id="visual-studio-code-integration" class="position-relative d-flex align-items-center group"> <span>Visual Studio Code 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="visual-studio-code-integration" aria-haspopup="dialog" aria-label="Share link: Visual Studio Code 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><p><strong>Installation</strong>:</p> <ol> <li>Install the Geode GQL extension from VS Code Marketplace:</li> </ol> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">code --install-extension geodedb.geode-gql </span></span></code></pre></div><ol start="2"> <li>Or manually from VSIX:</li> </ol> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">code --install-extension geode-gql-1.0.0.vsix </span></span></code></pre></div><p><strong>Features</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Auto</span><span class="err">-</span><span class="py">completion</span><span class="w"> </span><span class="py">suggests</span><span class="w"> </span><span class="py">labels</span><span class="p">,</span><span class="w"> </span><span class="py">properties</span><span class="p">,</span><span class="w"> </span><span class="py">functions</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 class="err">--</span><span class="w"> </span><span class="py">Suggests</span><span class="w"> </span><span class="py">all</span><span class="w"> </span><span class="py">labels</span><span class="w"> </span><span class="py">including</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">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="py">LIKE</span><span class="w"> </span><span class="err">&#39;%</span><span class="nd">@example</span><span class="err">.</span><span class="py">com</span><span class="err">&#39;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Suggests</span><span class="w"> </span><span class="py">properties</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">UPPER</span><span class="p">(</span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">)</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Suggests</span><span class="w"> </span><span class="py">UPPER</span><span class="p">,</span><span class="w"> </span><span class="py">LOWER</span><span class="p">,</span><span class="w"> </span><span class="py">etc</span><span class="err">.</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Hover</span><span class="w"> </span><span class="py">shows</span><span class="w"> </span><span class="py">documentation</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="py">u</span><span class="p">)</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Hover</span><span class="w"> </span><span class="py">over</span><span class="w"> </span><span class="py">COUNT</span><span class="w"> </span><span class="py">shows</span><span class="w"> </span><span class="py">function</span><span class="w"> </span><span class="py">signature</span><span class="w"> </span><span class="py">and</span><span class="w"> </span><span class="py">description</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">Error</span><span class="w"> </span><span class="py">detection</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">nonexistent</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">&#39;</span><span class="py">value</span><span class="err">&#39;;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Warning</span><span class="p">:</span><span class="w"> </span><span class="nc">Property</span><span class="w"> </span><span class="err">&#39;</span><span class="py">nonexistent</span><span class="err">&#39;</span><span class="w"> </span><span class="py">not</span><span class="w"> </span><span class="py">found</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">Go</span><span class="w"> </span><span class="py">to</span><span class="w"> </span><span class="py">definition</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">FOLLOWS</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">f</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">f</span><span class="err">.</span><span class="py">name</span><span class="err">;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Ctrl</span><span class="err">+</span><span class="py">Click</span><span class="w"> </span><span class="kd">on</span><span class="w"> </span><span class="err">&#39;</span><span class="py">f</span><span class="err">&#39;</span><span class="w"> </span><span class="py">jumps</span><span class="w"> </span><span class="py">to</span><span class="w"> </span><span class="py">variable</span><span class="w"> </span><span class="py">binding</span><span class="w"> </span></span></span></code></pre></div><p><strong>Configuration</strong> (.vscode/settings.json):</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;geode.serverPath&#34;</span><span class="p">:</span> <span class="s2">&#34;/usr/local/bin/geode&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;geode.connectionString&#34;</span><span class="p">:</span> <span class="s2">&#34;quic://localhost:3141&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;geode.enableDiagnostics&#34;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;geode.formatOnSave&#34;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;geode.maxNumberOfProblems&#34;</span><span class="p">:</span> <span class="mi">100</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;geode.trace.server&#34;</span><span class="p">:</span> <span class="s2">&#34;verbose&#34;</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></div><p><strong>Snippets</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;Match Pattern&#34;</span><span class="p">:</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;prefix&#34;</span><span class="p">:</span> <span class="s2">&#34;match&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;body&#34;</span><span class="p">:</span> <span class="p">[</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;MATCH (${1:n}:${2:Label})&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;WHERE ${3:condition}&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;RETURN ${4:$1};&#34;</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="nt">&#34;Create Node&#34;</span><span class="p">:</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;prefix&#34;</span><span class="p">:</span> <span class="s2">&#34;create&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;body&#34;</span><span class="p">:</span> <span class="p">[</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;CREATE (${1:n}:${2:Label} {&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34; ${3:property}: ${4:value}&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;});&#34;</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="p">}</span> </span></span></code></pre></div> <h3 id="intellij-idea--datagrip-integration" class="position-relative d-flex align-items-center group"> <span>IntelliJ IDEA / DataGrip 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="intellij-idea--datagrip-integration" aria-haspopup="dialog" aria-label="Share link: IntelliJ IDEA / DataGrip 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><p><strong>Installation</strong>:</p> <ol> <li>Open Settings → Plugins</li> <li>Search for &ldquo;Geode GQL&rdquo;</li> <li>Click Install and restart IDE</li> </ol> <p><strong>Features</strong>:</p> <ul> <li><strong>Database Tool Window</strong>: Visual schema explorer</li> <li><strong>Query Console</strong>: Interactive GQL execution</li> <li><strong>Result Viewer</strong>: Tabular and graph visualization</li> <li><strong>Schema Introspection</strong>: Automatic schema discovery</li> <li><strong>Live Templates</strong>: Predefined query patterns</li> <li><strong>SQL-like Experience</strong>: Familiar database IDE workflow</li> </ul> <p><strong>Configuration</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">File → Settings → Languages &amp; Frameworks → Geode </span></span><span class="line"><span class="cl"> Connection String: quic://localhost:3141 </span></span><span class="line"><span class="cl"> Username: admin </span></span><span class="line"><span class="cl"> Database: default </span></span><span class="line"><span class="cl"> Auto-connect: ✓ </span></span><span class="line"><span class="cl"> Enable diagnostics: ✓ </span></span></code></pre></div><p><strong>Live Templates</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Abbreviation: mtch </span></span><span class="line"><span class="cl">Template: MATCH ($VAR$:$LABEL$) </span></span><span class="line"><span class="cl"> WHERE $CONDITION$ </span></span><span class="line"><span class="cl"> RETURN $RETURN$; </span></span></code></pre></div> <h3 id="vimneovim-integration" class="position-relative d-flex align-items-center group"> <span>Vim/Neovim 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="vimneovim-integration" aria-haspopup="dialog" aria-label="Share link: Vim/Neovim 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><p><strong>Installation with vim-plug</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vim" data-lang="vim"><span class="line"><span class="cl"><span class="c">&#34; .vimrc or init.vim</span> </span></span><span class="line"><span class="cl"><span class="nx">Plug</span> <span class="s1">&#39;neovim/nvim-lspconfig&#39;</span> </span></span><span class="line"><span class="cl"><span class="nx">Plug</span> <span class="s1">&#39;geodedb/vim-geode-gql&#39;</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Configure LSP</span> </span></span><span class="line"><span class="cl"><span class="nx">lua</span> <span class="p">&lt;&lt;</span> <span class="nx">EOF</span> </span></span><span class="line"><span class="cl"><span class="nx">require</span><span class="s1">&#39;lspconfig&#39;</span>.<span class="nx">geode_gql</span>.<span class="nx">setup</span>{ </span></span><span class="line"><span class="cl"> <span class="nx">cmd</span> <span class="p">=</span> {<span class="s1">&#39;geode&#39;</span><span class="p">,</span> <span class="s1">&#39;lsp&#39;</span><span class="p">,</span> <span class="s1">&#39;--stdio&#39;</span>}<span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nx">filetypes</span> <span class="p">=</span> {<span class="s1">&#39;gql&#39;</span>}<span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nx">root_dir</span> <span class="p">=</span> <span class="k">function</span><span class="p">(</span><span class="nx">fname</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="nx">return</span> <span class="nx">vim</span>.<span class="nx">fn</span>.<span class="nx">getcwd</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> <span class="nx">end</span> </span></span><span class="line"><span class="cl">} </span></span><span class="line"><span class="cl"><span class="nx">EOF</span> </span></span></code></pre></div><p><strong>Key Mappings</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vim" data-lang="vim"><span class="line"><span class="cl"><span class="c">&#34; Auto-completion</span> </span></span><span class="line"><span class="cl"><span class="k">autocmd</span> <span class="nx">FileType</span> <span class="nx">gql</span> <span class="nx">setlocal</span> <span class="nx">omnifunc</span><span class="p">=</span><span class="nx">v</span>:<span class="nx">lua</span>.<span class="nx">vim</span>.<span class="nx">lsp</span>.<span class="nx">omnifunc</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Go to definition</span> </span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p">&lt;</span><span class="nx">silent</span><span class="p">&gt;</span> <span class="nx">gd</span> <span class="p">&lt;</span><span class="nx">cmd</span><span class="p">&gt;</span><span class="nx">lua</span> <span class="nx">vim</span>.<span class="nx">lsp</span>.<span class="nx">buf</span>.<span class="nx">definition</span><span class="p">()&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Hover documentation</span> </span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p">&lt;</span><span class="nx">silent</span><span class="p">&gt;</span> <span class="nx">K</span> <span class="p">&lt;</span><span class="nx">cmd</span><span class="p">&gt;</span><span class="nx">lua</span> <span class="nx">vim</span>.<span class="nx">lsp</span>.<span class="nx">buf</span>.<span class="nx">hover</span><span class="p">()&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Find references</span> </span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p">&lt;</span><span class="nx">silent</span><span class="p">&gt;</span> <span class="nx">gr</span> <span class="p">&lt;</span><span class="nx">cmd</span><span class="p">&gt;</span><span class="nx">lua</span> <span class="nx">vim</span>.<span class="nx">lsp</span>.<span class="nx">buf</span>.<span class="nx">references</span><span class="p">()&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span><span class="line"><span class="cl"><span class="c"> </span></span></span><span class="line"><span class="cl"><span class="c">&#34; Format query</span> </span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p">&lt;</span><span class="nx">silent</span><span class="p">&gt;</span> <span class="p">&lt;</span><span class="nx">leader</span><span class="p">&gt;</span><span class="nx">f</span> <span class="p">&lt;</span><span class="nx">cmd</span><span class="p">&gt;</span><span class="nx">lua</span> <span class="nx">vim</span>.<span class="nx">lsp</span>.<span class="nx">buf</span>.<span class="nx">formatting</span><span class="p">()&lt;</span><span class="nx">CR</span><span class="p">&gt;</span> </span></span></code></pre></div><p><strong>Syntax Highlighting</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-vim" data-lang="vim"><span class="line"><span class="cl"><span class="c">&#34; syntax/gql.vim</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">keyword</span> <span class="nx">gqlKeyword</span> <span class="nx">MATCH</span> <span class="nx">WHERE</span> <span class="nx">RETURN</span> <span class="nx">CREATE</span> <span class="nx">DELETE</span> <span class="nx">SET</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">keyword</span> <span class="nx">gqlFunction</span> <span class="nx">COUNT</span> <span class="nx">SUM</span> <span class="nx">AVG</span> <span class="nx">MIN</span> <span class="nx">MAX</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">match</span> <span class="nx">gqlLabel</span> <span class="s2">&#34;:\w\+&#34;</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">match</span> <span class="nx">gqlProperty</span> <span class="s2">&#34;\.\w\+&#34;</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">region</span> <span class="nx">gqlString</span> <span class="nx">start</span><span class="p">=</span><span class="sr">/&#34;/</span> <span class="nx">skip</span><span class="p">=</span><span class="sr">/\\&#34;/</span> <span class="nx">end</span><span class="p">=</span><span class="sr">/&#34;/</span> </span></span><span class="line"><span class="cl"><span class="k">syntax</span> <span class="nx">region</span> <span class="nx">gqlString</span> <span class="nx">start</span><span class="p">=</span><span class="sr">/&#39;/</span> <span class="nx">skip</span><span class="p">=</span><span class="sr">/\\&#39;/</span> <span class="nx">end</span><span class="p">=</span><span class="sr">/&#39;/</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">highlight</span> <span class="nx">link</span> <span class="nx">gqlKeyword</span> <span class="nx">Keyword</span> </span></span><span class="line"><span class="cl"><span class="k">highlight</span> <span class="nx">link</span> <span class="nx">gqlFunction</span> <span class="nx">Function</span> </span></span><span class="line"><span class="cl"><span class="k">highlight</span> <span class="nx">link</span> <span class="nx">gqlLabel</span> <span class="nx">Type</span> </span></span><span class="line"><span class="cl"><span class="k">highlight</span> <span class="nx">link</span> <span class="nx">gqlProperty</span> <span class="nx">Identifier</span> </span></span><span class="line"><span class="cl"><span class="k">highlight</span> <span class="nx">link</span> <span class="nx">gqlString</span> <span class="nx">String</span> </span></span></code></pre></div> <h3 id="emacs-integration" class="position-relative d-flex align-items-center group"> <span>Emacs 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="emacs-integration" aria-haspopup="dialog" aria-label="Share link: Emacs 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><p><strong>Installation with use-package</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-elisp" data-lang="elisp"><span class="line"><span class="cl"><span class="c1">;; .emacs or init.el</span> </span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">use-package</span> <span class="nv">lsp-mode</span> </span></span><span class="line"><span class="cl"> <span class="nb">:ensure</span> <span class="no">t</span> </span></span><span class="line"><span class="cl"> <span class="nb">:commands</span> <span class="nv">lsp</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">use-package</span> <span class="nv">geode-gql-mode</span> </span></span><span class="line"><span class="cl"> <span class="nb">:ensure</span> <span class="no">t</span> </span></span><span class="line"><span class="cl"> <span class="nb">:mode</span> <span class="s">&#34;\\.gql\\&#39;&#34;</span> </span></span><span class="line"><span class="cl"> <span class="nb">:hook</span> <span class="p">(</span><span class="nv">geode-gql-mode</span> <span class="o">.</span> <span class="nv">lsp</span><span class="p">))</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">setq</span> <span class="nv">lsp-geode-server-path</span> <span class="s">&#34;geode&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nb">setq</span> <span class="nv">lsp-geode-server-args</span> <span class="o">&#39;</span><span class="p">(</span><span class="s">&#34;lsp&#34;</span> <span class="s">&#34;--stdio&#34;</span><span class="p">))</span> </span></span></code></pre></div><p><strong>Key Bindings</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-elisp" data-lang="elisp"><span class="line"><span class="cl"><span class="p">(</span><span class="nf">define-key</span> <span class="nv">geode-gql-mode-map</span> <span class="p">(</span><span class="nv">kbd</span> <span class="s">&#34;C-c C-c&#34;</span><span class="p">)</span> <span class="ss">&#39;geode-execute-query</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nf">define-key</span> <span class="nv">geode-gql-mode-map</span> <span class="p">(</span><span class="nv">kbd</span> <span class="s">&#34;C-c C-e&#34;</span><span class="p">)</span> <span class="ss">&#39;geode-explain-query</span><span class="p">)</span> </span></span><span class="line"><span class="cl"><span class="p">(</span><span class="nf">define-key</span> <span class="nv">geode-gql-mode-map</span> <span class="p">(</span><span class="nv">kbd</span> <span class="s">&#34;C-c C-p&#34;</span><span class="p">)</span> <span class="ss">&#39;geode-profile-query</span><span class="p">)</span> </span></span></code></pre></div> <h3 id="sublime-text-integration" class="position-relative d-flex align-items-center group"> <span>Sublime Text 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="sublime-text-integration" aria-haspopup="dialog" aria-label="Share link: Sublime Text 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><p><strong>Installation</strong>:</p> <ol> <li>Install Package Control</li> <li>Install LSP package: <code>Package Control: Install Package → LSP</code></li> <li>Install Geode GQL syntax: <code>Package Control: Install Package → Geode GQL</code></li> </ol> <p><strong>Configuration</strong> (LSP.sublime-settings):</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;clients&#34;</span><span class="p">:</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;geode-gql&#34;</span><span class="p">:</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;enabled&#34;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;command&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;geode&#34;</span><span class="p">,</span> <span class="s2">&#34;lsp&#34;</span><span class="p">,</span> <span class="s2">&#34;--stdio&#34;</span><span class="p">],</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;selector&#34;</span><span class="p">:</span> <span class="s2">&#34;source.gql&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;schemes&#34;</span><span class="p">:</span> <span class="p">[</span><span class="s2">&#34;file&#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 class="p">}</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></div> <h3 id="debugging-support" class="position-relative d-flex align-items-center group"> <span>Debugging Support</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="debugging-support" aria-haspopup="dialog" aria-label="Share link: Debugging Support"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p><strong>Query Execution with Breakpoints</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Set</span><span class="w"> </span><span class="py">breakpoint</span><span class="w"> </span><span class="py">before</span><span class="w"> </span><span class="py">execution</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">EXPLAIN</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">FOLLOWS</span><span class="p">]</span><span class="err">-&gt;</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">created_at</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="err">&#39;</span><span class="py">2024</span><span class="err">-</span><span class="py">01</span><span class="err">-</span><span class="py">01</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">f</span><span class="err">.</span><span class="py">name</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">follower_count</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">GROUP</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">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 class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">follower_count</span><span class="w"> </span><span class="py">DESC</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Step-by-Step Query Execution</strong> (VS Code):</p> <ol> <li>Set breakpoint in .gql file</li> <li>Press F5 to start debugging</li> <li>Execution pauses at breakpoint</li> <li>Inspect query execution plan</li> <li>Step through pattern matching stages</li> <li>View intermediate results</li> </ol> <p><strong>Debug Console Commands</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">&gt; SHOW QUERY PLAN </span></span><span class="line"><span class="cl">&gt; SHOW VARIABLES </span></span><span class="line"><span class="cl">&gt; SHOW INTERMEDIATE RESULTS </span></span><span class="line"><span class="cl">&gt; SET BREAKPOINT AFTER MATCH </span></span><span class="line"><span class="cl">&gt; CONTINUE </span></span></code></pre></div> <h3 id="schema-explorer" class="position-relative d-flex align-items-center group"> <span>Schema Explorer</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-explorer" aria-haspopup="dialog" aria-label="Share link: Schema Explorer"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p><strong>Visual Schema Browser</strong> (VS Code/IntelliJ):</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Database Explorer </span></span><span class="line"><span class="cl">├── Labels </span></span><span class="line"><span class="cl">│ ├── User </span></span><span class="line"><span class="cl">│ │ ├── Properties </span></span><span class="line"><span class="cl">│ │ │ ├── id (Integer) </span></span><span class="line"><span class="cl">│ │ │ ├── name (String) </span></span><span class="line"><span class="cl">│ │ │ ├── email (String) </span></span><span class="line"><span class="cl">│ │ │ └── created_at (Timestamp) </span></span><span class="line"><span class="cl">│ │ └── Indexes </span></span><span class="line"><span class="cl">│ │ ├── user_email_idx (email) </span></span><span class="line"><span class="cl">│ │ └── user_created_idx (created_at) </span></span><span class="line"><span class="cl">│ └── Product </span></span><span class="line"><span class="cl">│ ├── Properties </span></span><span class="line"><span class="cl">│ └── Indexes </span></span><span class="line"><span class="cl">└── Relationship Types </span></span><span class="line"><span class="cl"> ├── FOLLOWS </span></span><span class="line"><span class="cl"> ├── PURCHASED </span></span><span class="line"><span class="cl"> └── VIEWED </span></span></code></pre></div> <h3 id="query-formatting" class="position-relative d-flex align-items-center group"> <span>Query 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="query-formatting" aria-haspopup="dialog" aria-label="Share link: Query 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> </h3><p><strong>Auto-Formatting Rules</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Before</span><span class="w"> </span><span class="py">formatting</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">match</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">FOLLOWS</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">f</span><span class="p">)</span><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="p">=</span><span class="py">true</span><span class="w"> </span><span class="py">return</span><span class="w"> </span><span class="py">f</span><span class="err">.</span><span class="py">name</span><span class="p">,</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">cnt</span><span class="w"> </span><span class="py">group</span><span class="w"> </span><span class="py">by</span><span class="w"> </span><span class="py">f</span><span class="err">.</span><span class="py">name</span><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">cnt</span><span class="w"> </span><span class="py">desc</span><span class="w"> </span><span class="py">limit</span><span class="w"> </span><span class="py">10</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">After</span><span class="w"> </span><span class="py">formatting</span><span class="w"> </span><span class="p">(</span><span class="py">Ctrl</span><span class="err">+</span><span class="py">Shift</span><span class="err">+</span><span class="py">F</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">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">FOLLOWS</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">f</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">RETURN</span><span class="w"> </span><span class="py">f</span><span class="err">.</span><span class="py">name</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">cnt</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">GROUP</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">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 class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">cnt</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="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Configuration</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;geode.formatting.indentSize&#34;</span><span class="p">:</span> <span class="mi">2</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;geode.formatting.keywordCase&#34;</span><span class="p">:</span> <span class="s2">&#34;UPPER&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;geode.formatting.maxLineLength&#34;</span><span class="p">:</span> <span class="mi">80</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;geode.formatting.insertSpaces&#34;</span><span class="p">:</span> <span class="kc">true</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;geode.formatting.alignClauses&#34;</span><span class="p">:</span> <span class="kc">true</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></div> <h3 id="intellisense-and-auto-completion" class="position-relative d-flex align-items-center group"> <span>IntelliSense and Auto-Completion</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="intellisense-and-auto-completion" aria-haspopup="dialog" aria-label="Share link: IntelliSense and Auto-Completion"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p><strong>Context-Aware Suggestions</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">After</span><span class="w"> </span><span class="py">typing</span><span class="w"> </span><span class="s">&#34;MATCH (u:U&#34;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">Suggestions</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="nc">User</span><span class="w"> </span><span class="p">(</span><span class="py">label</span><span class="p">,</span><span class="w"> </span><span class="py">1234</span><span class="w"> </span><span class="py">nodes</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">UserProfile</span><span class="w"> </span><span class="p">(</span><span class="py">label</span><span class="p">,</span><span class="w"> </span><span class="py">456</span><span class="w"> </span><span class="py">nodes</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">After</span><span class="w"> </span><span class="py">typing</span><span class="w"> </span><span class="s">&#34;WHERE u.&#34;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">Suggestions</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="nc">id</span><span class="w"> </span><span class="p">(</span><span class="py">Integer</span><span class="p">,</span><span class="w"> </span><span class="py">indexed</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">name</span><span class="w"> </span><span class="p">(</span><span class="py">String</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">email</span><span class="w"> </span><span class="p">(</span><span class="py">String</span><span class="p">,</span><span class="w"> </span><span class="py">indexed</span><span class="p">,</span><span class="w"> </span><span class="py">unique</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">active</span><span class="w"> </span><span class="p">(</span><span class="py">Boolean</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">created_at</span><span class="w"> </span><span class="p">(</span><span class="py">Timestamp</span><span class="p">,</span><span class="w"> </span><span class="py">indexed</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">After</span><span class="w"> </span><span class="py">typing</span><span class="w"> </span><span class="s">&#34;RETURN UP&#34;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">Suggestions</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="nc">UPPER</span><span class="p">(</span><span class="py">string</span><span class="p">)</span><span class="w"> </span><span class="err">→</span><span class="w"> </span><span class="py">String</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="py">UPDATE</span><span class="w"> </span><span class="p">(</span><span class="py">keyword</span><span class="p">)</span><span class="w"> </span></span></span></code></pre></div> <h3 id="error-detection-and-diagnostics" class="position-relative d-flex align-items-center group"> <span>Error Detection and Diagnostics</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="error-detection-and-diagnostics" aria-haspopup="dialog" aria-label="Share link: Error Detection and Diagnostics"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p><strong>Real-Time Error Checking</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Syntax</span><span class="w"> </span><span class="py">error</span><span class="w"> </span><span class="p">(</span><span class="py">red</span><span class="w"> </span><span class="py">squiggly</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">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">WHRE</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="err">&#39;</span><span class="py">alice</span><span class="nd">@example</span><span class="err">.</span><span class="py">com</span><span class="err">&#39;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Error</span><span class="p">:</span><span class="w"> </span><span class="nc">Unknown</span><span class="w"> </span><span class="py">keyword</span><span class="w"> </span><span class="err">&#39;</span><span class="py">WHRE</span><span class="err">&#39;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Semantic</span><span class="w"> </span><span class="py">error</span><span class="w"> </span><span class="p">(</span><span class="py">yellow</span><span class="w"> </span><span class="py">squiggly</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">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">nonexistent</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">&#39;</span><span class="py">value</span><span class="err">&#39;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Warning</span><span class="p">:</span><span class="w"> </span><span class="nc">Property</span><span class="w"> </span><span class="err">&#39;</span><span class="py">nonexistent</span><span class="err">&#39;</span><span class="w"> </span><span class="py">not</span><span class="w"> </span><span class="py">in</span><span class="w"> </span><span class="kd">schema</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Type</span><span class="w"> </span><span class="py">error</span><span class="w"> </span><span class="p">(</span><span class="py">red</span><span class="w"> </span><span class="py">squiggly</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">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">created_at</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="err">&#39;</span><span class="py">string</span><span class="err">&#39;</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Error</span><span class="p">:</span><span class="w"> </span><span class="nc">Cannot</span><span class="w"> </span><span class="py">add</span><span class="w"> </span><span class="py">Timestamp</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="py">String</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div> <h3 id="query-result-visualization" class="position-relative d-flex align-items-center group"> <span>Query Result Visualization</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-result-visualization" aria-haspopup="dialog" aria-label="Share link: Query Result Visualization"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p><strong>Graph Visualization</strong> (VS Code extension):</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">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="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">FOLLOWS</span><span class="err">*</span><span class="py">1</span><span class="err">.</span><span class="mf">.3</span><span class="p">]</span><span class="err">-&gt;</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">name</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">&#39;</span><span class="py">Alice</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">path</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Opens</span><span class="w"> </span><span class="py">interactive</span><span class="w"> </span><span class="py">graph</span><span class="w"> </span><span class="py">viewer</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="nc">Nodes</span><span class="w"> </span><span class="py">rendered</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">labels</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">Relationships</span><span class="w"> </span><span class="py">shown</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">arrows</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">Properties</span><span class="w"> </span><span class="py">displayed</span><span class="w"> </span><span class="kd">on</span><span class="w"> </span><span class="py">hover</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">Zoom</span><span class="w"> </span><span class="py">and</span><span class="w"> </span><span class="py">pan</span><span class="w"> </span><span class="py">controls</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">Export</span><span class="w"> </span><span class="py">to</span><span class="w"> </span><span class="py">PNG</span><span class="err">/</span><span class="py">SVG</span><span class="w"> </span></span></span></code></pre></div><p><strong>Table View</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">┌─────────┬─────────────────┬──────────────────────────┐ </span></span><span class="line"><span class="cl">│ id │ name │ email │ </span></span><span class="line"><span class="cl">├─────────┼─────────────────┼──────────────────────────┤ </span></span><span class="line"><span class="cl">│ 1 │ Alice Johnson │ [email protected] │ </span></span><span class="line"><span class="cl">│ 2 │ Bob Smith │ [email protected] │ </span></span><span class="line"><span class="cl">│ 3 │ Carol Williams │ [email protected] │ </span></span><span class="line"><span class="cl">└─────────┴─────────────────┴──────────────────────────┘ </span></span></code></pre></div> <h3 id="best-practices" class="position-relative d-flex align-items-center group"> <span>Best Practices</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="best-practices" aria-haspopup="dialog" aria-label="Share link: Best Practices"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><ol> <li><strong>Enable Auto-Formatting</strong>: Format queries on save for consistency</li> <li><strong>Use Schema Introspection</strong>: Let IDE discover schema automatically</li> <li><strong>Leverage Snippets</strong>: Create common query patterns as snippets</li> <li><strong>Configure Key Bindings</strong>: Set up shortcuts for execute, explain, and profile</li> <li><strong>Enable Diagnostics</strong>: Real-time error checking catches issues early</li> <li><strong>Use Debugging</strong>: Step through complex queries to understand execution</li> <li><strong>Organize Queries</strong>: Use .gql files for version control and collaboration</li> </ol> <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><p><strong>Language Server Not Starting</strong>:</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"># Check server is installed</span> </span></span><span class="line"><span class="cl">which geode </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Test server manually</span> </span></span><span class="line"><span class="cl">geode lsp --stdio </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Check logs</span> </span></span><span class="line"><span class="cl">tail -f /tmp/geode-lsp.log </span></span></code></pre></div><p><strong>No Auto-Completion</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="c1">// Verify connection in settings </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;geode.connectionString&#34;</span><span class="p">:</span> <span class="s2">&#34;quic://localhost:3141&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;geode.enableDiagnostics&#34;</span><span class="p">:</span> <span class="kc">true</span> </span></span><span class="line"><span class="cl"><span class="p">}</span> </span></span></code></pre></div><p><strong>Slow Performance</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-json" data-lang="json"><span class="line"><span class="cl"><span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="nt">&#34;geode.maxNumberOfProblems&#34;</span><span class="p">:</span> <span class="mi">50</span><span class="p">,</span> <span class="c1">// Reduce from 100 </span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="nt">&#34;geode.diagnostics.debounce&#34;</span><span class="p">:</span> <span class="mi">500</span> <span class="c1">// Increase delay </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span> </span></span></code></pre></div> <h3 id="related-topics" class="position-relative d-flex align-items-center group"> <span>Related Topics</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="related-topics" aria-haspopup="dialog" aria-label="Share link: Related Topics"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><ul> <li>Development Tooling and DevOps</li> <li>CLI Tools and Utilities</li> <li>Query Optimization</li> <li>Debugging and Profiling</li> <li>Schema Management</li> <li>Code Quality and Linting</li> </ul> <h3 id="further-reading" class="position-relative d-flex align-items-center group"> <span>Further Reading</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="further-reading" aria-haspopup="dialog" aria-label="Share link: Further Reading"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><ul> <li>Language Server Protocol Specification</li> <li>VS Code Extension Development</li> <li>IntelliJ Plugin Development</li> <li>Vim LSP Configuration</li> <li>Emacs LSP Mode</li> <li>Query Debugging Guide</li> <li>IDE Configuration Best Practices</li> </ul>

Related Articles