<!-- 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’re using Visual Studio Code, IntelliJ IDEA, Vim, Emacs, or other LSP-compatible editors, Geode’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">'%</span><span class="nd">@example</span><span class="err">.</span><span class="py">com</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">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">'</span><span class="py">value</span><span class="err">';</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">'</span><span class="py">nonexistent</span><span class="err">'</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">-></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">'</span><span class="py">f</span><span class="err">'</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">"geode.serverPath"</span><span class="p">:</span> <span class="s2">"/usr/local/bin/geode"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"geode.connectionString"</span><span class="p">:</span> <span class="s2">"quic://localhost:3141"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"geode.enableDiagnostics"</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">"geode.formatOnSave"</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">"geode.maxNumberOfProblems"</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">"geode.trace.server"</span><span class="p">:</span> <span class="s2">"verbose"</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">"Match Pattern"</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"prefix"</span><span class="p">:</span> <span class="s2">"match"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"body"</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"MATCH (${1:n}:${2:Label})"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"WHERE ${3:condition}"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"RETURN ${4:$1};"</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">"Create Node"</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"prefix"</span><span class="p">:</span> <span class="s2">"create"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"body"</span><span class="p">:</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"CREATE (${1:n}:${2:Label} {"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">" ${3:property}: ${4:value}"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"});"</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 “Geode GQL”</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 & 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">" .vimrc or init.vim</span>
</span></span><span class="line"><span class="cl"><span class="nx">Plug</span> <span class="s1">'neovim/nvim-lspconfig'</span>
</span></span><span class="line"><span class="cl"><span class="nx">Plug</span> <span class="s1">'geodedb/vim-geode-gql'</span>
</span></span><span class="line"><span class="cl"><span class="c">
</span></span></span><span class="line"><span class="cl"><span class="c">" Configure LSP</span>
</span></span><span class="line"><span class="cl"><span class="nx">lua</span> <span class="p"><<</span> <span class="nx">EOF</span>
</span></span><span class="line"><span class="cl"><span class="nx">require</span><span class="s1">'lspconfig'</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">'geode'</span><span class="p">,</span> <span class="s1">'lsp'</span><span class="p">,</span> <span class="s1">'--stdio'</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">'gql'</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">" 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">" Go to definition</span>
</span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p"><</span><span class="nx">silent</span><span class="p">></span> <span class="nx">gd</span> <span class="p"><</span><span class="nx">cmd</span><span class="p">></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">()<</span><span class="nx">CR</span><span class="p">></span>
</span></span><span class="line"><span class="cl"><span class="c">
</span></span></span><span class="line"><span class="cl"><span class="c">" Hover documentation</span>
</span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p"><</span><span class="nx">silent</span><span class="p">></span> <span class="nx">K</span> <span class="p"><</span><span class="nx">cmd</span><span class="p">></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">()<</span><span class="nx">CR</span><span class="p">></span>
</span></span><span class="line"><span class="cl"><span class="c">
</span></span></span><span class="line"><span class="cl"><span class="c">" Find references</span>
</span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p"><</span><span class="nx">silent</span><span class="p">></span> <span class="nx">gr</span> <span class="p"><</span><span class="nx">cmd</span><span class="p">></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">()<</span><span class="nx">CR</span><span class="p">></span>
</span></span><span class="line"><span class="cl"><span class="c">
</span></span></span><span class="line"><span class="cl"><span class="c">" Format query</span>
</span></span><span class="line"><span class="cl"><span class="nx">nnoremap</span> <span class="p"><</span><span class="nx">silent</span><span class="p">></span> <span class="p"><</span><span class="nx">leader</span><span class="p">></span><span class="nx">f</span> <span class="p"><</span><span class="nx">cmd</span><span class="p">></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">()<</span><span class="nx">CR</span><span class="p">></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">" 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">":\w\+"</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">"\.\w\+"</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">/"/</span> <span class="nx">skip</span><span class="p">=</span><span class="sr">/\\"/</span> <span class="nx">end</span><span class="p">=</span><span class="sr">/"/</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">/'/</span> <span class="nx">skip</span><span class="p">=</span><span class="sr">/\\'/</span> <span class="nx">end</span><span class="p">=</span><span class="sr">/'/</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">"\\.gql\\'"</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">"geode"</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">'</span><span class="p">(</span><span class="s">"lsp"</span> <span class="s">"--stdio"</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">"C-c C-c"</span><span class="p">)</span> <span class="ss">'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">"C-c C-e"</span><span class="p">)</span> <span class="ss">'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">"C-c C-p"</span><span class="p">)</span> <span class="ss">'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">"clients"</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"geode-gql"</span><span class="p">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"enabled"</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">"command"</span><span class="p">:</span> <span class="p">[</span><span class="s2">"geode"</span><span class="p">,</span> <span class="s2">"lsp"</span><span class="p">,</span> <span class="s2">"--stdio"</span><span class="p">],</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"selector"</span><span class="p">:</span> <span class="s2">"source.gql"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"schemes"</span><span class="p">:</span> <span class="p">[</span><span class="s2">"file"</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">-></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">></span><span class="w"> </span><span class="err">'</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">'</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">> SHOW QUERY PLAN
</span></span><span class="line"><span class="cl">> SHOW VARIABLES
</span></span><span class="line"><span class="cl">> SHOW INTERMEDIATE RESULTS
</span></span><span class="line"><span class="cl">> SET BREAKPOINT AFTER MATCH
</span></span><span class="line"><span class="cl">> 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">-></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">-></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">"geode.formatting.indentSize"</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">"geode.formatting.keywordCase"</span><span class="p">:</span> <span class="s2">"UPPER"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"geode.formatting.maxLineLength"</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">"geode.formatting.insertSpaces"</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">"geode.formatting.alignClauses"</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">"MATCH (u:U"</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">"WHERE u."</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">"RETURN UP"</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">'</span><span class="py">alice</span><span class="nd">@example</span><span class="err">.</span><span class="py">com</span><span class="err">'</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">'</span><span class="py">WHRE</span><span class="err">'</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">'</span><span class="py">value</span><span class="err">'</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">'</span><span class="py">nonexistent</span><span class="err">'</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">'</span><span class="py">string</span><span class="err">'</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">-></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">'</span><span class="py">Alice</span><span class="err">'</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">"geode.connectionString"</span><span class="p">:</span> <span class="s2">"quic://localhost:3141"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nt">"geode.enableDiagnostics"</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">"geode.maxNumberOfProblems"</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">"geode.diagnostics.debounce"</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
Neovim Plugin
Geode plugin for Neovim with LSP integration
Editor Plugins
Editor and IDE integrations for Geode
VSCode Extension
VSCode extension for Geode with full IDE support
GQL Language Server Protocol Implementation Guide
Complete guide to Geode's GQL Language Server Protocol (LSP) implementation, providing IDE integration, autocomplete, syntax highlighting, and …