<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-15 -->
<p>The <strong>Tutorials & Learning Guides</strong> category provides structured, hands-on learning paths for mastering Geode graph database. From installation through advanced features, these tutorials build skills progressively with complete code examples, expected outputs, and practical exercises.</p>
<h3 id="introduction" class="position-relative d-flex align-items-center group">
<span>Introduction</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="introduction"
aria-haspopup="dialog"
aria-label="Share link: Introduction">
<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>Learning a new database is most effective through hands-on practice with guided examples. Geode’s tutorials are designed for progressive skill building: start with installation and basic queries, advance to pattern matching and indexing, explore transactions and concurrency, and master advanced features like vector search and graph algorithms. Each tutorial is self-contained with setup instructions, complete code, expected results, and exercises for practice.</p>
<p>Tutorials span beginner through advanced levels. Beginners learn installation, REPL basics, and simple MATCH patterns. Intermediate users explore indexing strategies, transaction management, and query optimization. Advanced users master vector search, graph algorithms, Row-Level Security, and production deployment patterns. Whether learning alone or training a team, these tutorials provide structured learning paths.</p>
<h3 id="what-youll-find" class="position-relative d-flex align-items-center group">
<span>What You&rsquo;ll Find</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="what-youll-find"
aria-haspopup="dialog"
aria-label="Share link: What Youll Find">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="getting-started-tutorials" class="position-relative d-flex align-items-center group">
<span>Getting Started Tutorials</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="getting-started-tutorials"
aria-haspopup="dialog"
aria-label="Share link: Getting Started Tutorials">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Installation and Setup</strong></p>
<ul>
<li>Installing Geode (Docker, binary, source)</li>
<li>Starting the database server</li>
<li>Connecting with the REPL shell</li>
<li>Creating your first graph</li>
<li>Basic CRUD operations</li>
<li>Understanding graph structure</li>
</ul>
<p><strong>REPL Basics</strong></p>
<ul>
<li>Interactive shell features</li>
<li>Multi-line query editing</li>
<li>Result formatting options</li>
<li>History and search</li>
<li>Meta-commands</li>
<li>Saving and loading sessions</li>
</ul>
<h4 id="query-language-tutorials" class="position-relative d-flex align-items-center group">
<span>Query Language Tutorials</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-language-tutorials"
aria-haspopup="dialog"
aria-label="Share link: Query Language Tutorials">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Pattern Matching Fundamentals</strong></p>
<ul>
<li>Basic node patterns</li>
<li>Relationship patterns</li>
<li>Variable-length paths</li>
<li>Pattern composition</li>
<li>Optional patterns with EXISTS</li>
<li>Filtering with WHERE</li>
</ul>
<p><strong>Data Manipulation</strong></p>
<ul>
<li>Inserting nodes and relationships</li>
<li>Updating properties with SET</li>
<li>Removing properties</li>
<li>Deleting nodes and relationships</li>
<li>Merging patterns</li>
<li>Bulk operations</li>
</ul>
<p><strong>Aggregations and Analytics</strong></p>
<ul>
<li>COUNT, SUM, AVG, MIN, MAX</li>
<li>GROUP BY for grouping</li>
<li>COLLECT for arrays</li>
<li>DISTINCT for uniqueness</li>
<li>Nested aggregations</li>
<li>Window functions</li>
</ul>
<h4 id="advanced-tutorials" class="position-relative d-flex align-items-center group">
<span>Advanced Tutorials</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="advanced-tutorials"
aria-haspopup="dialog"
aria-label="Share link: Advanced Tutorials">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Indexing Strategies</strong></p>
<ul>
<li>Creating B+tree indexes</li>
<li>Unique constraints</li>
<li>Composite indexes</li>
<li>Vector indexes (HNSW)</li>
<li>Full-text search (BM25)</li>
<li>Index selection and optimization</li>
</ul>
<p><strong>Transaction Management</strong></p>
<ul>
<li>BEGIN/COMMIT/ROLLBACK</li>
<li>Savepoints for partial rollback</li>
<li>Transaction isolation levels</li>
<li>Handling conflicts</li>
<li>Deadlock prevention</li>
<li>Concurrent access patterns</li>
</ul>
<p><strong>Graph Algorithms</strong></p>
<ul>
<li>PageRank for centrality</li>
<li>Community detection</li>
<li>Shortest path algorithms</li>
<li>Path finding strategies</li>
<li>Graph traversal patterns</li>
<li>Custom algorithm implementation</li>
</ul>
<p><strong>Vector Search</strong></p>
<ul>
<li>Storing embeddings</li>
<li>Creating HNSW indexes</li>
<li>Similarity search queries</li>
<li>Combining vector and graph queries</li>
<li>RAG (Retrieval Augmented Generation)</li>
<li>Semantic search patterns</li>
</ul>
<h4 id="production-tutorials" class="position-relative d-flex align-items-center group">
<span>Production Tutorials</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="production-tutorials"
aria-haspopup="dialog"
aria-label="Share link: Production Tutorials">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Performance Optimization</strong></p>
<ul>
<li>Query profiling with EXPLAIN/PROFILE</li>
<li>Index optimization</li>
<li>Query rewriting for performance</li>
<li>Connection pooling</li>
<li>Batch operations</li>
<li>Caching strategies</li>
</ul>
<p><strong>Security Configuration</strong></p>
<ul>
<li>Setting up authentication</li>
<li>Configuring Row-Level Security</li>
<li>Enabling encryption (TDE/FLE)</li>
<li>Audit logging configuration</li>
<li>Certificate management</li>
<li>Security best practices</li>
</ul>
<p><strong>Deployment Patterns</strong></p>
<ul>
<li>Docker deployment</li>
<li>Kubernetes deployment</li>
<li>High availability setup</li>
<li>Backup and restore</li>
<li>Monitoring configuration</li>
<li>Production checklist</li>
</ul>
<h3 id="learning-paths" class="position-relative d-flex align-items-center group">
<span>Learning Paths</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="learning-paths"
aria-haspopup="dialog"
aria-label="Share link: Learning Paths">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="path-1-database-beginner" class="position-relative d-flex align-items-center group">
<span>Path 1: Database Beginner</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="path-1-database-beginner"
aria-haspopup="dialog"
aria-label="Share link: Path 1: Database Beginner">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ol>
<li><strong>Installation Tutorial</strong> - Set up Geode locally</li>
<li><strong>REPL Basics</strong> - Learn interactive shell</li>
<li><strong>First Graph</strong> - Create simple graph structure</li>
<li><strong>Basic Queries</strong> - Master MATCH and RETURN</li>
<li><strong>CRUD Operations</strong> - Insert, update, delete data</li>
<li><strong>Simple Patterns</strong> - Query relationships</li>
</ol>
<p>Estimated time: 4-6 hours</p>
<h4 id="path-2-gql-developer" class="position-relative d-flex align-items-center group">
<span>Path 2: GQL Developer</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="path-2-gql-developer"
aria-haspopup="dialog"
aria-label="Share link: Path 2: GQL Developer">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ol>
<li><strong>Advanced Patterns</strong> - Complex graph patterns</li>
<li><strong>Aggregations</strong> - Analytics queries</li>
<li><strong>Subqueries</strong> - Nested query logic</li>
<li><strong>Transactions</strong> - ACID operations</li>
<li><strong>Query Optimization</strong> - Performance tuning</li>
<li><strong>Client Integration</strong> - Application development</li>
</ol>
<p>Estimated time: 8-12 hours</p>
<h4 id="path-3-production-engineer" class="position-relative d-flex align-items-center group">
<span>Path 3: Production Engineer</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="path-3-production-engineer"
aria-haspopup="dialog"
aria-label="Share link: Path 3: Production Engineer">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ol>
<li><strong>Indexing Strategies</strong> - Optimize queries</li>
<li><strong>Performance Tuning</strong> - System optimization</li>
<li><strong>Security Setup</strong> - Authentication and encryption</li>
<li><strong>Monitoring</strong> - Prometheus integration</li>
<li><strong>Backup/Recovery</strong> - Disaster recovery</li>
<li><strong>Production Deployment</strong> - Go-live checklist</li>
</ol>
<p>Estimated time: 12-16 hours</p>
<h4 id="path-4-advanced-features" class="position-relative d-flex align-items-center group">
<span>Path 4: Advanced Features</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="path-4-advanced-features"
aria-haspopup="dialog"
aria-label="Share link: Path 4: Advanced Features">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><ol>
<li><strong>Vector Search</strong> - Embedding-based search</li>
<li><strong>Graph Algorithms</strong> - PageRank, communities</li>
<li><strong>Row-Level Security</strong> - Fine-grained access</li>
<li><strong>CDC Streaming</strong> - Change data capture</li>
<li><strong>Advanced Optimization</strong> - Expert tuning</li>
<li><strong>Custom Extensions</strong> - Extending Geode</li>
</ol>
<p>Estimated time: 16-20 hours</p>
<h3 id="tutorial-format" class="position-relative d-flex align-items-center group">
<span>Tutorial Format</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="tutorial-format"
aria-haspopup="dialog"
aria-label="Share link: Tutorial Format">
<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>Each tutorial follows a consistent structure:</p>
<ol>
<li><strong>Learning Objectives</strong> - What you’ll learn</li>
<li><strong>Prerequisites</strong> - Required knowledge and setup</li>
<li><strong>Overview</strong> - Concept introduction</li>
<li><strong>Step-by-Step Instructions</strong> - Detailed walkthrough</li>
<li><strong>Code Examples</strong> - Complete, runnable code</li>
<li><strong>Expected Output</strong> - Verification of results</li>
<li><strong>Exercises</strong> - Practice problems</li>
<li><strong>Troubleshooting</strong> - Common issues and solutions</li>
<li><strong>Next Steps</strong> - Suggested follow-up tutorials</li>
<li><strong>Additional Resources</strong> - Further reading</li>
</ol>
<h3 id="code-examples" class="position-relative d-flex align-items-center group">
<span>Code Examples</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="code-examples"
aria-haspopup="dialog"
aria-label="Share link: Code Examples">
<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>All tutorials include complete, tested code examples:</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">Example</span><span class="w"> </span><span class="py">from</span><span class="w"> </span><span class="py">Pattern</span><span class="w"> </span><span class="py">Matching</span><span class="w"> </span><span class="py">Tutorial</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">person</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">WORKS_AT</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">company</span><span class="p">:</span><span class="nc">Company</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">person</span><span class="err">.</span><span class="py">age</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="py">30</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">company</span><span class="err">.</span><span class="py">industry</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">Technology</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">person</span><span class="err">.</span><span class="py">name</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">employee</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">company</span><span class="err">.</span><span class="py">name</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">employer</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">person</span><span class="err">.</span><span class="py">salary</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">salary</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">person</span><span class="err">.</span><span class="py">salary</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><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="c1"># Example from Client Library Tutorial</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">geode_client</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">asyncio</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">get_employee_data</span><span class="p">():</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">geode_client</span><span class="o">.</span><span class="n">open_database</span><span class="p">(</span><span class="s1">'quic://localhost:3141'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (p:Person)-[:WORKS_AT]->(c:Company)
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE p.age > 30
</span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN p.name, c.name
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">employees</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">employees</span><span class="o">.</span><span class="n">append</span><span class="p">({</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'name'</span><span class="p">:</span> <span class="n">row</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'company'</span><span class="p">:</span> <span class="n">row</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">employees</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Run tutorial example</span>
</span></span><span class="line"><span class="cl"><span class="n">employees</span> <span class="o">=</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">get_employee_data</span><span class="p">())</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">emp</span> <span class="ow">in</span> <span class="n">employees</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">emp</span><span class="p">[</span><span class="s1">'name'</span><span class="p">]</span><span class="si">}</span><span class="s2"> works at </span><span class="si">{</span><span class="n">emp</span><span class="p">[</span><span class="s1">'company'</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
</span></span></code></pre></div>
<h3 id="practice-exercises" class="position-relative d-flex align-items-center group">
<span>Practice Exercises</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="practice-exercises"
aria-haspopup="dialog"
aria-label="Share link: Practice Exercises">
<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>Tutorials include exercises for skill reinforcement:</p>
<p><strong>Exercise: Friend Recommendations</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">TODO</span><span class="p">:</span><span class="w"> </span><span class="nc">Write</span><span class="w"> </span><span class="py">a</span><span class="w"> </span><span class="kd">query</span><span class="w"> </span><span class="nc">that</span><span class="w"> </span><span class="py">finds</span><span class="w"> </span><span class="py">friends</span><span class="err">-</span><span class="py">of</span><span class="err">-</span><span class="py">friends</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">who</span><span class="w"> </span><span class="py">share</span><span class="w"> </span><span class="py">at</span><span class="w"> </span><span class="py">least</span><span class="w"> </span><span class="py">2</span><span class="w"> </span><span class="py">common</span><span class="w"> </span><span class="py">interests</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">the</span><span class="w"> </span><span class="py">user</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">but</span><span class="w"> </span><span class="py">are</span><span class="w"> </span><span class="py">not</span><span class="w"> </span><span class="py">already</span><span class="w"> </span><span class="py">friends</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">user</span><span class="p">:</span><span class="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Alice</span><span class="err">'</span><span class="p">})</span><span class="kd">...</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">Complete</span><span class="w"> </span><span class="py">this</span><span class="w"> </span><span class="kd">query</span><span class="w">
</span></span></span></code></pre></div><p><strong>Exercise: Performance Optimization</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">TODO</span><span class="p">:</span><span class="w"> </span><span class="nc">Optimize</span><span class="w"> </span><span class="py">this</span><span class="w"> </span><span class="py">slow</span><span class="w"> </span><span class="kd">query</span><span class="w"> </span><span class="nc">using</span><span class="w"> </span><span class="py">indexes</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">Current</span><span class="w"> </span><span class="py">execution</span><span class="w"> </span><span class="py">time</span><span class="p">:</span><span class="w"> </span><span class="nc">2</span><span class="mf">.5</span><span class="w"> </span><span class="py">seconds</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">Target</span><span class="w"> </span><span class="py">execution</span><span class="w"> </span><span class="py">time</span><span class="p">:</span><span class="w"> </span><span class="err"><</span><span class="nc">100ms</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">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></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">email</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">Hint</span><span class="p">:</span><span class="w"> </span><span class="nc">Consider</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="py">strategy</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="related-categories" class="position-relative d-flex align-items-center group">
<span>Related Categories</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-categories"
aria-haspopup="dialog"
aria-label="Share link: Related Categories">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ul>
<li><a
href="/categories/getting-started/"
>Getting Started</a>
- Initial setup</li>
<li><a
href="/categories/gql/"
>GQL</a>
- Query language reference</li>
<li><a
href="/categories/use-cases/"
>Use Cases</a>
- Real-world applications</li>
<li><a
href="/categories/examples/"
>Examples</a>
- Code examples</li>
<li><a
href="/categories/best-practices/"
>Best Practices</a>
- Guidelines</li>
<li><a
href="/categories/development/"
>Development</a>
- Development workflow</li>
</ul>
<h3 id="related-tags" class="position-relative d-flex align-items-center group">
<span>Related Tags</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-tags"
aria-haspopup="dialog"
aria-label="Share link: Related Tags">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ul>
<li><a
href="/tags/tutorial/"
>Tutorial</a>
- Tutorial content</li>
<li><a
href="/tags/learning/"
>Learning</a>
- Learning resources</li>
<li><a
href="/tags/getting-started/"
>Getting Started</a>
- Beginner content</li>
<li><a
href="/tags/hands-on/"
>Hands-On</a>
- Practical exercises</li>
<li><a
href="/tags/examples/"
>Examples</a>
- Code examples</li>
<li><a
href="/tags/repl/"
>REPL</a>
- Interactive shell</li>
<li><a
href="/tags/gql/"
>GQL</a>
- Query language</li>
</ul>
<h3 id="interactive-tutorials" class="position-relative d-flex align-items-center group">
<span>Interactive Tutorials</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="interactive-tutorials"
aria-haspopup="dialog"
aria-label="Share link: Interactive Tutorials">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="beginner-tutorial-your-first-graph" class="position-relative d-flex align-items-center group">
<span>Beginner Tutorial: Your First Graph</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="beginner-tutorial-your-first-graph"
aria-haspopup="dialog"
aria-label="Share link: Beginner Tutorial: Your First Graph">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Learning Objective</strong>: Create a simple social network and query it.</p>
<p><strong>Prerequisites</strong>: Geode installed and running.</p>
<p><strong>Step 1: Start the REPL</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">geode shell
</span></span><span class="line"><span class="cl">Connected to Geode v0.2.18
</span></span><span class="line"><span class="cl">geode>
</span></span></code></pre></div><p><strong>Step 2: Create Your First Nodes</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">geode</span><span class="err">></span><span class="w"> </span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">alice</span><span class="p">:</span><span class="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Alice</span><span class="err">'</span><span class="p">,</span><span class="w"> </span><span class="py">age</span><span class="p">:</span><span class="w"> </span><span class="nc">30</span><span class="p">,</span><span class="w"> </span><span class="py">city</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">San</span><span class="w"> </span><span class="py">Francisco</span><span class="err">'</span><span class="p">})</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">Created</span><span class="w"> </span><span class="py">1</span><span class="w"> </span><span class="py">node</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">geode</span><span class="err">></span><span class="w"> </span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">bob</span><span class="p">:</span><span class="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Bob</span><span class="err">'</span><span class="p">,</span><span class="w"> </span><span class="py">age</span><span class="p">:</span><span class="w"> </span><span class="nc">25</span><span class="p">,</span><span class="w"> </span><span class="py">city</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">New</span><span class="w"> </span><span class="py">York</span><span class="err">'</span><span class="p">})</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">Created</span><span class="w"> </span><span class="py">1</span><span class="w"> </span><span class="py">node</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">geode</span><span class="err">></span><span class="w"> </span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">carol</span><span class="p">:</span><span class="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Carol</span><span class="err">'</span><span class="p">,</span><span class="w"> </span><span class="py">age</span><span class="p">:</span><span class="w"> </span><span class="nc">28</span><span class="p">,</span><span class="w"> </span><span class="py">city</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">San</span><span class="w"> </span><span class="py">Francisco</span><span class="err">'</span><span class="p">})</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">Created</span><span class="w"> </span><span class="py">1</span><span class="w"> </span><span class="py">node</span><span class="w">
</span></span></span></code></pre></div><p><strong>Step 3: Create Relationships</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">geode</span><span class="err">></span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">:</span><span class="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Alice</span><span class="err">'</span><span class="p">}),</span><span class="w"> </span><span class="p">(</span><span class="py">b</span><span class="p">:</span><span class="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Bob</span><span class="err">'</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">KNOWS</span><span class="w"> </span><span class="p">{</span><span class="py">since</span><span class="p">:</span><span class="w"> </span><span class="nc">2020</span><span class="p">}]</span><span class="err">-></span><span class="p">(</span><span class="py">b</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">Created</span><span class="w"> </span><span class="py">1</span><span class="w"> </span><span class="py">relationship</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">geode</span><span class="err">></span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">:</span><span class="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Alice</span><span class="err">'</span><span class="p">}),</span><span class="w"> </span><span class="p">(</span><span class="py">c</span><span class="p">:</span><span class="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Carol</span><span class="err">'</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">KNOWS</span><span class="w"> </span><span class="p">{</span><span class="py">since</span><span class="p">:</span><span class="w"> </span><span class="nc">2019</span><span class="p">}]</span><span class="err">-></span><span class="p">(</span><span class="py">c</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">Created</span><span class="w"> </span><span class="py">1</span><span class="w"> </span><span class="py">relationship</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">geode</span><span class="err">></span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">b</span><span class="p">:</span><span class="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Bob</span><span class="err">'</span><span class="p">}),</span><span class="w"> </span><span class="p">(</span><span class="py">c</span><span class="p">:</span><span class="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Carol</span><span class="err">'</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">b</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">KNOWS</span><span class="w"> </span><span class="p">{</span><span class="py">since</span><span class="p">:</span><span class="w"> </span><span class="nc">2021</span><span class="p">}]</span><span class="err">-></span><span class="p">(</span><span class="py">c</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">Created</span><span class="w"> </span><span class="py">1</span><span class="w"> </span><span class="py">relationship</span><span class="w">
</span></span></span></code></pre></div><p><strong>Step 4: Query the Graph</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">geode</span><span class="err">></span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">RETURN</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">age</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">city</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></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="err">│</span><span class="w"> </span><span class="py">age</span><span class="w"> </span><span class="err">│</span><span class="w"> </span><span class="py">city</span><span class="w"> </span><span class="err">│</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></span><span class="line"><span class="cl"><span class="w"></span><span class="err">│</span><span class="w"> </span><span class="py">Alice</span><span class="w"> </span><span class="err">│</span><span class="w"> </span><span class="py">30</span><span class="w"> </span><span class="err">│</span><span class="w"> </span><span class="py">San</span><span class="w"> </span><span class="py">Francisco</span><span class="w"> </span><span class="err">│</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">Bob</span><span class="w"> </span><span class="err">│</span><span class="w"> </span><span class="py">25</span><span class="w"> </span><span class="err">│</span><span class="w"> </span><span class="py">New</span><span class="w"> </span><span class="py">York</span><span class="w"> </span><span class="err">│</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">Carol</span><span class="w"> </span><span class="err">│</span><span class="w"> </span><span class="py">28</span><span class="w"> </span><span class="err">│</span><span class="w"> </span><span class="py">San</span><span class="w"> </span><span class="py">Francisco</span><span class="w"> </span><span class="err">│</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></span></code></pre></div><p><strong>Step 5: Find Connections</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">geode</span><span class="err">></span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">:</span><span class="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">Alice</span><span class="err">'</span><span class="p">})</span><span class="err">-</span><span class="p">[:</span><span class="nc">KNOWS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">friend</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">friend</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">friend</span><span class="err">.</span><span class="py">city</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></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="err">│</span><span class="w"> </span><span class="py">city</span><span class="w"> </span><span class="err">│</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></span><span class="line"><span class="cl"><span class="w"></span><span class="err">│</span><span class="w"> </span><span class="py">Bob</span><span class="w"> </span><span class="err">│</span><span class="w"> </span><span class="py">New</span><span class="w"> </span><span class="py">York</span><span class="w"> </span><span class="err">│</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">Carol</span><span class="w"> </span><span class="err">│</span><span class="w"> </span><span class="py">San</span><span class="w"> </span><span class="py">Francisco</span><span class="w"> </span><span class="err">│</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></span></code></pre></div><p><strong>Exercise</strong>: Add yourself to the graph and create friendships. Then find all people who know at least 2 people.</p>
<h4 id="intermediate-tutorial-building-a-recommendation-engine" class="position-relative d-flex align-items-center group">
<span>Intermediate Tutorial: Building a Recommendation Engine</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="intermediate-tutorial-building-a-recommendation-engine"
aria-haspopup="dialog"
aria-label="Share link: Intermediate Tutorial: Building a Recommendation Engine">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Learning Objective</strong>: Implement collaborative filtering recommendations.</p>
<p><strong>Scenario</strong>: A movie recommendation system based on user ratings.</p>
<p><strong>Step 1: Create the Data Model</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">geode_client</span>
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">asyncio</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">setup_movie_database</span><span class="p">():</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">geode_client</span><span class="o">.</span><span class="n">open_database</span><span class="p">(</span><span class="s1">'quic://localhost:3141'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Create movies</span>
</span></span><span class="line"><span class="cl"> <span class="n">movies</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span><span class="s1">'title'</span><span class="p">:</span> <span class="s1">'The Matrix'</span><span class="p">,</span> <span class="s1">'genre'</span><span class="p">:</span> <span class="s1">'Sci-Fi'</span><span class="p">,</span> <span class="s1">'year'</span><span class="p">:</span> <span class="mi">1999</span><span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span><span class="s1">'title'</span><span class="p">:</span> <span class="s1">'Inception'</span><span class="p">,</span> <span class="s1">'genre'</span><span class="p">:</span> <span class="s1">'Sci-Fi'</span><span class="p">,</span> <span class="s1">'year'</span><span class="p">:</span> <span class="mi">2010</span><span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span><span class="s1">'title'</span><span class="p">:</span> <span class="s1">'Interstellar'</span><span class="p">,</span> <span class="s1">'genre'</span><span class="p">:</span> <span class="s1">'Sci-Fi'</span><span class="p">,</span> <span class="s1">'year'</span><span class="p">:</span> <span class="mi">2014</span><span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">{</span><span class="s1">'title'</span><span class="p">:</span> <span class="s1">'The Shawshank Redemption'</span><span class="p">,</span> <span class="s1">'genre'</span><span class="p">:</span> <span class="s1">'Drama'</span><span class="p">,</span> <span class="s1">'year'</span><span class="p">:</span> <span class="mi">1994</span><span class="p">},</span>
</span></span><span class="line"><span class="cl"> <span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">movie</span> <span class="ow">in</span> <span class="n">movies</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE (:Movie {
</span></span></span><span class="line"><span class="cl"><span class="s2"> title: $title,
</span></span></span><span class="line"><span class="cl"><span class="s2"> genre: $genre,
</span></span></span><span class="line"><span class="cl"><span class="s2"> year: $year
</span></span></span><span class="line"><span class="cl"><span class="s2"> })
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="n">movie</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Create users</span>
</span></span><span class="line"><span class="cl"> <span class="n">users</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'Alice'</span><span class="p">,</span> <span class="s1">'Bob'</span><span class="p">,</span> <span class="s1">'Carol'</span><span class="p">,</span> <span class="s1">'Dave'</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">user</span> <span class="ow">in</span> <span class="n">users</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE (:User {name: $name})
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span><span class="s1">'name'</span><span class="p">:</span> <span class="n">user</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Create ratings</span>
</span></span><span class="line"><span class="cl"> <span class="n">ratings</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="s1">'Alice'</span><span class="p">,</span> <span class="s1">'The Matrix'</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="s1">'Alice'</span><span class="p">,</span> <span class="s1">'Inception'</span><span class="p">,</span> <span class="mi">4</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="s1">'Bob'</span><span class="p">,</span> <span class="s1">'The Matrix'</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="s1">'Bob'</span><span class="p">,</span> <span class="s1">'Interstellar'</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="s1">'Carol'</span><span class="p">,</span> <span class="s1">'Inception'</span><span class="p">,</span> <span class="mi">4</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="s1">'Carol'</span><span class="p">,</span> <span class="s1">'Interstellar'</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="s1">'Dave'</span><span class="p">,</span> <span class="s1">'The Shawshank Redemption'</span><span class="p">,</span> <span class="mi">5</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"> <span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">user_name</span><span class="p">,</span> <span class="n">movie_title</span><span class="p">,</span> <span class="n">rating</span> <span class="ow">in</span> <span class="n">ratings</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (u:User {name: $user}), (m:Movie {title: $movie})
</span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE (u)-[:RATED {score: $score}]->(m)
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span><span class="s1">'user'</span><span class="p">:</span> <span class="n">user_name</span><span class="p">,</span> <span class="s1">'movie'</span><span class="p">:</span> <span class="n">movie_title</span><span class="p">,</span> <span class="s1">'score'</span><span class="p">:</span> <span class="n">rating</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">asyncio</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">setup_movie_database</span><span class="p">())</span>
</span></span></code></pre></div><p><strong>Step 2: Implement Collaborative Filtering</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">get_recommendations</span><span class="p">(</span><span class="n">user_name</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="mi">5</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Get movie recommendations for a user."""</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">geode_client</span><span class="o">.</span><span class="n">open_database</span><span class="p">(</span><span class="s1">'quic://localhost:3141'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> // Find users with similar taste
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (me:User {name: $user})-[my_rating:RATED]->(movie:Movie)
</span></span></span><span class="line"><span class="cl"><span class="s2"> <-[their_rating:RATED]-(similar:User)
</span></span></span><span class="line"><span class="cl"><span class="s2"> -[rec_rating:RATED]->(recommendation:Movie)
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE NOT EXISTS {
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (me)-[:RATED]->(recommendation)
</span></span></span><span class="line"><span class="cl"><span class="s2"> }
</span></span></span><span class="line"><span class="cl"><span class="s2"> // Calculate similarity based on common ratings
</span></span></span><span class="line"><span class="cl"><span class="s2"> WITH recommendation,
</span></span></span><span class="line"><span class="cl"><span class="s2"> AVG(rec_rating.score) AS avg_score,
</span></span></span><span class="line"><span class="cl"><span class="s2"> COUNT(DISTINCT similar) AS similar_user_count
</span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN recommendation.title AS title,
</span></span></span><span class="line"><span class="cl"><span class="s2"> recommendation.genre AS genre,
</span></span></span><span class="line"><span class="cl"><span class="s2"> avg_score,
</span></span></span><span class="line"><span class="cl"><span class="s2"> similar_user_count
</span></span></span><span class="line"><span class="cl"><span class="s2"> ORDER BY similar_user_count DESC, avg_score DESC
</span></span></span><span class="line"><span class="cl"><span class="s2"> LIMIT $limit
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span><span class="s1">'user'</span><span class="p">:</span> <span class="n">user_name</span><span class="p">,</span> <span class="s1">'limit'</span><span class="p">:</span> <span class="n">limit</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">recommendations</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">recommendations</span><span class="o">.</span><span class="n">append</span><span class="p">({</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'title'</span><span class="p">:</span> <span class="n">row</span><span class="p">[</span><span class="s1">'title'</span><span class="p">],</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'genre'</span><span class="p">:</span> <span class="n">row</span><span class="p">[</span><span class="s1">'genre'</span><span class="p">],</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'predicted_score'</span><span class="p">:</span> <span class="n">row</span><span class="p">[</span><span class="s1">'avg_score'</span><span class="p">],</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'confidence'</span><span class="p">:</span> <span class="n">row</span><span class="p">[</span><span class="s1">'similar_user_count'</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">recommendations</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Test recommendations</span>
</span></span><span class="line"><span class="cl"><span class="n">recs</span> <span class="o">=</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">get_recommendations</span><span class="p">(</span><span class="s1">'Alice'</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="n">rec</span> <span class="ow">in</span> <span class="n">recs</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">rec</span><span class="p">[</span><span class="s1">'title'</span><span class="p">]</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">rec</span><span class="p">[</span><span class="s1">'predicted_score'</span><span class="p">]</span><span class="si">:</span><span class="s2">.1f</span><span class="si">}</span><span class="s2"> "</span>
</span></span><span class="line"><span class="cl"> <span class="sa">f</span><span class="s2">"(confidence: </span><span class="si">{</span><span class="n">rec</span><span class="p">[</span><span class="s1">'confidence'</span><span class="p">]</span><span class="si">}</span><span class="s2"> users)"</span><span class="p">)</span>
</span></span></code></pre></div><p><strong>Expected Output</strong>:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Interstellar: 5.0 (confidence: 2 users)
</span></span><span class="line"><span class="cl">The Shawshank Redemption: 5.0 (confidence: 1 user)
</span></span></code></pre></div><p><strong>Exercise</strong>: Implement content-based filtering that recommends movies in the same genre with similar ratings.</p>
<h4 id="advanced-tutorial-real-time-fraud-detection" class="position-relative d-flex align-items-center group">
<span>Advanced Tutorial: Real-Time Fraud Detection</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="advanced-tutorial-real-time-fraud-detection"
aria-haspopup="dialog"
aria-label="Share link: Advanced Tutorial: Real-Time Fraud Detection">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Learning Objective</strong>: Build a fraud detection system using graph patterns.</p>
<p><strong>Scenario</strong>: Detect suspicious transaction patterns in financial data.</p>
<p><strong>Step 1: Transaction Data Model</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">create_transaction_network</span><span class="p">():</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">geode_client</span><span class="o">.</span><span class="n">open_database</span><span class="p">(</span><span class="s1">'quic://localhost:3141'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="c1"># Create accounts</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">11</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE (:Account {
</span></span></span><span class="line"><span class="cl"><span class="s2"> id: $id,
</span></span></span><span class="line"><span class="cl"><span class="s2"> balance: $balance,
</span></span></span><span class="line"><span class="cl"><span class="s2"> created: $created
</span></span></span><span class="line"><span class="cl"><span class="s2"> })
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'id'</span><span class="p">:</span> <span class="n">i</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'balance'</span><span class="p">:</span> <span class="mf">10000.0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'created'</span><span class="p">:</span> <span class="s1">'2025-01-01'</span>
</span></span><span class="line"><span class="cl"> <span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Simulate normal transactions</span>
</span></span><span class="line"><span class="cl"> <span class="n">normal_transactions</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="s1">'2025-01-24T10:00:00Z'</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">50</span><span class="p">,</span> <span class="s1">'2025-01-24T11:00:00Z'</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">75</span><span class="p">,</span> <span class="s1">'2025-01-24T12:00:00Z'</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"> <span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">from_id</span><span class="p">,</span> <span class="n">to_id</span><span class="p">,</span> <span class="n">amount</span><span class="p">,</span> <span class="n">timestamp</span> <span class="ow">in</span> <span class="n">normal_transactions</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (from:Account {id: $from}), (to:Account {id: $to})
</span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE (from)-[:TRANSFER {
</span></span></span><span class="line"><span class="cl"><span class="s2"> amount: $amount,
</span></span></span><span class="line"><span class="cl"><span class="s2"> timestamp: $timestamp
</span></span></span><span class="line"><span class="cl"><span class="s2"> }]->(to)
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span><span class="s1">'from'</span><span class="p">:</span> <span class="n">from_id</span><span class="p">,</span> <span class="s1">'to'</span><span class="p">:</span> <span class="n">to_id</span><span class="p">,</span> <span class="s1">'amount'</span><span class="p">:</span> <span class="n">amount</span><span class="p">,</span> <span class="s1">'timestamp'</span><span class="p">:</span> <span class="n">timestamp</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Simulate suspicious circular transactions</span>
</span></span><span class="line"><span class="cl"> <span class="n">circular</span> <span class="o">=</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">1000</span><span class="p">,</span> <span class="s1">'2025-01-24T13:00:00Z'</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="mi">6</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">900</span><span class="p">,</span> <span class="s1">'2025-01-24T13:05:00Z'</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"> <span class="p">(</span><span class="mi">7</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">850</span><span class="p">,</span> <span class="s1">'2025-01-24T13:10:00Z'</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"> <span class="p">]</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">from_id</span><span class="p">,</span> <span class="n">to_id</span><span class="p">,</span> <span class="n">amount</span><span class="p">,</span> <span class="n">timestamp</span> <span class="ow">in</span> <span class="n">circular</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (from:Account {id: $from}), (to:Account {id: $to})
</span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE (from)-[:TRANSFER {
</span></span></span><span class="line"><span class="cl"><span class="s2"> amount: $amount,
</span></span></span><span class="line"><span class="cl"><span class="s2"> timestamp: $timestamp,
</span></span></span><span class="line"><span class="cl"><span class="s2"> flagged: false
</span></span></span><span class="line"><span class="cl"><span class="s2"> }]->(to)
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span><span class="s1">'from'</span><span class="p">:</span> <span class="n">from_id</span><span class="p">,</span> <span class="s1">'to'</span><span class="p">:</span> <span class="n">to_id</span><span class="p">,</span> <span class="s1">'amount'</span><span class="p">:</span> <span class="n">amount</span><span class="p">,</span> <span class="s1">'timestamp'</span><span class="p">:</span> <span class="n">timestamp</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">asyncio</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">create_transaction_network</span><span class="p">())</span>
</span></span></code></pre></div><p><strong>Step 2: Detect Circular Transactions</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">detect_circular_transactions</span><span class="p">(</span><span class="n">time_window_hours</span><span class="o">=</span><span class="mi">24</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Find circular money flows within time window."""</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">geode_client</span><span class="o">.</span><span class="n">open_database</span><span class="p">(</span><span class="s1">'quic://localhost:3141'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH path = (a1:Account)-[t1:TRANSFER]->(a2:Account)
</span></span></span><span class="line"><span class="cl"><span class="s2"> -[t2:TRANSFER]->(a3:Account)
</span></span></span><span class="line"><span class="cl"><span class="s2"> -[t3:TRANSFER]->(a1)
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE t1.timestamp > current_timestamp() - INTERVAL '$hours' HOUR
</span></span></span><span class="line"><span class="cl"><span class="s2"> AND t2.timestamp > t1.timestamp
</span></span></span><span class="line"><span class="cl"><span class="s2"> AND t3.timestamp > t2.timestamp
</span></span></span><span class="line"><span class="cl"><span class="s2"> AND t3.timestamp < t1.timestamp + INTERVAL '1' HOUR
</span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN a1.id AS account1,
</span></span></span><span class="line"><span class="cl"><span class="s2"> a2.id AS account2,
</span></span></span><span class="line"><span class="cl"><span class="s2"> a3.id AS account3,
</span></span></span><span class="line"><span class="cl"><span class="s2"> t1.amount + t2.amount + t3.amount AS total_amount,
</span></span></span><span class="line"><span class="cl"><span class="s2"> [t1.timestamp, t2.timestamp, t3.timestamp] AS timestamps
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span><span class="s1">'hours'</span><span class="p">:</span> <span class="n">time_window_hours</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">suspicious_patterns</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">suspicious_patterns</span><span class="o">.</span><span class="n">append</span><span class="p">({</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'accounts'</span><span class="p">:</span> <span class="p">[</span><span class="n">row</span><span class="p">[</span><span class="s1">'account1'</span><span class="p">],</span> <span class="n">row</span><span class="p">[</span><span class="s1">'account2'</span><span class="p">],</span> <span class="n">row</span><span class="p">[</span><span class="s1">'account3'</span><span class="p">]],</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'total_amount'</span><span class="p">:</span> <span class="n">row</span><span class="p">[</span><span class="s1">'total_amount'</span><span class="p">],</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'timestamps'</span><span class="p">:</span> <span class="n">row</span><span class="p">[</span><span class="s1">'timestamps'</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">suspicious_patterns</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Detect fraud</span>
</span></span><span class="line"><span class="cl"><span class="n">fraud_cases</span> <span class="o">=</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">detect_circular_transactions</span><span class="p">())</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="k">case</span> <span class="ow">in</span> <span class="n">fraud_cases</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Circular transaction detected: </span><span class="si">{</span><span class="n">case</span><span class="p">[</span><span class="s1">'accounts'</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">" Total amount: $</span><span class="si">{</span><span class="n">case</span><span class="p">[</span><span class="s1">'total_amount'</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">" Time span: </span><span class="si">{</span><span class="n">case</span><span class="p">[</span><span class="s1">'timestamps'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span><span class="si">}</span><span class="s2"> to </span><span class="si">{</span><span class="n">case</span><span class="p">[</span><span class="s1">'timestamps'</span><span class="p">][</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
</span></span></code></pre></div><p><strong>Step 3: Velocity Check Implementation</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">velocity_check</span><span class="p">(</span><span class="n">account_id</span><span class="p">,</span> <span class="n">threshold_multiplier</span><span class="o">=</span><span class="mi">5</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Detect accounts with unusual transaction velocity."""</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">geode_client</span><span class="o">.</span><span class="n">open_database</span><span class="p">(</span><span class="s1">'quic://localhost:3141'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (a:Account {id: $account_id})-[t:TRANSFER]->()
</span></span></span><span class="line"><span class="cl"><span class="s2"> WITH a,
</span></span></span><span class="line"><span class="cl"><span class="s2"> COUNT{(a)-[recent:TRANSFER]->()
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE recent.timestamp > current_timestamp() - INTERVAL '1' HOUR} AS recent_count,
</span></span></span><span class="line"><span class="cl"><span class="s2"> AVG(t.amount) AS historical_avg
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE recent_count > $threshold * historical_avg
</span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN a.id AS account_id,
</span></span></span><span class="line"><span class="cl"><span class="s2"> recent_count AS recent_transactions,
</span></span></span><span class="line"><span class="cl"><span class="s2"> historical_avg AS normal_rate
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span><span class="s1">'account_id'</span><span class="p">:</span> <span class="n">account_id</span><span class="p">,</span> <span class="s1">'threshold'</span><span class="p">:</span> <span class="n">threshold_multiplier</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="k">if</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span> <span class="k">else</span> <span class="kc">None</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Check specific account</span>
</span></span><span class="line"><span class="cl"><span class="n">alert</span> <span class="o">=</span> <span class="n">asyncio</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">velocity_check</span><span class="p">(</span><span class="mi">5</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="n">alert</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"⚠️ Velocity alert for account </span><span class="si">{</span><span class="n">alert</span><span class="p">[</span><span class="s1">'account_id'</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">" Recent transactions: </span><span class="si">{</span><span class="n">alert</span><span class="p">[</span><span class="s1">'recent_transactions'</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">" Normal rate: </span><span class="si">{</span><span class="n">alert</span><span class="p">[</span><span class="s1">'normal_rate'</span><span class="p">]</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
</span></span></code></pre></div><p><strong>Exercise</strong>: Implement a shared device detector that finds multiple accounts accessing from the same IP address or device ID.</p>
<h3 id="tutorial-videos-and-screencasts" class="position-relative d-flex align-items-center group">
<span>Tutorial Videos and Screencasts</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="tutorial-videos-and-screencasts"
aria-haspopup="dialog"
aria-label="Share link: Tutorial Videos and Screencasts">
<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>While primarily text-based, Geode tutorials benefit from visual demonstrations:</p>
<p><strong>Available Video Tutorials</strong>:</p>
<ol>
<li>“Getting Started with Geode” (15 minutes)</li>
<li>“Pattern Matching Deep Dive” (30 minutes)</li>
<li>“Building a Social Network” (45 minutes)</li>
<li>“Transaction Management Best Practices” (25 minutes)</li>
<li>“Performance Tuning and Profiling” (40 minutes)</li>
</ol>
<p>Access videos at: <code>https://geodedb.com/videos/</code></p>
<h3 id="troubleshooting-common-issues" class="position-relative d-flex align-items-center group">
<span>Troubleshooting Common Issues</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="troubleshooting-common-issues"
aria-haspopup="dialog"
aria-label="Share link: Troubleshooting Common Issues">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="connection-errors" class="position-relative d-flex align-items-center group">
<span>Connection Errors</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="connection-errors"
aria-haspopup="dialog"
aria-label="Share link: Connection Errors">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Problem</strong>: Cannot connect to Geode server</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">Error: connection refused at localhost:3141
</span></span></code></pre></div><p><strong>Solution</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 if server is running</span>
</span></span><span class="line"><span class="cl">ps aux <span class="p">|</span> grep geode
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Start server if not running</span>
</span></span><span class="line"><span class="cl">geode serve --listen 0.0.0.0:3141
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Check firewall rules</span>
</span></span><span class="line"><span class="cl">sudo ufw status
</span></span><span class="line"><span class="cl">sudo ufw allow 3141/tcp
</span></span></code></pre></div>
<h4 id="query-performance-issues" class="position-relative d-flex align-items-center group">
<span>Query Performance Issues</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="query-performance-issues"
aria-haspopup="dialog"
aria-label="Share link: Query Performance Issues">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Problem</strong>: Query taking too long</p>
<p><strong>Solution</strong>: Use PROFILE to identify bottlenecks</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">PROFILE</span><span class="w">
</span></span></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">FRIEND</span><span class="err">*</span><span class="py">2</span><span class="err">.</span><span class="mf">.3</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">friend</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">city</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">San</span><span class="w"> </span><span class="py">Francisco</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">friend</span><span class="err">.</span><span class="py">name</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Review</span><span class="w"> </span><span class="py">execution</span><span class="w"> </span><span class="py">plan</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">Look</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">full</span><span class="w"> </span><span class="py">scans</span><span class="w"> </span><span class="py">vs</span><span class="err">.</span><span class="w"> </span><span class="py">index</span><span class="w"> </span><span class="py">scans</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">Add</span><span class="w"> </span><span class="py">indexes</span><span class="w"> </span><span class="kd">on</span><span class="w"> </span><span class="py">frequently</span><span class="w"> </span><span class="py">filtered</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></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">user_city</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">city</span><span class="p">)</span><span class="err">;</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="memory-errors" class="position-relative d-flex align-items-center group">
<span>Memory Errors</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="memory-errors"
aria-haspopup="dialog"
aria-label="Share link: Memory Errors">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p><strong>Problem</strong>: Out of memory during large queries</p>
<p><strong>Solution</strong>: Use pagination and streaming</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">paginated_query</span><span class="p">(</span><span class="n">page_size</span><span class="o">=</span><span class="mi">1000</span><span class="p">):</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Process large result sets in chunks."""</span>
</span></span><span class="line"><span class="cl"> <span class="n">offset</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span> <span class="o">=</span> <span class="n">geode_client</span><span class="o">.</span><span class="n">open_database</span><span class="p">(</span><span class="s1">'quic://localhost:3141'</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (n:Node)
</span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN n
</span></span></span><span class="line"><span class="cl"><span class="s2"> ORDER BY n.id
</span></span></span><span class="line"><span class="cl"><span class="s2"> SKIP $offset
</span></span></span><span class="line"><span class="cl"><span class="s2"> LIMIT $limit
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span><span class="s1">'offset'</span><span class="p">:</span> <span class="n">offset</span><span class="p">,</span> <span class="s1">'limit'</span><span class="p">:</span> <span class="n">page_size</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">rows</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">rows</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">row</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="ow">not</span> <span class="n">rows</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">break</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Process chunk</span>
</span></span><span class="line"><span class="cl"> <span class="n">process_chunk</span><span class="p">(</span><span class="n">rows</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">offset</span> <span class="o">+=</span> <span class="n">page_size</span>
</span></span></code></pre></div>
<h3 id="tutorial-completion-checklist" class="position-relative d-flex align-items-center group">
<span>Tutorial Completion Checklist</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="tutorial-completion-checklist"
aria-haspopup="dialog"
aria-label="Share link: Tutorial Completion Checklist">
<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>After completing tutorials, verify your knowledge:</p>
<ul>
<li><input disabled="" type="checkbox"> Can create nodes and relationships</li>
<li><input disabled="" type="checkbox"> Understand pattern matching syntax</li>
<li><input disabled="" type="checkbox"> Can write WHERE clause filters</li>
<li><input disabled="" type="checkbox"> Know how to use aggregation functions</li>
<li><input disabled="" type="checkbox"> Understand transaction boundaries</li>
<li><input disabled="" type="checkbox"> Can create and use indexes</li>
<li><input disabled="" type="checkbox"> Able to profile and optimize queries</li>
<li><input disabled="" type="checkbox"> Familiar with at least one client library</li>
<li><input disabled="" type="checkbox"> Can implement basic graph algorithms</li>
<li><input disabled="" type="checkbox"> Understand security best practices</li>
</ul>
<h3 id="next-steps-after-tutorials" class="position-relative d-flex align-items-center group">
<span>Next Steps After Tutorials</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="next-steps-after-tutorials"
aria-haspopup="dialog"
aria-label="Share link: Next Steps After Tutorials">
<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>Build a small project</strong>: Apply knowledge to a real use case</li>
<li><strong>Read API documentation</strong>: Deep dive into specific features</li>
<li><strong>Join community</strong>: Share experiences and ask questions</li>
<li><strong>Contribute</strong>: Report bugs or contribute documentation</li>
<li><strong>Production deployment</strong>: Plan and execute production rollout</li>
</ol>
<h3 id="further-reading" class="position-relative d-flex align-items-center group">
<span>Further Reading</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="further-reading"
aria-haspopup="dialog"
aria-label="Share link: Further Reading">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ul>
<li><a
href="/docs/"
>Documentation Index</a>
- Complete documentation</li>
<li><a
href="/docs/api-reference/"
>API Reference</a>
- API documentation</li>
<li><a
href="/docs/gql-reference/"
>GQL Reference</a>
- Syntax reference</li>
<li><a
href="/docs/getting-started/"
>Getting Started</a>
- Get started with Geode</li>
<li><a
href="/docs/use-cases/"
>Use Cases</a>
- Sample applications and use cases</li>
<li><a
href="/docs/deployment/"
>Deployment</a>
- Going to production</li>
<li><a
href="/docs/performance/"
>Performance</a>
- Optimization techniques</li>
<li><a
href="/docs/security/"
>Security</a>
- Security configuration</li>
</ul>
Related Articles
Docs
7 min
Graph Query Language (GQL) Guide
Learn GQL in Geode with executable examples: MATCH patterns, variable-length paths, transactions, functions, and standards-compliance notes
Docs
4 min
Tutorials and Examples
Step-by-step tutorials for Geode: MATCH basics, indexing and EXPLAIN/PROFILE, graph algorithms, embeddings, and backup/restore workflows
Docs
9 min
GQL Tutorial
Step-by-step tutorial for learning Graph Query Language (GQL) from basics to advanced patterns in Geode
Docs
7 min
Tutorials
Hands-on tutorials for learning Geode covering MATCH patterns, REPL usage, transactions, indexing, and graph algorithms
Docs
7 min
REPL Interactive Shell Basics
Getting started with Geode's REPL interactive shell including meta commands, query execution, history navigation, and productivity features.