<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-15 --> <h2 id="hands-on-learning" class="position-relative d-flex align-items-center group"> <span>Hands-On Learning</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="hands-on-learning" aria-haspopup="dialog" aria-label="Share link: Hands-On Learning"> <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> </h2><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>Hands-on learning provides the fastest path to mastering Geode through practical exercises, interactive challenges, and real-world scenarios. Learn by building, not just reading.</p> <h3 id="interactive-learning-philosophy" class="position-relative d-flex align-items-center group"> <span>Interactive Learning Philosophy</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-learning-philosophy" aria-haspopup="dialog" aria-label="Share link: Interactive Learning Philosophy"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><p><strong>Active Engagement</strong>: Type every query yourself. Copy-paste teaches syntax; typing builds muscle memory and understanding.</p> <p><strong>Immediate Feedback</strong>: Execute queries and see results instantly. When something doesn&rsquo;t work, you learn why and how to fix it.</p> <p><strong>Progressive Challenges</strong>: Start simple and increase complexity gradually. Each exercise builds on previous knowledge while introducing new concepts.</p> <p><strong>Real-World Context</strong>: Work with realistic datasets and scenarios—social networks, e-commerce systems, knowledge graphs—not toy examples.</p> <h3 id="exercise-1-building-your-first-social-network-30-minutes" class="position-relative d-flex align-items-center group"> <span>Exercise 1: Building Your First Social Network (30 minutes)</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="exercise-1-building-your-first-social-network-30-minutes" aria-haspopup="dialog" aria-label="Share link: Exercise 1: Building Your First Social Network (30 minutes)"> <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="setup" class="position-relative d-flex align-items-center group"> <span>Setup</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="setup" aria-haspopup="dialog" aria-label="Share link: Setup"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Start Geode and connect</span> </span></span><span class="line"><span class="cl">geode serve --listen localhost:3141 <span class="p">&amp;</span> </span></span><span class="line"><span class="cl">geode shell </span></span></code></pre></div> <h4 id="task-11-create-user-profiles" class="position-relative d-flex align-items-center group"> <span>Task 1.1: Create User Profiles</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="task-11-create-user-profiles" aria-haspopup="dialog" aria-label="Share link: Task 1.1: Create User Profiles"> <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>Create 5 users with varying ages and locations:</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">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">&#39;</span><span class="nc">Alice</span><span class="err">&#39;</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">&#39;</span><span class="nc">New</span><span class="w"> </span><span class="py">York</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="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">&#39;</span><span class="nc">Bob</span><span class="err">&#39;</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">&#39;</span><span class="nc">San</span><span class="w"> </span><span class="py">Francisco</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="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">&#39;</span><span class="nc">Carol</span><span class="err">&#39;</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">&#39;</span><span class="nc">New</span><span class="w"> </span><span class="py">York</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">dave</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">&#39;</span><span class="nc">Dave</span><span class="err">&#39;</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">35</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">&#39;</span><span class="nc">Chicago</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">eve</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">&#39;</span><span class="nc">Eve</span><span class="err">&#39;</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">27</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">&#39;</span><span class="nc">San</span><span class="w"> </span><span class="py">Francisco</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span></code></pre></div><p><strong>Verification</strong>: Run <code>MATCH (p:Person) RETURN count(p)</code> - should return 5.</p> <h4 id="task-12-add-friendships" class="position-relative d-flex align-items-center group"> <span>Task 1.2: Add Friendships</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="task-12-add-friendships" aria-haspopup="dialog" aria-label="Share link: Task 1.2: Add Friendships"> <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>Create relationships between users:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">MATCH</span><span class="w"> </span><span class="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">&#39;</span><span class="nc">Alice</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</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">&#39;</span><span class="nc">Bob</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">alice</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">-&gt;</span><span class="p">(</span><span class="py">bob</span><span class="p">)</span><span class="w"> </span></span></span></code></pre></div><p><strong>Challenge</strong>: Add 6 more friendships forming a connected network. Make some bidirectional by creating relationships in both directions.</p> <h4 id="task-13-query-your-network" class="position-relative d-flex align-items-center group"> <span>Task 1.3: Query Your Network</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="task-13-query-your-network" aria-haspopup="dialog" aria-label="Share link: Task 1.3: Query Your Network"> <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>Find all of Alice&rsquo;s friends:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">MATCH</span><span class="w"> </span><span class="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">&#39;</span><span class="nc">Alice</span><span class="err">&#39;</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">-&gt;</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="w"> </span></span></span></code></pre></div><p><strong>Challenge Questions</strong>:</p> <ol> <li>Who lives in the same city as Alice?</li> <li>Who has the most friends?</li> <li>Find all friends-of-friends for Bob who aren&rsquo;t direct friends</li> </ol> <details> <summary>Solutions</summary> <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">Same</span><span class="w"> </span><span class="py">city</span><span class="w"> </span><span class="py">as</span><span class="w"> </span><span class="py">Alice</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">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">&#39;</span><span class="nc">Alice</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">other</span><span class="p">:</span><span class="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">city</span><span class="p">:</span><span class="w"> </span><span class="nc">alice</span><span class="err">.</span><span class="py">city</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">other</span><span class="w"> </span><span class="err">&lt;&gt;</span><span class="w"> </span><span class="py">alice</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">other</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">Most</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">p</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">KNOWS</span><span class="p">]</span><span class="err">-&gt;</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">p</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="py">friend</span><span class="p">)</span><span class="w"> </span><span class="py">as</span><span class="w"> </span><span class="py">friend_count</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">friend_count</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">1</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">Friends</span><span class="w"> </span><span class="py">of</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">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">&#39;</span><span class="nc">Bob</span><span class="err">&#39;</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">-&gt;</span><span class="p">(</span><span class="py">friend</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">-&gt;</span><span class="p">(</span><span class="py">fof</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">NOT</span><span class="w"> </span><span class="p">(</span><span class="py">bob</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">-&gt;</span><span class="p">(</span><span class="py">fof</span><span class="p">)</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">bob</span><span class="w"> </span><span class="err">&lt;&gt;</span><span class="w"> </span><span class="py">fof</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">DISTINCT</span><span class="w"> </span><span class="py">fof</span><span class="err">.</span><span class="py">name</span><span class="w"> </span></span></span></code></pre></div></details> <h3 id="exercise-2-e-commerce-recommendation-engine-45-minutes" class="position-relative d-flex align-items-center group"> <span>Exercise 2: E-Commerce Recommendation Engine (45 minutes)</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="exercise-2-e-commerce-recommendation-engine-45-minutes" aria-haspopup="dialog" aria-label="Share link: Exercise 2: E-Commerce Recommendation Engine (45 minutes)"> <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="setup-data" class="position-relative d-flex align-items-center group"> <span>Setup Data</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="setup-data" aria-haspopup="dialog" aria-label="Share link: Setup Data"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">products</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">laptop</span><span class="p">:</span><span class="nc">Product</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">p1</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Laptop</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">price</span><span class="p">:</span><span class="w"> </span><span class="nc">999</span><span class="p">,</span><span class="w"> </span><span class="py">category</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Electronics</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">mouse</span><span class="p">:</span><span class="nc">Product</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">p2</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Mouse</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">price</span><span class="p">:</span><span class="w"> </span><span class="nc">29</span><span class="p">,</span><span class="w"> </span><span class="py">category</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Electronics</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">keyboard</span><span class="p">:</span><span class="nc">Product</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">p3</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Keyboard</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">price</span><span class="p">:</span><span class="w"> </span><span class="nc">79</span><span class="p">,</span><span class="w"> </span><span class="py">category</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Electronics</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">desk</span><span class="p">:</span><span class="nc">Product</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">p4</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Desk</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">price</span><span class="p">:</span><span class="w"> </span><span class="nc">299</span><span class="p">,</span><span class="w"> </span><span class="py">category</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Furniture</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">chair</span><span class="p">:</span><span class="nc">Product</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">p5</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Chair</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">price</span><span class="p">:</span><span class="w"> </span><span class="nc">199</span><span class="p">,</span><span class="w"> </span><span class="py">category</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Furniture</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">users</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">u1</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">u1</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Alice</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">u2</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">u2</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Bob</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">u3</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">u3</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Carol</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Purchase</span><span class="w"> </span><span class="py">history</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">u1</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">u1</span><span class="err">&#39;</span><span class="p">}),</span><span class="w"> </span><span class="p">(</span><span class="py">laptop</span><span class="p">:</span><span class="nc">Product</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">p1</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">u1</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">PURCHASED</span><span class="w"> </span><span class="p">{</span><span class="py">at</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">2025</span><span class="err">-</span><span class="py">01</span><span class="err">-</span><span class="py">01</span><span class="err">&#39;</span><span class="p">}]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">laptop</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u1</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">u1</span><span class="err">&#39;</span><span class="p">}),</span><span class="w"> </span><span class="p">(</span><span class="py">mouse</span><span class="p">:</span><span class="nc">Product</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">p2</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">u1</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">PURCHASED</span><span class="w"> </span><span class="p">{</span><span class="py">at</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">2025</span><span class="err">-</span><span class="py">01</span><span class="err">-</span><span class="py">02</span><span class="err">&#39;</span><span class="p">}]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">mouse</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u2</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">u2</span><span class="err">&#39;</span><span class="p">}),</span><span class="w"> </span><span class="p">(</span><span class="py">laptop</span><span class="p">:</span><span class="nc">Product</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">p1</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">u2</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">PURCHASED</span><span class="w"> </span><span class="p">{</span><span class="py">at</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">2025</span><span class="err">-</span><span class="py">01</span><span class="err">-</span><span class="py">03</span><span class="err">&#39;</span><span class="p">}]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">laptop</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u2</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">u2</span><span class="err">&#39;</span><span class="p">}),</span><span class="w"> </span><span class="p">(</span><span class="py">keyboard</span><span class="p">:</span><span class="nc">Product</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">p3</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">u2</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">PURCHASED</span><span class="w"> </span><span class="p">{</span><span class="py">at</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">2025</span><span class="err">-</span><span class="py">01</span><span class="err">-</span><span class="py">04</span><span class="err">&#39;</span><span class="p">}]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">keyboard</span><span class="p">)</span><span class="w"> </span></span></span></code></pre></div> <h4 id="task-21-basic-recommendations" class="position-relative d-flex align-items-center group"> <span>Task 2.1: Basic Recommendations</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="task-21-basic-recommendations" aria-haspopup="dialog" aria-label="Share link: Task 2.1: Basic Recommendations"> <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>Write a query that recommends products to Alice based on what users with similar purchases bought:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">alice</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">u1</span><span class="err">&#39;</span><span class="p">})</span><span class="err">-</span><span class="p">[:</span><span class="nc">PURCHASED</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">&lt;-</span><span class="p">[:</span><span class="nc">PURCHASED</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">other</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">PURCHASED</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">rec</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="p">(</span><span class="py">alice</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">PURCHASED</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">rec</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">rec</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">rec</span><span class="err">.</span><span class="py">price</span><span class="p">,</span><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="err">*</span><span class="p">)</span><span class="w"> </span><span class="py">as</span><span class="w"> </span><span class="py">relevance</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">relevance</span><span class="w"> </span><span class="py">DESC</span><span class="p">,</span><span class="w"> </span><span class="py">rec</span><span class="err">.</span><span class="py">price</span><span class="w"> </span><span class="py">ASC</span><span class="w"> </span></span></span></code></pre></div><p><strong>Challenge</strong>: Modify to only recommend products under $100 in the Electronics category.</p> <h4 id="task-22-product-similarity" class="position-relative d-flex align-items-center group"> <span>Task 2.2: Product Similarity</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="task-22-product-similarity" aria-haspopup="dialog" aria-label="Share link: Task 2.2: Product Similarity"> <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>Create similarity relationships between products:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p1</span><span class="p">:</span><span class="nc">Product</span><span class="p">),</span><span class="w"> </span><span class="p">(</span><span class="py">p2</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">p1</span><span class="err">.</span><span class="py">category</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">p2</span><span class="err">.</span><span class="py">category</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">p1</span><span class="w"> </span><span class="err">&lt;&gt;</span><span class="w"> </span><span class="py">p2</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">p1</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">SIMILAR_TO</span><span class="w"> </span><span class="p">{</span><span class="py">reason</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">same_category</span><span class="err">&#39;</span><span class="p">}]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">p2</span><span class="p">)</span><span class="w"> </span></span></span></code></pre></div><p><strong>Challenge</strong>: Create a query that recommends &ldquo;frequently bought together&rdquo; products based on users who bought both.</p> <h4 id="task-23-category-browsing" class="position-relative d-flex align-items-center group"> <span>Task 2.3: Category Browsing</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="task-23-category-browsing" aria-haspopup="dialog" aria-label="Share link: Task 2.3: Category Browsing"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="w"> </span><span class="p">{</span><span class="py">category</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Electronics</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">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">price</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">p</span><span class="err">.</span><span class="py">price</span><span class="w"> </span><span class="py">DESC</span><span class="w"> </span></span></span></code></pre></div><p><strong>Challenge</strong>: Add pagination (SKIP/LIMIT) and price range filtering.</p> <h3 id="exercise-3-knowledge-graph-navigation-45-minutes" class="position-relative d-flex align-items-center group"> <span>Exercise 3: Knowledge Graph Navigation (45 minutes)</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="exercise-3-knowledge-graph-navigation-45-minutes" aria-haspopup="dialog" aria-label="Share link: Exercise 3: Knowledge Graph Navigation (45 minutes)"> <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="setup-hierarchical-data" class="position-relative d-flex align-items-center group"> <span>Setup Hierarchical Data</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="setup-hierarchical-data" aria-haspopup="dialog" aria-label="Share link: Setup Hierarchical Data"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">topic</span><span class="w"> </span><span class="py">hierarchy</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">root</span><span class="p">:</span><span class="nc">Topic</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Computer</span><span class="w"> </span><span class="py">Science</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">ai</span><span class="p">:</span><span class="nc">Topic</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Artificial</span><span class="w"> </span><span class="py">Intelligence</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">ml</span><span class="p">:</span><span class="nc">Topic</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Machine</span><span class="w"> </span><span class="py">Learning</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">dl</span><span class="p">:</span><span class="nc">Topic</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Deep</span><span class="w"> </span><span class="py">Learning</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">cv</span><span class="p">:</span><span class="nc">Topic</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Computer</span><span class="w"> </span><span class="py">Vision</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">nlp</span><span class="p">:</span><span class="nc">Topic</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Natural</span><span class="w"> </span><span class="py">Language</span><span class="w"> </span><span class="py">Processing</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">hierarchy</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">root</span><span class="p">:</span><span class="nc">Topic</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Computer</span><span class="w"> </span><span class="py">Science</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">ai</span><span class="p">:</span><span class="nc">Topic</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Artificial</span><span class="w"> </span><span class="py">Intelligence</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">ai</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">SUBTOPIC_OF</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">root</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">ai</span><span class="p">:</span><span class="nc">Topic</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Artificial</span><span class="w"> </span><span class="py">Intelligence</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">ml</span><span class="p">:</span><span class="nc">Topic</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Machine</span><span class="w"> </span><span class="py">Learning</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">ml</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">SUBTOPIC_OF</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">ai</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">ml</span><span class="p">:</span><span class="nc">Topic</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Machine</span><span class="w"> </span><span class="py">Learning</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">dl</span><span class="p">:</span><span class="nc">Topic</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Deep</span><span class="w"> </span><span class="py">Learning</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">dl</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">SUBTOPIC_OF</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">ml</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Add</span><span class="w"> </span><span class="py">more</span><span class="w"> </span><span class="py">connections</span><span class="kd">...</span><span class="w"> </span></span></span></code></pre></div> <h4 id="task-31-tree-traversal" class="position-relative d-flex align-items-center group"> <span>Task 3.1: Tree Traversal</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="task-31-tree-traversal" aria-haspopup="dialog" aria-label="Share link: Task 3.1: Tree Traversal"> <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>Find all subtopics of a topic at any depth:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">parent</span><span class="p">:</span><span class="nc">Topic</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Artificial</span><span class="w"> </span><span class="py">Intelligence</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">&lt;-</span><span class="p">[:</span><span class="nc">SUBTOPIC_OF</span><span class="err">*</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">child</span><span class="p">:</span><span class="nc">Topic</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">child</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">length</span><span class="p">(</span><span class="py">path</span><span class="p">)</span><span class="w"> </span><span class="py">as</span><span class="w"> </span><span class="py">depth</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">depth</span><span class="p">,</span><span class="w"> </span><span class="py">child</span><span class="err">.</span><span class="py">name</span><span class="w"> </span></span></span></code></pre></div><p><strong>Challenge</strong>: Find the path from &lsquo;Deep Learning&rsquo; to &lsquo;Computer Science&rsquo; and list all intermediate topics.</p> <h4 id="task-32-related-concepts" class="position-relative d-flex align-items-center group"> <span>Task 3.2: Related Concepts</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="task-32-related-concepts" aria-haspopup="dialog" aria-label="Share link: Task 3.2: Related Concepts"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>Add cross-cutting relationships:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">cv</span><span class="p">:</span><span class="nc">Topic</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Computer</span><span class="w"> </span><span class="py">Vision</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">dl</span><span class="p">:</span><span class="nc">Topic</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Deep</span><span class="w"> </span><span class="py">Learning</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">cv</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">RELATED_TO</span><span class="w"> </span><span class="p">{</span><span class="py">strength</span><span class="p">:</span><span class="w"> </span><span class="nc">0</span><span class="mf">.9</span><span class="p">}]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">dl</span><span class="p">)</span><span class="w"> </span></span></span></code></pre></div><p><strong>Challenge</strong>: Find all topics within 2 hops of &lsquo;Natural Language Processing&rsquo; (ignoring hierarchy).</p> <h3 id="exercise-4-access-control-with-row-level-security-30-minutes" class="position-relative d-flex align-items-center group"> <span>Exercise 4: Access Control with Row-Level Security (30 minutes)</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="exercise-4-access-control-with-row-level-security-30-minutes" aria-haspopup="dialog" aria-label="Share link: Exercise 4: Access Control with Row-Level Security (30 minutes)"> <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="task-41-multi-tenant-data" class="position-relative d-flex align-items-center group"> <span>Task 4.1: Multi-Tenant Data</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="task-41-multi-tenant-data" aria-haspopup="dialog" aria-label="Share link: Task 4.1: Multi-Tenant Data"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">organizations</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">orgA</span><span class="p">:</span><span class="nc">Organization</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">org1</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Acme</span><span class="w"> </span><span class="py">Corp</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">orgB</span><span class="p">:</span><span class="nc">Organization</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">org2</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">TechStart</span><span class="w"> </span><span class="py">Inc</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">users</span><span class="w"> </span><span class="py">belonging</span><span class="w"> </span><span class="py">to</span><span class="w"> </span><span class="py">organizations</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">u1</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">u1</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Alice</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">org_id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">org1</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">u2</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">u2</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Bob</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">org_id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">org1</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">u3</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">u3</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Carol</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">org_id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">org2</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Link</span><span class="w"> </span><span class="py">users</span><span class="w"> </span><span class="py">to</span><span class="w"> </span><span class="py">organizations</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">u1</span><span class="err">&#39;</span><span class="p">}),</span><span class="w"> </span><span class="p">(</span><span class="py">org</span><span class="p">:</span><span class="nc">Organization</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">org1</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">BELONGS_TO</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">org</span><span class="p">)</span><span class="w"> </span></span></span></code></pre></div> <h4 id="task-42-filtered-queries" class="position-relative d-flex align-items-center group"> <span>Task 4.2: Filtered Queries</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="task-42-filtered-queries" aria-haspopup="dialog" aria-label="Share link: Task 4.2: Filtered Queries"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>Write a query that only returns users from Alice&rsquo;s organization:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">current</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">u1</span><span class="err">&#39;</span><span class="p">})</span><span class="err">-</span><span class="p">[:</span><span class="nc">BELONGS_TO</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">org</span><span class="p">:</span><span class="nc">Organization</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">coworker</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">BELONGS_TO</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">org</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">coworker</span><span class="w"> </span><span class="err">&lt;&gt;</span><span class="w"> </span><span class="py">current</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">coworker</span><span class="err">.</span><span class="py">name</span><span class="w"> </span></span></span></code></pre></div><p><strong>Challenge</strong>: Create a view or parameterized query that automatically filters based on the current user&rsquo;s organization.</p> <h3 id="exercise-5-performance-optimization-45-minutes" class="position-relative d-flex align-items-center group"> <span>Exercise 5: Performance Optimization (45 minutes)</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="exercise-5-performance-optimization-45-minutes" aria-haspopup="dialog" aria-label="Share link: Exercise 5: Performance Optimization (45 minutes)"> <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="task-51-create-sample-data" class="position-relative d-flex align-items-center group"> <span>Task 5.1: Create Sample Data</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="task-51-create-sample-data" aria-haspopup="dialog" aria-label="Share link: Task 5.1: Create Sample Data"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">import</span> <span class="nn">asyncio</span> </span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">geode_client</span> <span class="kn">import</span> <span class="n">Client</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">load_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">Client</span><span class="p">(</span><span class="n">host</span><span class="o">=</span><span class="s2">&#34;localhost&#34;</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">3141</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="c1"># Create 1000 users</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">1000</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE (u:User { </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"> name: $name, </span></span></span><span class="line"><span class="cl"><span class="s2"> email: $email, </span></span></span><span class="line"><span class="cl"><span class="s2"> created_at: $timestamp </span></span></span><span class="line"><span class="cl"><span class="s2"> }) </span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="sa">f</span><span class="s2">&#34;user</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="sa">f</span><span class="s2">&#34;User </span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">email</span><span class="o">=</span><span class="sa">f</span><span class="s2">&#34;user</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s2">@example.com&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">timestamp</span><span class="o">=</span><span class="s2">&#34;2025-01-01T00:00:00Z&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">asyncio</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">load_data</span><span class="p">())</span> </span></span></code></pre></div> <h4 id="task-52-profile-slow-query" class="position-relative d-flex align-items-center group"> <span>Task 5.2: Profile Slow Query</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="task-52-profile-slow-query" aria-haspopup="dialog" aria-label="Share link: Task 5.2: Profile Slow Query"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Run</span><span class="w"> </span><span class="py">this</span><span class="w"> </span><span class="kd">query</span><span class="w"> </span><span class="nc">and</span><span class="w"> </span><span class="py">note</span><span class="w"> </span><span class="py">the</span><span class="w"> </span><span class="py">execution</span><span class="w"> </span><span class="py">time</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">PROFILE</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">email</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">user500</span><span class="nd">@example</span><span class="err">.</span><span class="py">com</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">created_at</span><span class="w"> </span></span></span></code></pre></div><p><strong>Challenge</strong>: Create an index on email and compare execution time:</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">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">User</span><span class="p">(</span><span class="py">email</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Re</span><span class="err">-</span><span class="py">run</span><span class="w"> </span><span class="py">the</span><span class="w"> </span><span class="py">profile</span><span class="w"> </span><span class="kd">query</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">PROFILE</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">email</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">user500</span><span class="nd">@example</span><span class="err">.</span><span class="py">com</span><span class="err">&#39;</span><span class="p">})</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">created_at</span><span class="w"> </span></span></span></code></pre></div> <h4 id="task-53-identify-cartesian-products" class="position-relative d-flex align-items-center group"> <span>Task 5.3: Identify Cartesian Products</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="task-53-identify-cartesian-products" aria-haspopup="dialog" aria-label="Share link: Task 5.3: Identify Cartesian Products"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">This</span><span class="w"> </span><span class="kd">query</span><span class="w"> </span><span class="nc">is</span><span class="w"> </span><span class="py">inefficient</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="py">why</span><span class="err">?</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">),</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">count</span><span class="p">(</span><span class="err">*</span><span class="p">)</span><span class="w"> </span></span></span></code></pre></div><p><strong>Challenge</strong>: Rewrite using proper relationship patterns.</p> <h3 id="exercise-6-transaction-management-30-minutes" class="position-relative d-flex align-items-center group"> <span>Exercise 6: Transaction Management (30 minutes)</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="exercise-6-transaction-management-30-minutes" aria-haspopup="dialog" aria-label="Share link: Exercise 6: Transaction Management (30 minutes)"> <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="task-61-banking-transfer" class="position-relative d-flex align-items-center group"> <span>Task 6.1: Banking Transfer</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="task-61-banking-transfer" aria-haspopup="dialog" aria-label="Share link: Task 6.1: Banking Transfer"> <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>Implement an atomic money transfer:</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">transfer</span><span class="p">(</span><span class="n">client</span><span class="p">,</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></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">tx</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">tx</span><span class="o">.</span><span class="n">begin</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> <span class="c1"># Check sender balance</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">tx</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">&#34;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (sender:Account {id: $id}) </span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN sender.balance </span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="n">from_id</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="n">row</span> <span class="o">=</span> <span class="k">await</span> <span class="n">result</span><span class="o">.</span><span class="n">first</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="n">row</span><span class="p">[</span><span class="s1">&#39;sender.balance&#39;</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">amount</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">raise</span> <span class="ne">Exception</span><span class="p">(</span><span class="s2">&#34;Insufficient funds&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1"># Deduct from sender</span> </span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">tx</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (sender:Account {id: $id}) </span></span></span><span class="line"><span class="cl"><span class="s2"> SET sender.balance = sender.balance - $amount </span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="n">from_id</span><span class="p">,</span> <span class="n">amount</span><span class="o">=</span><span class="n">amount</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1"># Add to receiver</span> </span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">tx</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (receiver:Account {id: $id}) </span></span></span><span class="line"><span class="cl"><span class="s2"> SET receiver.balance = receiver.balance + $amount </span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="n">to_id</span><span class="p">,</span> <span class="n">amount</span><span class="o">=</span><span class="n">amount</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1"># Transaction commits automatically if no exceptions</span> </span></span></code></pre></div><p><strong>Challenge</strong>: Add rollback handling for various failure scenarios.</p> <h4 id="task-62-savepoints" class="position-relative d-flex align-items-center group"> <span>Task 6.2: Savepoints</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="task-62-savepoints" aria-haspopup="dialog" aria-label="Share link: Task 6.2: Savepoints"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">complex_operation</span><span class="p">(</span><span class="n">client</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="k">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">tx</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">tx</span><span class="o">.</span><span class="n">begin</span><span class="p">()</span> </span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">tx</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;CREATE (u:User {id: &#39;temp1&#39;, name: &#39;Test&#39;})&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="n">sp</span> <span class="o">=</span> <span class="k">await</span> <span class="n">tx</span><span class="o">.</span><span class="n">savepoint</span><span class="p">(</span><span class="s2">&#34;checkpoint&#34;</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="k">try</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="c1"># Risky operation</span> </span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">tx</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;CREATE (u:User {id: &#39;temp1&#39;})&#34;</span><span class="p">)</span> <span class="c1"># Duplicate!</span> </span></span><span class="line"><span class="cl"> <span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">tx</span><span class="o">.</span><span class="n">rollback_to</span><span class="p">(</span><span class="n">sp</span><span class="p">)</span> <span class="c1"># Rollback to savepoint</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">tx</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">&#34;CREATE (u:User {id: &#39;temp2&#39;})&#34;</span><span class="p">)</span> </span></span></code></pre></div><p><strong>Challenge</strong>: Implement a multi-step import process with savepoints after each batch.</p> <h3 id="hands-on-challenges" class="position-relative d-flex align-items-center group"> <span>Hands-On Challenges</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="hands-on-challenges" aria-haspopup="dialog" aria-label="Share link: Hands-On Challenges"> <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="challenge-1-shortest-path" class="position-relative d-flex align-items-center group"> <span>Challenge 1: Shortest Path</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="challenge-1-shortest-path" aria-haspopup="dialog" aria-label="Share link: Challenge 1: Shortest Path"> <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>Find the shortest path between any two nodes in your social network. Calculate the degrees of separation.</p> <h4 id="challenge-2-influence-scoring" class="position-relative d-flex align-items-center group"> <span>Challenge 2: Influence Scoring</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="challenge-2-influence-scoring" aria-haspopup="dialog" aria-label="Share link: Challenge 2: Influence Scoring"> <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>Implement a query that calculates influence scores based on connection count and friend influence (recursive).</p> <h4 id="challenge-3-real-time-feeds" class="position-relative d-flex align-items-center group"> <span>Challenge 3: Real-Time Feeds</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="challenge-3-real-time-feeds" aria-haspopup="dialog" aria-label="Share link: Challenge 3: Real-Time Feeds"> <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>Build a query that returns the latest posts from friends, ordered by timestamp with pagination.</p> <h4 id="challenge-4-fraud-detection" class="position-relative d-flex align-items-center group"> <span>Challenge 4: 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="challenge-4-fraud-detection" aria-haspopup="dialog" aria-label="Share link: Challenge 4: 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>Create a graph of financial transactions and write queries to detect suspicious patterns (circular transfers, velocity rules).</p> <h4 id="challenge-5-recommendation-diversity" class="position-relative d-flex align-items-center group"> <span>Challenge 5: Recommendation Diversity</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="challenge-5-recommendation-diversity" aria-haspopup="dialog" aria-label="Share link: Challenge 5: Recommendation Diversity"> <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>Modify the recommendation engine to balance relevance with diversity (different categories, price ranges).</p> <h3 id="learning-labs" class="position-relative d-flex align-items-center group"> <span>Learning Labs</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-labs" aria-haspopup="dialog" aria-label="Share link: Learning Labs"> <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="lab-1-schema-design-workshop" class="position-relative d-flex align-items-center group"> <span>Lab 1: Schema Design Workshop</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="lab-1-schema-design-workshop" aria-haspopup="dialog" aria-label="Share link: Lab 1: Schema Design Workshop"> <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>Given a business domain (e.g., healthcare, logistics, media), design a complete graph schema. Create sample data and write 10 queries covering common use cases.</p> <h4 id="lab-2-migration-project" class="position-relative d-flex align-items-center group"> <span>Lab 2: Migration Project</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="lab-2-migration-project" aria-haspopup="dialog" aria-label="Share link: Lab 2: Migration Project"> <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>Take an existing relational database schema and migrate it to Geode. Write queries that demonstrate improved performance for relationship-heavy queries.</p> <h4 id="lab-3-performance-tuning" class="position-relative d-flex align-items-center group"> <span>Lab 3: Performance Tuning</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="lab-3-performance-tuning" aria-haspopup="dialog" aria-label="Share link: Lab 3: Performance Tuning"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>Start with slow queries, profile them, add indexes strategically, and measure improvements. Document your optimization process.</p> <h4 id="lab-4-security-hardening" class="position-relative d-flex align-items-center group"> <span>Lab 4: Security Hardening</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="lab-4-security-hardening" aria-haspopup="dialog" aria-label="Share link: Lab 4: Security Hardening"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>Implement a complete security model with authentication, role-based access, and row-level security for a multi-tenant application.</p> <h3 id="challenge-solutions-and-hints" class="position-relative d-flex align-items-center group"> <span>Challenge Solutions and Hints</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="challenge-solutions-and-hints" aria-haspopup="dialog" aria-label="Share link: Challenge Solutions and Hints"> <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="shortest-path-challenge-solution" class="position-relative d-flex align-items-center group"> <span>Shortest Path Challenge Solution</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="shortest-path-challenge-solution" aria-haspopup="dialog" aria-label="Share link: Shortest Path Challenge Solution"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Find</span><span class="w"> </span><span class="py">degrees</span><span class="w"> </span><span class="py">of</span><span class="w"> </span><span class="py">separation</span><span class="w"> </span><span class="py">between</span><span class="w"> </span><span class="py">any</span><span class="w"> </span><span class="py">two</span><span class="w"> </span><span class="py">users</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="py">path</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">SHORTEST_PATH</span><span class="p">((</span><span class="py">a</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Alice</span><span class="err">&#39;</span><span class="p">})</span><span class="err">-</span><span class="p">[:</span><span class="nc">KNOWS</span><span class="err">*</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">b</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Eve</span><span class="err">&#39;</span><span class="p">}))</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">length</span><span class="p">(</span><span class="py">path</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">degrees_of_separation</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">[</span><span class="py">node</span><span class="w"> </span><span class="py">IN</span><span class="w"> </span><span class="py">nodes</span><span class="p">(</span><span class="py">path</span><span class="p">)</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="py">node</span><span class="err">.</span><span class="py">name</span><span class="p">]</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">path_names</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Find</span><span class="w"> </span><span class="py">all</span><span class="w"> </span><span class="py">paths</span><span class="w"> </span><span class="py">within</span><span class="w"> </span><span class="py">certain</span><span class="w"> </span><span class="py">degree</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="py">path</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Alice</span><span class="err">&#39;</span><span class="p">})</span><span class="err">-</span><span class="p">[:</span><span class="nc">KNOWS</span><span class="err">*</span><span class="py">1</span><span class="err">.</span><span class="mf">.3</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">b</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">a</span><span class="w"> </span><span class="err">&lt;&gt;</span><span class="w"> </span><span class="py">b</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">b</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">length</span><span class="p">(</span><span class="py">path</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">degree</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">degree</span><span class="p">,</span><span class="w"> </span><span class="py">b</span><span class="err">.</span><span class="py">name</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div> <h4 id="influence-scoring-challenge-solution" class="position-relative d-flex align-items-center group"> <span>Influence Scoring Challenge Solution</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="influence-scoring-challenge-solution" aria-haspopup="dialog" aria-label="Share link: Influence Scoring Challenge Solution"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Calculate</span><span class="w"> </span><span class="py">PageRank</span><span class="err">-</span><span class="py">style</span><span class="w"> </span><span class="py">influence</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WITH</span><span class="w"> </span><span class="py">collect</span><span class="p">(</span><span class="py">DISTINCT</span><span class="w"> </span><span class="py">n</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">all_users</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">UNWIND</span><span class="w"> </span><span class="py">all_users</span><span class="w"> </span><span class="py">AS</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="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">user</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">OPTIONAL</span><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="err">-</span><span class="p">[:</span><span class="nc">KNOWS</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">friend</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WITH</span><span class="w"> </span><span class="py">user</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="py">friend</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">direct_influence</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">COLLECT</span><span class="p">(</span><span class="py">friend</span><span class="p">)</span><span class="w"> </span><span class="py">AS</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">UNWIND</span><span class="w"> </span><span class="py">friends</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">friend</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">OPTIONAL</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">friend</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">-&gt;</span><span class="p">(</span><span class="py">fof</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WITH</span><span class="w"> </span><span class="py">user</span><span class="p">,</span><span class="w"> </span><span class="py">direct_influence</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">AVG</span><span class="p">(</span><span class="py">COUNT</span><span class="p">(</span><span class="py">fof</span><span class="p">))</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">avg_friend_influence</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">user</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">direct_influence</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">avg_friend_influence</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">direct_influence</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="p">(</span><span class="py">avg_friend_influence</span><span class="w"> </span><span class="err">*</span><span class="w"> </span><span class="py">0</span><span class="mf">.5</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">total_influence</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">total_influence</span><span class="w"> </span><span class="py">DESC</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div> <h4 id="real-time-feed-challenge-solution" class="position-relative d-flex align-items-center group"> <span>Real-Time Feed Challenge Solution</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="real-time-feed-challenge-solution" aria-haspopup="dialog" aria-label="Share link: Real-Time Feed Challenge Solution"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Latest</span><span class="w"> </span><span class="py">posts</span><span class="w"> </span><span class="py">from</span><span class="w"> </span><span class="py">friends</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">pagination</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">current</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nv">$user_id</span><span class="p">})</span><span class="err">-</span><span class="p">[:</span><span class="nc">FOLLOWS</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="nc">friend</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">POSTED</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">post</span><span class="p">:</span><span class="nc">Post</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></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">post</span><span class="err">.</span><span class="py">content</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">post</span><span class="err">.</span><span class="py">timestamp</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">post</span><span class="err">.</span><span class="py">likes_count</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">post</span><span class="err">.</span><span class="py">timestamp</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">SKIP</span><span class="w"> </span><span class="nv">$offset</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="nv">$page_size</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">With</span><span class="w"> </span><span class="py">comment</span><span class="w"> </span><span class="py">count</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">current</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nv">$user_id</span><span class="p">})</span><span class="err">-</span><span class="p">[:</span><span class="nc">FOLLOWS</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="nc">friend</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">POSTED</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">post</span><span class="p">:</span><span class="nc">Post</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">OPTIONAL</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">post</span><span class="p">)</span><span class="err">&lt;-</span><span class="p">[:</span><span class="nc">COMMENTED</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">comment</span><span class="p">:</span><span class="nc">Comment</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WITH</span><span class="w"> </span><span class="py">friend</span><span class="p">,</span><span class="w"> </span><span class="py">post</span><span class="p">,</span><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="py">comment</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">comment_count</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></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">post</span><span class="err">.</span><span class="py">content</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">post</span><span class="err">.</span><span class="py">timestamp</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">post</span><span class="err">.</span><span class="py">likes_count</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">comment_count</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">post</span><span class="err">.</span><span class="py">timestamp</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">SKIP</span><span class="w"> </span><span class="nv">$offset</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="nv">$page_size</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div> <h4 id="fraud-detection-challenge-solution" class="position-relative d-flex align-items-center group"> <span>Fraud Detection Challenge Solution</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="fraud-detection-challenge-solution" aria-haspopup="dialog" aria-label="Share link: Fraud Detection Challenge Solution"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="err">--</span><span class="w"> </span><span class="py">Detect</span><span class="w"> </span><span class="py">circular</span><span class="w"> </span><span class="py">payment</span><span class="w"> </span><span class="py">patterns</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="py">path</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">:</span><span class="nc">Account</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">PAYMENT</span><span class="err">*</span><span class="py">3</span><span class="err">.</span><span class="mf">.5</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">a</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">ALL</span><span class="p">(</span><span class="py">r</span><span class="w"> </span><span class="py">IN</span><span class="w"> </span><span class="py">relationships</span><span class="p">(</span><span class="py">path</span><span class="p">)</span><span class="w"> </span><span class="py">WHERE</span><span class="w"> </span><span class="py">r</span><span class="err">.</span><span class="py">amount</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">1000</span><span class="p">)</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">ALL</span><span class="p">(</span><span class="py">n</span><span class="w"> </span><span class="py">IN</span><span class="w"> </span><span class="py">nodes</span><span class="p">(</span><span class="py">path</span><span class="p">)</span><span class="w"> </span><span class="py">WHERE</span><span class="w"> </span><span class="py">SIZE</span><span class="p">([(</span><span class="py">n</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">PAYMENT</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">()</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="py">1</span><span class="p">])</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">5</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">path</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">[</span><span class="py">r</span><span class="w"> </span><span class="py">IN</span><span class="w"> </span><span class="py">relationships</span><span class="p">(</span><span class="py">path</span><span class="p">)</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="py">r</span><span class="err">.</span><span class="py">amount</span><span class="p">]</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">amounts</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">REDUCE</span><span class="p">(</span><span class="py">total</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">0</span><span class="p">,</span><span class="w"> </span><span class="py">r</span><span class="w"> </span><span class="py">IN</span><span class="w"> </span><span class="py">relationships</span><span class="p">(</span><span class="py">path</span><span class="p">)</span><span class="w"> </span><span class="p">|</span><span class="w"> </span><span class="py">total</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="py">r</span><span class="err">.</span><span class="py">amount</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">total_amount</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Velocity</span><span class="w"> </span><span class="py">check</span><span class="p">:</span><span class="w"> </span><span class="nc">Too</span><span class="w"> </span><span class="py">many</span><span class="w"> </span><span class="py">transactions</span><span class="w"> </span><span class="py">in</span><span class="w"> </span><span class="py">short</span><span class="w"> </span><span class="py">time</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">:</span><span class="nc">Account</span><span class="p">)</span><span class="err">-</span><span class="p">[</span><span class="py">t</span><span class="p">:</span><span class="nc">PAYMENT</span><span class="p">]</span><span class="err">-&gt;</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">t</span><span class="err">.</span><span class="py">timestamp</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">CURRENT_TIMESTAMP</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="py">INTERVAL</span><span class="w"> </span><span class="err">&#39;</span><span class="py">1</span><span class="err">&#39;</span><span class="w"> </span><span class="py">HOUR</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WITH</span><span class="w"> </span><span class="py">a</span><span class="p">,</span><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="py">t</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">tx_count</span><span class="p">,</span><span class="w"> </span><span class="py">SUM</span><span class="p">(</span><span class="py">t</span><span class="err">.</span><span class="py">amount</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">total_amount</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">tx_count</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">10</span><span class="w"> </span><span class="py">OR</span><span class="w"> </span><span class="py">total_amount</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">50000</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">id</span><span class="p">,</span><span class="w"> </span><span class="py">tx_count</span><span class="p">,</span><span class="w"> </span><span class="py">total_amount</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">tx_count</span><span class="w"> </span><span class="py">DESC</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Unusual</span><span class="w"> </span><span class="py">pattern</span><span class="p">:</span><span class="w"> </span><span class="nc">Receive</span><span class="w"> </span><span class="py">then</span><span class="w"> </span><span class="py">immediately</span><span class="w"> </span><span class="py">send</span><span class="w"> </span><span class="py">similar</span><span class="w"> </span><span class="py">amount</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">:</span><span class="nc">Account</span><span class="p">)</span><span class="err">&lt;-</span><span class="p">[</span><span class="py">r1</span><span class="p">:</span><span class="nc">PAYMENT</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">sender</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">r1</span><span class="err">.</span><span class="py">timestamp</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">CURRENT_TIMESTAMP</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="py">INTERVAL</span><span class="w"> </span><span class="err">&#39;</span><span class="py">24</span><span class="err">&#39;</span><span class="w"> </span><span class="py">HOUR</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">)</span><span class="err">-</span><span class="p">[</span><span class="py">r2</span><span class="p">:</span><span class="nc">PAYMENT</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">recipient</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">r2</span><span class="err">.</span><span class="py">timestamp</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">r1</span><span class="err">.</span><span class="py">timestamp</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">r2</span><span class="err">.</span><span class="py">timestamp</span><span class="w"> </span><span class="err">&lt;</span><span class="w"> </span><span class="py">r1</span><span class="err">.</span><span class="py">timestamp</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="py">INTERVAL</span><span class="w"> </span><span class="err">&#39;</span><span class="py">1</span><span class="err">&#39;</span><span class="w"> </span><span class="py">HOUR</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">ABS</span><span class="p">(</span><span class="py">r2</span><span class="err">.</span><span class="py">amount</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="py">r1</span><span class="err">.</span><span class="py">amount</span><span class="p">)</span><span class="w"> </span><span class="err">&lt;</span><span class="w"> </span><span class="py">r1</span><span class="err">.</span><span class="py">amount</span><span class="w"> </span><span class="err">*</span><span class="w"> </span><span class="py">0</span><span class="mf">.05</span><span class="w"> </span><span class="err">--</span><span class="w"> </span><span class="py">Within</span><span class="w"> </span><span class="py">5</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">a</span><span class="err">.</span><span class="py">id</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">sender</span><span class="err">.</span><span class="py">id</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">recipient</span><span class="err">.</span><span class="py">id</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">r1</span><span class="err">.</span><span class="py">amount</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">r2</span><span class="err">.</span><span class="py">amount</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">DURATION</span><span class="err">.</span><span class="py">BETWEEN</span><span class="p">(</span><span class="py">r1</span><span class="err">.</span><span class="py">timestamp</span><span class="p">,</span><span class="w"> </span><span class="py">r2</span><span class="err">.</span><span class="py">timestamp</span><span class="p">)</span><span class="err">.</span><span class="py">minutes</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">minutes_between</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div> <h3 id="advanced-hands-on-projects" class="position-relative d-flex align-items-center group"> <span>Advanced Hands-On Projects</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-hands-on-projects" aria-haspopup="dialog" aria-label="Share link: Advanced Hands-On Projects"> <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="project-1-build-a-recommendation-system" class="position-relative d-flex align-items-center group"> <span>Project 1: Build a Recommendation System</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="project-1-build-a-recommendation-system" aria-haspopup="dialog" aria-label="Share link: Project 1: Build a Recommendation System"> <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>Objective</strong>: Create a complete recommendation engine with multiple algorithms.</p> <p><strong>Requirements</strong>:</p> <ol> <li>Collaborative filtering based on user similarity</li> <li>Content-based recommendations using product attributes</li> <li>Hybrid approach combining both</li> <li>A/B testing framework to compare algorithms</li> <li>Real-time recommendation serving</li> </ol> <p><strong>Starter Code</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">class</span> <span class="nc">RecommendationEngine</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">client</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="bp">self</span><span class="o">.</span><span class="n">client</span> <span class="o">=</span> <span class="n">client</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">collaborative_filtering</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">user_id</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="mi">10</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&#34;&#34;Find products liked by similar users&#34;&#34;&#34;</span> </span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">&#34;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> // TODO: Implement collaborative filtering </span></span></span><span class="line"><span class="cl"><span class="s2"> // 1. Find users who bought similar products </span></span></span><span class="line"><span class="cl"><span class="s2"> // 2. Find products those users also bought </span></span></span><span class="line"><span class="cl"><span class="s2"> // 3. Rank by similarity score </span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&#34;user_id&#34;</span><span class="p">:</span> <span class="n">user_id</span><span class="p">,</span> <span class="s2">&#34;limit&#34;</span><span class="p">:</span> <span class="n">limit</span><span class="p">})</span> </span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">result</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">content_based</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">user_id</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="mi">10</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&#34;&#34;Recommend based on product attributes&#34;&#34;&#34;</span> </span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">&#34;&#34;&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> // TODO: Implement content-based filtering </span></span></span><span class="line"><span class="cl"><span class="s2"> // 1. Find products user has liked </span></span></span><span class="line"><span class="cl"><span class="s2"> // 2. Find similar products by attributes </span></span></span><span class="line"><span class="cl"><span class="s2"> // 3. Rank by attribute similarity </span></span></span><span class="line"><span class="cl"><span class="s2"> &#34;&#34;&#34;</span><span class="p">,</span> <span class="p">{</span><span class="s2">&#34;user_id&#34;</span><span class="p">:</span> <span class="n">user_id</span><span class="p">,</span> <span class="s2">&#34;limit&#34;</span><span class="p">:</span> <span class="n">limit</span><span class="p">})</span> </span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">result</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">hybrid</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">user_id</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="mi">10</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&#34;&#34;Combine both approaches&#34;&#34;&#34;</span> </span></span><span class="line"><span class="cl"> <span class="n">collab</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">collaborative_filtering</span><span class="p">(</span><span class="n">user_id</span><span class="p">,</span> <span class="n">limit</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">content</span> <span class="o">=</span> <span class="k">await</span> <span class="bp">self</span><span class="o">.</span><span class="n">content_based</span><span class="p">(</span><span class="n">user_id</span><span class="p">,</span> <span class="n">limit</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1"># TODO: Implement ranking combination</span> </span></span><span class="line"><span class="cl"> <span class="k">pass</span> </span></span></code></pre></div> <h4 id="project-2-social-network-analytics-dashboard" class="position-relative d-flex align-items-center group"> <span>Project 2: Social Network Analytics Dashboard</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="project-2-social-network-analytics-dashboard" aria-haspopup="dialog" aria-label="Share link: Project 2: Social Network Analytics Dashboard"> <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>Objective</strong>: Build analytics dashboard for social network insights.</p> <p><strong>Features</strong>:</p> <ol> <li>User growth metrics (daily/weekly/monthly active users)</li> <li>Engagement metrics (posts, likes, comments per user)</li> <li>Network topology analysis (clusters, influencers)</li> <li>Content virality tracking</li> <li>Retention cohort analysis</li> </ol> <p><strong>Queries to Implement</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">Daily</span><span class="w"> </span><span class="py">active</span><span class="w"> </span><span class="py">users</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">ACTION</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">a</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">a</span><span class="err">.</span><span class="py">timestamp</span><span class="w"> </span><span class="err">&gt;</span><span class="p">=</span><span class="w"> </span><span class="py">DATE_TRUNC</span><span class="p">(</span><span class="err">&#39;</span><span class="py">day</span><span class="err">&#39;</span><span class="p">,</span><span class="w"> </span><span class="py">CURRENT_TIMESTAMP</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">DATE</span><span class="p">(</span><span class="py">a</span><span class="err">.</span><span class="py">timestamp</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">date</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="py">DISTINCT</span><span class="w"> </span><span class="py">u</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">daily_active_users</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Top</span><span class="w"> </span><span class="py">influencers</span><span class="w"> </span><span class="py">by</span><span class="w"> </span><span class="py">engagement</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">POSTED</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Post</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">OPTIONAL</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="err">&lt;-</span><span class="p">[:</span><span class="nc">LIKED</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">liker</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">OPTIONAL</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="err">&lt;-</span><span class="p">[:</span><span class="nc">COMMENTED</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">commenter</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WITH</span><span class="w"> </span><span class="py">u</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="py">DISTINCT</span><span class="w"> </span><span class="py">p</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">post_count</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="py">DISTINCT</span><span class="w"> </span><span class="py">liker</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">total_likes</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="py">DISTINCT</span><span class="w"> </span><span class="py">commenter</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">total_comments</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">post_count</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">total_likes</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">total_comments</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(</span><span class="py">total_likes</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="py">total_comments</span><span class="w"> </span><span class="err">*</span><span class="w"> </span><span class="py">2</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">engagement_score</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">engagement_score</span><span class="w"> </span><span class="py">DESC</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">LIMIT</span><span class="w"> </span><span class="py">100</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Content</span><span class="w"> </span><span class="py">virality</span><span class="w"> </span><span class="p">(</span><span class="py">posts</span><span class="w"> </span><span class="py">shared</span><span class="w"> </span><span class="py">most</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Post</span><span class="p">)</span><span class="err">&lt;-</span><span class="p">[:</span><span class="nc">SHARED</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">sharer</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WITH</span><span class="w"> </span><span class="py">p</span><span class="p">,</span><span class="w"> </span><span class="py">COUNT</span><span class="p">(</span><span class="py">sharer</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">share_count</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">share_count</span><span class="w"> </span><span class="err">&gt;</span><span class="w"> </span><span class="py">5</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">original_poster</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">POSTED</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">p</span><span class="p">)</span><span class="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">original_poster</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">content</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">timestamp</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">share_count</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">DURATION</span><span class="err">.</span><span class="py">BETWEEN</span><span class="p">(</span><span class="py">p</span><span class="err">.</span><span class="py">timestamp</span><span class="p">,</span><span class="w"> </span><span class="py">CURRENT_TIMESTAMP</span><span class="p">)</span><span class="err">.</span><span class="py">hours</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">hours_since_posted</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">share_count</span><span class="w"> </span><span class="err">*</span><span class="w"> </span><span class="py">1</span><span class="mf">.0</span><span class="w"> </span><span class="err">/</span><span class="w"> </span><span class="py">DURATION</span><span class="err">.</span><span class="py">BETWEEN</span><span class="p">(</span><span class="py">p</span><span class="err">.</span><span class="py">timestamp</span><span class="p">,</span><span class="w"> </span><span class="py">CURRENT_TIMESTAMP</span><span class="p">)</span><span class="err">.</span><span class="py">hours</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">virality_rate</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">virality_rate</span><span class="w"> </span><span class="py">DESC</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div> <h4 id="project-3-knowledge-graph-query-engine" class="position-relative d-flex align-items-center group"> <span>Project 3: Knowledge Graph Query 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="project-3-knowledge-graph-query-engine" aria-haspopup="dialog" aria-label="Share link: Project 3: Knowledge Graph Query 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>Objective</strong>: Build intelligent query engine over knowledge graph.</p> <p><strong>Features</strong>:</p> <ol> <li>Natural language to GQL translation</li> <li>Entity recognition and linking</li> <li>Relationship extraction</li> <li>Answer ranking by relevance</li> <li>Explanation generation</li> </ol> <p><strong>Implementation Outline</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">class</span> <span class="nc">KnowledgeGraphQueryEngine</span><span class="p">:</span> </span></span><span class="line"><span class="cl"> <span class="k">def</span> <span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">client</span><span class="p">,</span> <span class="n">nlp_model</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="bp">self</span><span class="o">.</span><span class="n">client</span> <span class="o">=</span> <span class="n">client</span> </span></span><span class="line"><span class="cl"> <span class="bp">self</span><span class="o">.</span><span class="n">nlp</span> <span class="o">=</span> <span class="n">nlp_model</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">def</span> <span class="nf">query</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">natural_language_question</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;&#34;&#34;Answer question using knowledge graph&#34;&#34;&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1"># 1. Extract entities</span> </span></span><span class="line"><span class="cl"> <span class="n">entities</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">extract_entities</span><span class="p">(</span><span class="n">natural_language_question</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1"># 2. Generate GQL queries</span> </span></span><span class="line"><span class="cl"> <span class="n">gql_queries</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">generate_queries</span><span class="p">(</span><span class="n">entities</span><span class="p">,</span> <span class="n">natural_language_question</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1"># 3. Execute queries</span> </span></span><span class="line"><span class="cl"> <span class="n">results</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">query</span> <span class="ow">in</span> <span class="n">gql_queries</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="bp">self</span><span class="o">.</span><span class="n">client</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">query</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> <span class="n">results</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">result</span><span class="p">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="c1"># 4. Rank and format answers</span> </span></span><span class="line"><span class="cl"> <span class="n">answers</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">rank_answers</span><span class="p">(</span><span class="n">results</span><span class="p">,</span> <span class="n">natural_language_question</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">answers</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="k">def</span> <span class="nf">extract_entities</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">question</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="c1"># TODO: Use NLP to extract named entities</span> </span></span><span class="line"><span class="cl"> <span class="k">pass</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"> <span class="k">def</span> <span class="nf">generate_queries</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">entities</span><span class="p">,</span> <span class="n">question</span><span class="p">):</span> </span></span><span class="line"><span class="cl"> <span class="c1"># TODO: Generate GQL queries based on question type</span> </span></span><span class="line"><span class="cl"> <span class="k">pass</span> </span></span></code></pre></div> <h4 id="project-4-multi-tenant-saas-application" class="position-relative d-flex align-items-center group"> <span>Project 4: Multi-Tenant SaaS Application</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="project-4-multi-tenant-saas-application" aria-haspopup="dialog" aria-label="Share link: Project 4: Multi-Tenant SaaS Application"> <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>Objective</strong>: Build complete multi-tenant application with RLS.</p> <p><strong>Features</strong>:</p> <ol> <li>Tenant isolation using RLS policies</li> <li>Per-tenant resource limits</li> <li>Shared schema with tenant-specific data</li> <li>Audit logging per tenant</li> <li>Tenant analytics dashboard</li> </ol> <p><strong>RLS Policy Examples</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">Create</span><span class="w"> </span><span class="py">RLS</span><span class="w"> </span><span class="py">policy</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">tenant</span><span class="w"> </span><span class="py">isolation</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">POLICY</span><span class="w"> </span><span class="py">tenant_isolation</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">User</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">FOR</span><span class="w"> </span><span class="py">ALL</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">USING</span><span class="w"> </span><span class="p">(</span><span class="py">tenant_id</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">current_tenant_id</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></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Create</span><span class="w"> </span><span class="py">policy</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">hierarchical</span><span class="w"> </span><span class="py">access</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">POLICY</span><span class="w"> </span><span class="py">manager_access</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Employee</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">FOR</span><span class="w"> </span><span class="py">SELECT</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">USING</span><span class="w"> </span><span class="p">(</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">employee_id</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">current_user_id</span><span class="p">()</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">OR</span><span class="w"> </span><span class="py">EXISTS</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">current</span><span class="p">:</span><span class="nc">Employee</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">current_user_id</span><span class="p">()})</span><span class="err">-</span><span class="p">[:</span><span class="nc">MANAGES</span><span class="err">*</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">emp</span><span class="p">:</span><span class="nc">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">WHERE</span><span class="w"> </span><span class="py">emp</span><span class="err">.</span><span class="py">employee_id</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">Employee</span><span class="err">.</span><span class="py">employee_id</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">}</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Row</span><span class="err">-</span><span class="py">level</span><span class="w"> </span><span class="py">encryption</span><span class="w"> </span><span class="py">policy</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">POLICY</span><span class="w"> </span><span class="py">sensitive_data</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Customer</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">FOR</span><span class="w"> </span><span class="py">SELECT</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">USING</span><span class="w"> </span><span class="p">(</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">has_permission</span><span class="p">(</span><span class="py">current_user_id</span><span class="p">(),</span><span class="w"> </span><span class="err">&#39;</span><span class="py">view_pii</span><span class="err">&#39;</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">OR</span><span class="w"> </span><span class="py">customer_id</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">current_user_id</span><span class="p">()</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">)</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div> <h3 id="debugging-exercises" class="position-relative d-flex align-items-center group"> <span>Debugging 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="debugging-exercises" aria-haspopup="dialog" aria-label="Share link: Debugging 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> <h4 id="exercise-debug-slow-query" class="position-relative d-flex align-items-center group"> <span>Exercise: Debug Slow Query</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="exercise-debug-slow-query" aria-haspopup="dialog" aria-label="Share link: Exercise: Debug Slow Query"> <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>: This query is very slow. Fix it.</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">Slow</span><span class="w"> </span><span class="kd">query</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">EXISTS</span><span class="w"> </span><span class="p">{</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">PURCHASED</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">p</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">}</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Steps</strong>:</p> <ol> <li>Run EXPLAIN to see execution plan</li> <li>Identify the problem (hint: Cartesian product)</li> <li>Rewrite to use proper pattern matching</li> <li>Verify with PROFILE</li> </ol> <details> <summary>Solution</summary> <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">Optimized</span><span class="w"> </span><span class="kd">query</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">u</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">PURCHASED</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Product</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">u</span><span class="err">.</span><span class="py">name</span><span class="p">,</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">name</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p>The original creates a Cartesian product of ALL users × ALL products, then filters. The optimized version uses pattern matching directly.</p> </details> <h4 id="exercise-fix-transaction-deadlock" class="position-relative d-flex align-items-center group"> <span>Exercise: Fix Transaction Deadlock</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="exercise-fix-transaction-deadlock" aria-haspopup="dialog" aria-label="Share link: Exercise: Fix Transaction Deadlock"> <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>: Two concurrent transactions are deadlocking.</p> <p><strong>Transaction 1</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">BEGIN</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">:</span><span class="nc">Account</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">1</span><span class="p">})</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">balance</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">balance</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="py">100</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">Pause</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">b</span><span class="p">:</span><span class="nc">Account</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">2</span><span class="p">})</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">b</span><span class="err">.</span><span class="py">balance</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">b</span><span class="err">.</span><span class="py">balance</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="py">100</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">COMMIT</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Transaction 2</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">BEGIN</span><span class="err">;</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">b</span><span class="p">:</span><span class="nc">Account</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">2</span><span class="p">})</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">b</span><span class="err">.</span><span class="py">balance</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">b</span><span class="err">.</span><span class="py">balance</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="py">50</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">Pause</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">:</span><span class="nc">Account</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">1</span><span class="p">})</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">balance</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">balance</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="py">50</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">COMMIT</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Task</strong>: Identify why deadlock occurs and fix it.</p> <details> <summary>Solution</summary> <p>Deadlock occurs because:</p> <ul> <li>TX1 locks Account 1, then tries to lock Account 2</li> <li>TX2 locks Account 2, then tries to lock Account 1</li> </ul> <p>Fix: Always acquire locks in consistent order:</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">Both</span><span class="w"> </span><span class="py">transactions</span><span class="w"> </span><span class="py">should</span><span class="w"> </span><span class="py">lock</span><span class="w"> </span><span class="py">in</span><span class="w"> </span><span class="py">same</span><span class="w"> </span><span class="py">order</span><span class="w"> </span><span class="p">(</span><span class="py">by</span><span class="w"> </span><span class="py">ID</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">BEGIN</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">:</span><span class="nc">Account</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">1</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">Account</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">2</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">a</span><span class="err">.</span><span class="py">id</span><span class="w"> </span><span class="err">&lt;</span><span class="w"> </span><span class="py">b</span><span class="err">.</span><span class="py">id</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">SET</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">balance</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">a</span><span class="err">.</span><span class="py">balance</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="py">100</span><span class="p">,</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">b</span><span class="err">.</span><span class="py">balance</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">b</span><span class="err">.</span><span class="py">balance</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="py">100</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">COMMIT</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div></details> <h3 id="community-challenges" class="position-relative d-flex align-items-center group"> <span>Community Challenges</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="community-challenges" aria-haspopup="dialog" aria-label="Share link: Community Challenges"> <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="weekly-challenge-graph-algorithm-implementation" class="position-relative d-flex align-items-center group"> <span>Weekly Challenge: Graph Algorithm Implementation</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="weekly-challenge-graph-algorithm-implementation" aria-haspopup="dialog" aria-label="Share link: Weekly Challenge: Graph Algorithm Implementation"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p>Implement these algorithms using only GQL:</p> <ol> <li><strong>Dijkstra&rsquo;s shortest path</strong> with weighted edges</li> <li><strong>Triangle counting</strong> for clustering coefficient</li> <li><strong>Graph coloring</strong> for conflict-free scheduling</li> <li><strong>Maximum flow</strong> in a network</li> <li><strong>Minimum spanning tree</strong> for optimization</li> </ol> <h4 id="monthly-project-build-a-full-application" class="position-relative d-flex align-items-center group"> <span>Monthly Project: Build a Full Application</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="monthly-project-build-a-full-application" aria-haspopup="dialog" aria-label="Share link: Monthly Project: Build a Full Application"> <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>Complete projects that combine multiple concepts:</p> <ol> <li><strong>Twitter Clone</strong>: Social graph with posts, likes, retweets, trending topics</li> <li><strong>E-commerce Platform</strong>: Products, recommendations, reviews, fraud detection</li> <li><strong>Knowledge Base</strong>: Hierarchical documentation with search and recommendations</li> <li><strong>Project Management</strong>: Tasks, dependencies, resources, timelines</li> <li><strong>Supply Chain</strong>: Logistics network with optimization and tracking</li> </ol> <h3 id="related-topics" class="position-relative d-flex align-items-center group"> <span>Related Topics</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="related-topics" aria-haspopup="dialog" aria-label="Share link: Related Topics"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><ul> <li><strong><a href="/tags/tutorials/" >Tutorials</a> </strong>: Structured learning paths with explanations</li> <li><strong><a href="/tags/examples/" >Examples</a> </strong>: Copy-paste ready code snippets</li> <li><strong><a href="/tags/getting-started/" >Getting Started</a> </strong>: Foundation concepts and setup</li> <li><strong><a href="/tags/developer-guide/" >Developer Guide</a> </strong>: Complete API reference</li> <li><strong><a href="/tags/quickstart/" >Quickstart</a> </strong>: Fast-track guides for immediate productivity</li> <li><strong><a href="/tags/tutorials/" >Tutorials</a> </strong>: Structured learning paths</li> <li><strong><a href="/tags/examples/" >Examples</a> </strong>: Ready-to-use code examples</li> </ul> <h3 id="additional-resources" class="position-relative d-flex align-items-center group"> <span>Additional Resources</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="additional-resources" aria-haspopup="dialog" aria-label="Share link: Additional Resources"> <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><strong>Video Walkthroughs</strong>: Watch step-by-step solution videos</li> <li><strong>Community Forums</strong>: Discuss solutions and get help</li> <li><strong>Code Templates</strong>: Starter code for common patterns</li> <li><strong>Solution Repository</strong>: Browse complete working solutions</li> <li><strong>Office Hours</strong>: Weekly live coding sessions</li> </ul> <p>Start with Exercise 1 and work your way through. Don&rsquo;t skip ahead – each exercise builds essential skills for the next!</p>

Related Articles