<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-28 -->
<h2 id="social-network-guide" class="position-relative d-flex align-items-center group">
<span>Social Network Guide</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="social-network-guide"
aria-haspopup="dialog"
aria-label="Share link: Social Network Guide">
<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>This guide demonstrates how to build a comprehensive social network using Geode. You’ll learn to model users, posts, comments, likes, and relationships, then implement features like activity feeds, friend recommendations, and privacy controls.</p>
<h3 id="overview" class="position-relative d-flex align-items-center group">
<span>Overview</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="overview"
aria-haspopup="dialog"
aria-label="Share link: Overview">
<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>Social networks are a natural fit for graph databases because they’re built on relationships:</p>
<ul>
<li>Users <strong>follow</strong> or <strong>friend</strong> other users</li>
<li>Users <strong>create</strong> posts and <strong>comment</strong> on content</li>
<li>Users <strong>like</strong> content and <strong>share</strong> posts</li>
<li>Recommendations emerge from <strong>connection patterns</strong></li>
</ul>
<p>Geode’s graph model captures these relationships directly, enabling fast traversals for feeds, recommendations, and social analytics.</p>
<h3 id="data-model" class="position-relative d-flex align-items-center group">
<span>Data Model</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="data-model"
aria-haspopup="dialog"
aria-label="Share link: Data Model">
<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="core-entities" class="position-relative d-flex align-items-center group">
<span>Core Entities</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="core-entities"
aria-haspopup="dialog"
aria-label="Share link: Core Entities">
<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">Users</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="py">the</span><span class="w"> </span><span class="py">central</span><span class="w"> </span><span class="py">entity</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(:</span><span class="nc">User</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">id</span><span class="p">:</span><span class="w"> </span><span class="nc">STRING</span><span class="p">,</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="py">UUID</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">username</span><span class="p">:</span><span class="w"> </span><span class="nc">STRING</span><span class="p">,</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="py">Unique</span><span class="w"> </span><span class="py">handle</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">email</span><span class="p">:</span><span class="w"> </span><span class="nc">STRING</span><span class="p">,</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="py">Unique</span><span class="w"> </span><span class="py">email</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">display_name</span><span class="p">:</span><span class="w"> </span><span class="nc">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">bio</span><span class="p">:</span><span class="w"> </span><span class="nc">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">avatar_url</span><span class="p">:</span><span class="w"> </span><span class="nc">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">location</span><span class="p">:</span><span class="w"> </span><span class="nc">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">website</span><span class="p">:</span><span class="w"> </span><span class="nc">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">verified</span><span class="p">:</span><span class="w"> </span><span class="nc">BOOLEAN</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">privacy</span><span class="p">:</span><span class="w"> </span><span class="nc">STRING</span><span class="p">,</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="s">"public"</span><span class="p">,</span><span class="w"> </span><span class="s">"private"</span><span class="p">,</span><span class="w"> </span><span class="s">"friends"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">created_at</span><span class="p">:</span><span class="w"> </span><span class="nc">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">last_active</span><span class="p">:</span><span class="w"> </span><span class="nc">TIMESTAMP</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></span><span class="line"><span class="cl"><span class="w"></span><span class="err">//</span><span class="w"> </span><span class="py">Posts</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="py">content</span><span class="w"> </span><span class="py">created</span><span class="w"> </span><span class="py">by</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="p">(:</span><span class="nc">Post</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">id</span><span class="p">:</span><span class="w"> </span><span class="nc">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">content</span><span class="p">:</span><span class="w"> </span><span class="nc">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">media_urls</span><span class="p">:</span><span class="w"> </span><span class="nc">LIST</span><span class="err"><</span><span class="py">STRING</span><span class="err">></span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">visibility</span><span class="p">:</span><span class="w"> </span><span class="nc">STRING</span><span class="p">,</span><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="s">"public"</span><span class="p">,</span><span class="w"> </span><span class="s">"friends"</span><span class="p">,</span><span class="w"> </span><span class="s">"private"</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">reply_count</span><span class="p">:</span><span class="w"> </span><span class="nc">INTEGER</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">like_count</span><span class="p">:</span><span class="w"> </span><span class="nc">INTEGER</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 class="nc">INTEGER</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">created_at</span><span class="p">:</span><span class="w"> </span><span class="nc">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">updated_at</span><span class="p">:</span><span class="w"> </span><span class="nc">TIMESTAMP</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></span><span class="line"><span class="cl"><span class="w"></span><span class="err">//</span><span class="w"> </span><span class="py">Comments</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="py">replies</span><span class="w"> </span><span class="py">to</span><span class="w"> </span><span class="py">posts</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(:</span><span class="nc">Comment</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">id</span><span class="p">:</span><span class="w"> </span><span class="nc">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">content</span><span class="p">:</span><span class="w"> </span><span class="nc">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">like_count</span><span class="p">:</span><span class="w"> </span><span class="nc">INTEGER</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">created_at</span><span class="p">:</span><span class="w"> </span><span class="nc">TIMESTAMP</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></span><span class="line"><span class="cl"><span class="w"></span><span class="err">//</span><span class="w"> </span><span class="py">Hashtags</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">content</span><span class="w"> </span><span class="py">discovery</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(:</span><span class="nc">Hashtag</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">name</span><span class="p">:</span><span class="w"> </span><span class="nc">STRING</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">usage_count</span><span class="p">:</span><span class="w"> </span><span class="nc">INTEGER</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">trending_score</span><span class="p">:</span><span class="w"> </span><span class="nc">FLOAT</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></code></pre></div>
<h4 id="relationship-types" class="position-relative d-flex align-items-center group">
<span>Relationship Types</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="relationship-types"
aria-haspopup="dialog"
aria-label="Share link: Relationship Types">
<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">User</span><span class="w"> </span><span class="py">relationships</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(:</span><span class="nc">User</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">FOLLOWS</span><span class="w"> </span><span class="p">{</span><span class="py">since</span><span class="p">:</span><span class="w"> </span><span class="nc">TIMESTAMP</span><span class="p">,</span><span class="w"> </span><span class="py">notifications</span><span class="p">:</span><span class="w"> </span><span class="nc">BOOLEAN</span><span class="p">}]</span><span class="err">-></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="p">(:</span><span class="nc">User</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">BLOCKS</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">TIMESTAMP</span><span class="p">,</span><span class="w"> </span><span class="py">reason</span><span class="p">:</span><span class="w"> </span><span class="nc">STRING</span><span class="p">}]</span><span class="err">-></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="p">(:</span><span class="nc">User</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">MUTES</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">TIMESTAMP</span><span class="p">}]</span><span class="err">-></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></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">relationships</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></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="w"> </span><span class="p">{</span><span class="py">timestamp</span><span class="p">:</span><span class="w"> </span><span class="nc">TIMESTAMP</span><span class="p">}]</span><span class="err">-></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="p">(:</span><span class="nc">User</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">COMMENTED</span><span class="w"> </span><span class="p">{</span><span class="py">timestamp</span><span class="p">:</span><span class="w"> </span><span class="nc">TIMESTAMP</span><span class="p">}]</span><span class="err">-></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="p">(:</span><span class="nc">Comment</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">ON</span><span class="p">]</span><span class="err">-></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="p">(:</span><span class="nc">Comment</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">REPLY_TO</span><span class="p">]</span><span class="err">-></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></span><span class="line"><span class="cl"><span class="w"></span><span class="err">//</span><span class="w"> </span><span class="py">Engagement</span><span class="w"> </span><span class="py">relationships</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></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">LIKES</span><span class="w"> </span><span class="p">{</span><span class="py">timestamp</span><span class="p">:</span><span class="w"> </span><span class="nc">TIMESTAMP</span><span class="p">}]</span><span class="err">-></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="p">(:</span><span class="nc">User</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">LIKES</span><span class="w"> </span><span class="p">{</span><span class="py">timestamp</span><span class="p">:</span><span class="w"> </span><span class="nc">TIMESTAMP</span><span class="p">}]</span><span class="err">-></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="p">(:</span><span class="nc">User</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">SHARED</span><span class="w"> </span><span class="p">{</span><span class="py">timestamp</span><span class="p">:</span><span class="w"> </span><span class="nc">TIMESTAMP</span><span class="p">,</span><span class="w"> </span><span class="py">comment</span><span class="p">:</span><span class="w"> </span><span class="nc">STRING</span><span class="p">}]</span><span class="err">-></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="p">(:</span><span class="nc">User</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">BOOKMARKED</span><span class="w"> </span><span class="p">{</span><span class="py">timestamp</span><span class="p">:</span><span class="w"> </span><span class="nc">TIMESTAMP</span><span class="p">}]</span><span class="err">-></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></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">tagging</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">(:</span><span class="nc">Post</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">TAGGED</span><span class="p">]</span><span class="err">-></span><span class="p">(:</span><span class="nc">Hashtag</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="nc">Post</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">MENTIONS</span><span class="p">]</span><span class="err">-></span><span class="p">(:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="visual-schema" class="position-relative d-flex align-items-center group">
<span>Visual Schema</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="visual-schema"
aria-haspopup="dialog"
aria-label="Share link: Visual Schema">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl"> +---------+
</span></span><span class="line"><span class="cl"> | Hashtag |
</span></span><span class="line"><span class="cl"> +---------+
</span></span><span class="line"><span class="cl"> ^
</span></span><span class="line"><span class="cl"> | TAGGED
</span></span><span class="line"><span class="cl"> |
</span></span><span class="line"><span class="cl">+------+ FOLLOWS +------+ POSTED +------+
</span></span><span class="line"><span class="cl">| User |----------->| User |----------->| Post |
</span></span><span class="line"><span class="cl">+------+ +------+ +------+
</span></span><span class="line"><span class="cl"> | | ^
</span></span><span class="line"><span class="cl"> | LIKES/SHARED | |
</span></span><span class="line"><span class="cl"> +-------------------+ |
</span></span><span class="line"><span class="cl"> | |
</span></span><span class="line"><span class="cl"> | COMMENTED +---------+ ON |
</span></span><span class="line"><span class="cl"> +------------->| Comment |-------------+
</span></span><span class="line"><span class="cl"> +---------+
</span></span></code></pre></div>
<h3 id="schema-setup" class="position-relative d-flex align-items-center group">
<span>Schema 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="schema-setup"
aria-haspopup="dialog"
aria-label="Share link: Schema 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>
</h3>
<h4 id="create-constraints" class="position-relative d-flex align-items-center group">
<span>Create Constraints</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="create-constraints"
aria-haspopup="dialog"
aria-label="Share link: Create Constraints">
<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">Unique</span><span class="w"> </span><span class="py">constraints</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">CONSTRAINT</span><span class="w"> </span><span class="py">user_id_unique</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">id</span><span class="p">)</span><span class="w"> </span><span class="py">ASSERT</span><span class="w"> </span><span class="py">UNIQUE</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">CONSTRAINT</span><span class="w"> </span><span class="py">user_username_unique</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">username</span><span class="p">)</span><span class="w"> </span><span class="py">ASSERT</span><span class="w"> </span><span class="py">UNIQUE</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">CONSTRAINT</span><span class="w"> </span><span class="py">user_email_unique</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">email</span><span class="p">)</span><span class="w"> </span><span class="py">ASSERT</span><span class="w"> </span><span class="py">UNIQUE</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">CONSTRAINT</span><span class="w"> </span><span class="py">post_id_unique</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Post</span><span class="p">(</span><span class="py">id</span><span class="p">)</span><span class="w"> </span><span class="py">ASSERT</span><span class="w"> </span><span class="py">UNIQUE</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">CONSTRAINT</span><span class="w"> </span><span class="py">comment_id_unique</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Comment</span><span class="p">(</span><span class="py">id</span><span class="p">)</span><span class="w"> </span><span class="py">ASSERT</span><span class="w"> </span><span class="py">UNIQUE</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">CONSTRAINT</span><span class="w"> </span><span class="py">hashtag_name_unique</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Hashtag</span><span class="p">(</span><span class="py">name</span><span class="p">)</span><span class="w"> </span><span class="py">ASSERT</span><span class="w"> </span><span class="py">UNIQUE</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">Existence</span><span class="w"> </span><span class="py">constraints</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">CONSTRAINT</span><span class="w"> </span><span class="py">user_username_exists</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">username</span><span class="p">)</span><span class="w"> </span><span class="py">ASSERT</span><span class="w"> </span><span class="py">EXISTS</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">CONSTRAINT</span><span class="w"> </span><span class="py">post_content_exists</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Post</span><span class="p">(</span><span class="py">content</span><span class="p">)</span><span class="w"> </span><span class="py">ASSERT</span><span class="w"> </span><span class="py">EXISTS</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="create-indexes" class="position-relative d-flex align-items-center group">
<span>Create Indexes</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="create-indexes"
aria-haspopup="dialog"
aria-label="Share link: Create Indexes">
<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">User</span><span class="w"> </span><span class="py">indexes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">user_username</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">username</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="py">INDEX</span><span class="w"> </span><span class="py">user_email</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">email</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="py">INDEX</span><span class="w"> </span><span class="py">user_created_at</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">created_at</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="py">INDEX</span><span class="w"> </span><span class="py">user_location</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">location</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">Post</span><span class="w"> </span><span class="py">indexes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">post_created_at</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Post</span><span class="p">(</span><span class="py">created_at</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="py">INDEX</span><span class="w"> </span><span class="py">post_visibility</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Post</span><span class="p">(</span><span class="py">visibility</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">Hashtag</span><span class="w"> </span><span class="py">indexes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">hashtag_name</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Hashtag</span><span class="p">(</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">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">hashtag_trending</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Hashtag</span><span class="p">(</span><span class="py">trending_score</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">Comment</span><span class="w"> </span><span class="py">indexes</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">comment_created_at</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Comment</span><span class="p">(</span><span class="py">created_at</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="user-management" class="position-relative d-flex align-items-center group">
<span>User Management</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="user-management"
aria-haspopup="dialog"
aria-label="Share link: User Management">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="create-user" class="position-relative d-flex align-items-center group">
<span>Create User</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="create-user"
aria-haspopup="dialog"
aria-label="Share link: Create User">
<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="docs-tabs mb-4">
<ul class="nav nav-tabs" id="tabs-1774880884022596154" role="tablist"><li class="nav-item" role="presentation">
<button
class="nav-link active"
id="tabs-1774880884022596154-tab-0-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884022596154-tab-0"
type="button"
role="tab"
aria-controls="tabs-1774880884022596154-tab-0"
aria-selected="true"
>
GQL
</button>
</li><li class="nav-item" role="presentation">
<button
class="nav-link"
id="tabs-1774880884022596154-tab-1-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884022596154-tab-1"
type="button"
role="tab"
aria-controls="tabs-1774880884022596154-tab-1"
aria-selected="false"
>
Go
</button>
</li><li class="nav-item" role="presentation">
<button
class="nav-link"
id="tabs-1774880884022596154-tab-2-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884022596154-tab-2"
type="button"
role="tab"
aria-controls="tabs-1774880884022596154-tab-2"
aria-selected="false"
>
Python
</button>
</li><li class="nav-item" role="presentation">
<button
class="nav-link"
id="tabs-1774880884022596154-tab-3-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884022596154-tab-3"
type="button"
role="tab"
aria-controls="tabs-1774880884022596154-tab-3"
aria-selected="false"
>
Rust
</button>
</li><li class="nav-item" role="presentation">
<button
class="nav-link"
id="tabs-1774880884022596154-tab-4-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884022596154-tab-4"
type="button"
role="tab"
aria-controls="tabs-1774880884022596154-tab-4"
aria-selected="false"
>
Node.js
</button>
</li><li class="nav-item" role="presentation">
<button
class="nav-link"
id="tabs-1774880884022596154-tab-5-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884022596154-tab-5"
type="button"
role="tab"
aria-controls="tabs-1774880884022596154-tab-5"
aria-selected="false"
>
Zig
</button>
</li></ul>
<div class="tab-content border border-top-0 rounded-bottom p-3" id="tabs-1774880884022596154-content"><div
class="tab-pane fade show active"
id="tabs-1774880884022596154-tab-0"
role="tabpanel"
aria-labelledby="tabs-1774880884022596154-tab-0-tab"
>
<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">u</span><span class="p">:</span><span class="nc">User</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">id</span><span class="p">:</span><span class="w"> </span><span class="nv">$id</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">username</span><span class="p">:</span><span class="w"> </span><span class="nv">$username</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">email</span><span class="p">:</span><span class="w"> </span><span class="nv">$email</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">display_name</span><span class="p">:</span><span class="w"> </span><span class="nv">$display_name</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">bio</span><span class="p">:</span><span class="w"> </span><span class="nv">$bio</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">avatar_url</span><span class="p">:</span><span class="w"> </span><span class="nv">$avatar_url</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">privacy</span><span class="p">:</span><span class="w"> </span><span class="s">"public"</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">verified</span><span class="p">:</span><span class="w"> </span><span class="nc">false</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">created_at</span><span class="p">:</span><span class="w"> </span><span class="nc">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">last_active</span><span class="p">:</span><span class="w"> </span><span class="nc">timestamp</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="w">
</span></span></span></code></pre></div>
</div><div
class="tab-pane fade"
id="tabs-1774880884022596154-tab-1"
role="tabpanel"
aria-labelledby="tabs-1774880884022596154-tab-1-tab"
>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kn">package</span> <span class="nx">main</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s">"context"</span>
</span></span><span class="line"><span class="cl"> <span class="s">"database/sql"</span>
</span></span><span class="line"><span class="cl"> <span class="s">"log"</span>
</span></span><span class="line"><span class="cl"> <span class="s">"github.com/google/uuid"</span>
</span></span><span class="line"><span class="cl"> <span class="nx">_</span> <span class="s">"geodedb.com/geode"</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">User</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">ID</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl"> <span class="nx">Username</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl"> <span class="nx">Email</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl"> <span class="nx">DisplayName</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl"> <span class="nx">Bio</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl"> <span class="nx">AvatarURL</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">CreateUser</span><span class="p">(</span><span class="nx">ctx</span> <span class="nx">context</span><span class="p">.</span><span class="nx">Context</span><span class="p">,</span> <span class="nx">db</span> <span class="o">*</span><span class="nx">sql</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">user</span> <span class="nx">User</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">user</span><span class="p">.</span><span class="nx">ID</span> <span class="p">=</span> <span class="nx">uuid</span><span class="p">.</span><span class="nf">New</span><span class="p">().</span><span class="nf">String</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="nx">_</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nf">ExecContext</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span> <span class="s">`
</span></span></span><span class="line"><span class="cl"><span class="s"> CREATE (u:User {
</span></span></span><span class="line"><span class="cl"><span class="s"> id: ?,
</span></span></span><span class="line"><span class="cl"><span class="s"> username: ?,
</span></span></span><span class="line"><span class="cl"><span class="s"> email: ?,
</span></span></span><span class="line"><span class="cl"><span class="s"> display_name: ?,
</span></span></span><span class="line"><span class="cl"><span class="s"> bio: ?,
</span></span></span><span class="line"><span class="cl"><span class="s"> avatar_url: ?,
</span></span></span><span class="line"><span class="cl"><span class="s"> privacy: 'public',
</span></span></span><span class="line"><span class="cl"><span class="s"> verified: false,
</span></span></span><span class="line"><span class="cl"><span class="s"> created_at: timestamp(),
</span></span></span><span class="line"><span class="cl"><span class="s"> last_active: timestamp()
</span></span></span><span class="line"><span class="cl"><span class="s"> })
</span></span></span><span class="line"><span class="cl"><span class="s"> `</span><span class="p">,</span> <span class="nx">user</span><span class="p">.</span><span class="nx">ID</span><span class="p">,</span> <span class="nx">user</span><span class="p">.</span><span class="nx">Username</span><span class="p">,</span> <span class="nx">user</span><span class="p">.</span><span class="nx">Email</span><span class="p">,</span> <span class="nx">user</span><span class="p">.</span><span class="nx">DisplayName</span><span class="p">,</span> <span class="nx">user</span><span class="p">.</span><span class="nx">Bio</span><span class="p">,</span> <span class="nx">user</span><span class="p">.</span><span class="nx">AvatarURL</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="nx">err</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">db</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">sql</span><span class="p">.</span><span class="nf">Open</span><span class="p">(</span><span class="s">"geode"</span><span class="p">,</span> <span class="s">"localhost:3141"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="k">defer</span> <span class="nx">db</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="nx">ctx</span> <span class="o">:=</span> <span class="nx">context</span><span class="p">.</span><span class="nf">Background</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="nx">err</span> <span class="p">=</span> <span class="nf">CreateUser</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span> <span class="nx">db</span><span class="p">,</span> <span class="nx">User</span><span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">Username</span><span class="p">:</span> <span class="s">"alice"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">Email</span><span class="p">:</span> <span class="s">"[email protected]"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">DisplayName</span><span class="p">:</span> <span class="s">"Alice Johnson"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">Bio</span><span class="p">:</span> <span class="s">"Software engineer and coffee enthusiast"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">AvatarURL</span><span class="p">:</span> <span class="s">"https://example.com/avatars/alice.jpg"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">})</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">log</span><span class="p">.</span><span class="nf">Fatal</span><span class="p">(</span><span class="nx">err</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="nx">log</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">"User created successfully"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>
</div><div
class="tab-pane fade"
id="tabs-1774880884022596154-tab-2"
role="tabpanel"
aria-labelledby="tabs-1774880884022596154-tab-2-tab"
>
<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">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">uuid</span> <span class="kn">import</span> <span class="n">uuid4</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">create_user</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">username</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">email</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">display_name</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">bio</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">""</span><span class="p">,</span> <span class="n">avatar_url</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">""</span><span class="p">)</span> <span class="o">-></span> <span class="nb">dict</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Create a new user in the social network."""</span>
</span></span><span class="line"><span class="cl"> <span class="n">user_id</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">uuid4</span><span class="p">())</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">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> 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"> username: $username,
</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"> display_name: $display_name,
</span></span></span><span class="line"><span class="cl"><span class="s2"> bio: $bio,
</span></span></span><span class="line"><span class="cl"><span class="s2"> avatar_url: $avatar_url,
</span></span></span><span class="line"><span class="cl"><span class="s2"> privacy: 'public',
</span></span></span><span class="line"><span class="cl"><span class="s2"> verified: false,
</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"> last_active: 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"> RETURN u
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"id"</span><span class="p">:</span> <span class="n">user_id</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"username"</span><span class="p">:</span> <span class="n">username</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"email"</span><span class="p">:</span> <span class="n">email</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"display_name"</span><span class="p">:</span> <span class="n">display_name</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"bio"</span><span class="p">:</span> <span class="n">bio</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"avatar_url"</span><span class="p">:</span> <span class="n">avatar_url</span>
</span></span><span class="line"><span class="cl"> <span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="p">{</span><span class="s2">"id"</span><span class="p">:</span> <span class="n">user_id</span><span class="p">,</span> <span class="s2">"username"</span><span class="p">:</span> <span class="n">username</span><span class="p">}</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">main</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">"localhost"</span><span class="p">,</span> <span class="n">port</span><span class="o">=</span><span class="mi">3141</span><span class="p">,</span> <span class="n">skip_verify</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">user</span> <span class="o">=</span> <span class="k">await</span> <span class="n">create_user</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">username</span><span class="o">=</span><span class="s2">"alice"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">email</span><span class="o">=</span><span class="s2">"[email protected]"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">display_name</span><span class="o">=</span><span class="s2">"Alice Johnson"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">bio</span><span class="o">=</span><span class="s2">"Software engineer and coffee enthusiast"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">avatar_url</span><span class="o">=</span><span class="s2">"https://example.com/avatars/alice.jpg"</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">"Created user: </span><span class="si">{</span><span class="n">user</span><span class="si">}</span><span class="s2">"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">asyncio</span><span class="o">.</span><span class="n">run</span><span class="p">(</span><span class="n">main</span><span class="p">())</span>
</span></span></code></pre></div>
</div><div
class="tab-pane fade"
id="tabs-1774880884022596154-tab-3"
role="tabpanel"
aria-labelledby="tabs-1774880884022596154-tab-3-tab"
>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="k">use</span><span class="w"> </span><span class="n">geode_client</span>::<span class="p">{</span><span class="n">Client</span><span class="p">,</span><span class="w"> </span><span class="n">Value</span><span class="p">};</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">use</span><span class="w"> </span><span class="n">std</span>::<span class="n">collections</span>::<span class="n">HashMap</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">use</span><span class="w"> </span><span class="n">uuid</span>::<span class="n">Uuid</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="cp">#[derive(Debug)]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">struct</span> <span class="nc">User</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="n">id</span>: <span class="nb">String</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">username</span>: <span class="nb">String</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">email</span>: <span class="nb">String</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">display_name</span>: <span class="nb">String</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">bio</span>: <span class="nb">String</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">avatar_url</span>: <span class="nb">String</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></span><span class="line"><span class="cl"><span class="w"></span><span class="k">async</span><span class="w"> </span><span class="k">fn</span> <span class="nf">create_user</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">conn</span>: <span class="kp">&</span><span class="nc">mut</span><span class="w"> </span><span class="n">geode_client</span>::<span class="n">Connection</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">username</span>: <span class="kp">&</span><span class="kt">str</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">email</span>: <span class="kp">&</span><span class="kt">str</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">display_name</span>: <span class="kp">&</span><span class="kt">str</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">bio</span>: <span class="kp">&</span><span class="kt">str</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">avatar_url</span>: <span class="kp">&</span><span class="kt">str</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 class="nb">Result</span><span class="o"><</span><span class="n">User</span><span class="p">,</span><span class="w"> </span><span class="nb">Box</span><span class="o"><</span><span class="k">dyn</span><span class="w"> </span><span class="n">std</span>::<span class="n">error</span>::<span class="n">Error</span><span class="o">>></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="kd">let</span><span class="w"> </span><span class="n">user_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Uuid</span>::<span class="n">new_v4</span><span class="p">().</span><span class="n">to_string</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="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">params</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">HashMap</span>::<span class="n">new</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">"id"</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span><span class="w"> </span><span class="n">Value</span>::<span class="n">string</span><span class="p">(</span><span class="o">&</span><span class="n">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="n">params</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">"username"</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span><span class="w"> </span><span class="n">Value</span>::<span class="n">string</span><span class="p">(</span><span class="n">username</span><span class="p">));</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">"email"</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span><span class="w"> </span><span class="n">Value</span>::<span class="n">string</span><span class="p">(</span><span class="n">email</span><span class="p">));</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">"display_name"</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span><span class="w"> </span><span class="n">Value</span>::<span class="n">string</span><span class="p">(</span><span class="n">display_name</span><span class="p">));</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">"bio"</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span><span class="w"> </span><span class="n">Value</span>::<span class="n">string</span><span class="p">(</span><span class="n">bio</span><span class="p">));</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">"avatar_url"</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span><span class="w"> </span><span class="n">Value</span>::<span class="n">string</span><span class="p">(</span><span class="n">avatar_url</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="n">conn</span><span class="p">.</span><span class="n">query_with_params</span><span class="p">(</span><span class="sa">r</span><span class="s">#"
</span></span></span><span class="line"><span class="cl"><span class="s"> CREATE (u:User {
</span></span></span><span class="line"><span class="cl"><span class="s"> id: $id,
</span></span></span><span class="line"><span class="cl"><span class="s"> username: $username,
</span></span></span><span class="line"><span class="cl"><span class="s"> email: $email,
</span></span></span><span class="line"><span class="cl"><span class="s"> display_name: $display_name,
</span></span></span><span class="line"><span class="cl"><span class="s"> bio: $bio,
</span></span></span><span class="line"><span class="cl"><span class="s"> avatar_url: $avatar_url,
</span></span></span><span class="line"><span class="cl"><span class="s"> privacy: 'public',
</span></span></span><span class="line"><span class="cl"><span class="s"> verified: false,
</span></span></span><span class="line"><span class="cl"><span class="s"> created_at: timestamp(),
</span></span></span><span class="line"><span class="cl"><span class="s"> last_active: timestamp()
</span></span></span><span class="line"><span class="cl"><span class="s"> })
</span></span></span><span class="line"><span class="cl"><span class="s"> "#</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">params</span><span class="p">).</span><span class="k">await</span><span class="o">?</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="nb">Ok</span><span class="p">(</span><span class="n">User</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="n">id</span>: <span class="nc">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="n">username</span>: <span class="nc">username</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">email</span>: <span class="nc">email</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">display_name</span>: <span class="nc">display_name</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">bio</span>: <span class="nc">bio</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">avatar_url</span>: <span class="nc">avatar_url</span><span class="p">.</span><span class="n">to_string</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="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="cp">#[tokio::main]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">async</span><span class="w"> </span><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span><span class="w"> </span>-> <span class="nb">Result</span><span class="o"><</span><span class="p">(),</span><span class="w"> </span><span class="nb">Box</span><span class="o"><</span><span class="k">dyn</span><span class="w"> </span><span class="n">std</span>::<span class="n">error</span>::<span class="n">Error</span><span class="o">>></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="kd">let</span><span class="w"> </span><span class="n">client</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Client</span>::<span class="n">new</span><span class="p">(</span><span class="s">"127.0.0.1"</span><span class="p">,</span><span class="w"> </span><span class="mi">3141</span><span class="p">).</span><span class="n">skip_verify</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">conn</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">connect</span><span class="p">().</span><span class="k">await</span><span class="o">?</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="kd">let</span><span class="w"> </span><span class="n">user</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">create_user</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="o">&</span><span class="k">mut</span><span class="w"> </span><span class="n">conn</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="s">"alice"</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="s">"[email protected]"</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="s">"Alice Johnson"</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="s">"Software engineer and coffee enthusiast"</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="s">"https://example.com/avatars/alice.jpg"</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="k">await</span><span class="o">?</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="fm">println!</span><span class="p">(</span><span class="s">"Created user: </span><span class="si">{:?}</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="n">user</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nb">Ok</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></code></pre></div>
</div><div
class="tab-pane fade"
id="tabs-1774880884022596154-tab-4"
role="tabpanel"
aria-labelledby="tabs-1774880884022596154-tab-4-tab"
>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">createClient</span><span class="p">,</span> <span class="nx">Client</span> <span class="p">}</span> <span class="kr">from</span> <span class="s1">'@geodedb/client'</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kr">import</span> <span class="p">{</span> <span class="nx">v4</span> <span class="kr">as</span> <span class="nx">uuidv4</span> <span class="p">}</span> <span class="kr">from</span> <span class="s1">'uuid'</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">interface</span> <span class="nx">User</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">id</span>: <span class="kt">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="nx">username</span>: <span class="kt">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="nx">email</span>: <span class="kt">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="nx">displayName</span>: <span class="kt">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="nx">bio</span>: <span class="kt">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="nx">avatarUrl</span>: <span class="kt">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">async</span> <span class="kd">function</span> <span class="nx">createUser</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="nx">client</span>: <span class="kt">Client</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">username</span>: <span class="kt">string</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">email</span>: <span class="kt">string</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">displayName</span>: <span class="kt">string</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">bio</span>: <span class="kt">string</span> <span class="o">=</span> <span class="s1">''</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">avatarUrl</span>: <span class="kt">string</span> <span class="o">=</span> <span class="s1">''</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span><span class="o">:</span> <span class="nx">Promise</span><span class="p"><</span><span class="nt">User</span><span class="p">></span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kr">const</span> <span class="nx">userId</span> <span class="o">=</span> <span class="nx">uuidv4</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="nx">client</span><span class="p">.</span><span class="nx">exec</span><span class="p">(</span><span class="sb">`
</span></span></span><span class="line"><span class="cl"><span class="sb"> CREATE (u:User {
</span></span></span><span class="line"><span class="cl"><span class="sb"> id: $id,
</span></span></span><span class="line"><span class="cl"><span class="sb"> username: $username,
</span></span></span><span class="line"><span class="cl"><span class="sb"> email: $email,
</span></span></span><span class="line"><span class="cl"><span class="sb"> display_name: $display_name,
</span></span></span><span class="line"><span class="cl"><span class="sb"> bio: $bio,
</span></span></span><span class="line"><span class="cl"><span class="sb"> avatar_url: $avatar_url,
</span></span></span><span class="line"><span class="cl"><span class="sb"> privacy: 'public',
</span></span></span><span class="line"><span class="cl"><span class="sb"> verified: false,
</span></span></span><span class="line"><span class="cl"><span class="sb"> created_at: timestamp(),
</span></span></span><span class="line"><span class="cl"><span class="sb"> last_active: timestamp()
</span></span></span><span class="line"><span class="cl"><span class="sb"> })
</span></span></span><span class="line"><span class="cl"><span class="sb"> `</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">params</span><span class="o">:</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">id</span>: <span class="kt">userId</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">username</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">email</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">display_name</span>: <span class="kt">displayName</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">bio</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">avatar_url</span>: <span class="kt">avatarUrl</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">id</span>: <span class="kt">userId</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">username</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">email</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">displayName</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">bio</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">avatarUrl</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">async</span> <span class="kd">function</span> <span class="nx">main() {</span>
</span></span><span class="line"><span class="cl"> <span class="kr">const</span> <span class="nx">client</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">createClient</span><span class="p">(</span><span class="s1">'quic://localhost:3141'</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="kr">const</span> <span class="nx">user</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">createUser</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="nx">client</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'alice'</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'[email protected]'</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'Alice Johnson'</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'Software engineer and coffee enthusiast'</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s1">'https://example.com/avatars/alice.jpg'</span>
</span></span><span class="line"><span class="cl"> <span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s1">'Created user:'</span><span class="p">,</span> <span class="nx">user</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="nx">client</span><span class="p">.</span><span class="nx">close</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nx">main</span><span class="p">();</span>
</span></span></code></pre></div>
</div><div
class="tab-pane fade"
id="tabs-1774880884022596154-tab-5"
role="tabpanel"
aria-labelledby="tabs-1774880884022596154-tab-5-tab"
>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-zig" data-lang="zig"><span class="line"><span class="cl"><span class="kr">const</span><span class="w"> </span><span class="n">std</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">@import</span><span class="p">(</span><span class="s">"std"</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">const</span><span class="w"> </span><span class="n">geode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">@import</span><span class="p">(</span><span class="s">"geode_client"</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">const</span><span class="w"> </span><span class="n">uuid</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">@import</span><span class="p">(</span><span class="s">"uuid"</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="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">createUser</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">client</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">geode</span><span class="p">.</span><span class="n">GeodeClient</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">allocator</span><span class="o">:</span><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">mem</span><span class="p">.</span><span class="n">Allocator</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">username</span><span class="o">:</span><span class="w"> </span><span class="p">[]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">email</span><span class="o">:</span><span class="w"> </span><span class="p">[]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">display_name</span><span class="o">:</span><span class="w"> </span><span class="p">[]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">bio</span><span class="o">:</span><span class="w"> </span><span class="p">[]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">avatar_url</span><span class="o">:</span><span class="w"> </span><span class="p">[]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</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 class="o">!</span><span class="p">[]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</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="kr">const</span><span class="w"> </span><span class="n">user_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">uuid</span><span class="p">.</span><span class="n">v4</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="kr">var</span><span class="w"> </span><span class="n">params</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">json</span><span class="p">.</span><span class="n">ObjectMap</span><span class="p">.</span><span class="n">init</span><span class="p">(</span><span class="n">allocator</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">defer</span><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">deinit</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="k">try</span><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s">"id"</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="w"> </span><span class="p">.</span><span class="n">string</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&</span><span class="n">user_id</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="k">try</span><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s">"username"</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="w"> </span><span class="p">.</span><span class="n">string</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">username</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="k">try</span><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s">"email"</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="w"> </span><span class="p">.</span><span class="n">string</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">email</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="k">try</span><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s">"display_name"</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="w"> </span><span class="p">.</span><span class="n">string</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">display_name</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="k">try</span><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s">"bio"</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="w"> </span><span class="p">.</span><span class="n">string</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">bio</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="k">try</span><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s">"avatar_url"</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="w"> </span><span class="p">.</span><span class="n">string</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">avatar_url</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></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">sendRunGql</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\CREATE (u:User {</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ id: $id,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ username: $username,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ email: $email,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ display_name: $display_name,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ bio: $bio,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ avatar_url: $avatar_url,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ privacy: 'public',</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ verified: false,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ created_at: timestamp(),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ last_active: timestamp()</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\})</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 class="p">.{</span><span class="w"> </span><span class="p">.</span><span class="n">object</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">params</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></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">receiveMessage</span><span class="p">(</span><span class="mi">30000</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="k">return</span><span class="w"> </span><span class="o">&</span><span class="n">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="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="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">main</span><span class="p">()</span><span class="w"> </span><span class="o">!</span><span class="kt">void</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="kr">var</span><span class="w"> </span><span class="n">gpa</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">heap</span><span class="p">.</span><span class="n">GeneralPurposeAllocator</span><span class="p">(.{}){};</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">defer</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">gpa</span><span class="p">.</span><span class="n">deinit</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kr">const</span><span class="w"> </span><span class="n">allocator</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">gpa</span><span class="p">.</span><span class="n">allocator</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="kr">var</span><span class="w"> </span><span class="n">client</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">geode</span><span class="p">.</span><span class="n">GeodeClient</span><span class="p">.</span><span class="n">init</span><span class="p">(</span><span class="n">allocator</span><span class="p">,</span><span class="w"> </span><span class="s">"localhost"</span><span class="p">,</span><span class="w"> </span><span class="mi">3141</span><span class="p">,</span><span class="w"> </span><span class="kc">true</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">defer</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">deinit</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="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">connect</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">sendHello</span><span class="p">(</span><span class="s">"social-network"</span><span class="p">,</span><span class="w"> </span><span class="s">"1.0.0"</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">receiveMessage</span><span class="p">(</span><span class="mi">30000</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="kr">const</span><span class="w"> </span><span class="n">user_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">createUser</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="o">&</span><span class="n">client</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">allocator</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="s">"alice"</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="s">"[email protected]"</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="s">"Alice Johnson"</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="s">"Software engineer and coffee enthusiast"</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="s">"https://example.com/avatars/alice.jpg"</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></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">debug</span><span class="p">.</span><span class="n">print</span><span class="p">(</span><span class="s">"Created user: {s}</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="n">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="w">
</span></span></span></code></pre></div>
</div></div>
</div>
<h4 id="follow-user" class="position-relative d-flex align-items-center group">
<span>Follow User</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="follow-user"
aria-haspopup="dialog"
aria-label="Share link: Follow User">
<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">follow</span><span class="w"> </span><span class="py">relationship</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">follower</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">$follower_id</span><span class="p">})</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">followed</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">$followed_id</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">WHERE</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="p">(</span><span class="py">follower</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">FOLLOWS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">followed</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">NOT</span><span class="w"> </span><span class="p">(</span><span class="py">follower</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">BLOCKS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">followed</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">NOT</span><span class="w"> </span><span class="p">(</span><span class="py">followed</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">BLOCKS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">follower</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">follower</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">FOLLOWS</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">since</span><span class="p">:</span><span class="w"> </span><span class="nc">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">notifications</span><span class="p">:</span><span class="w"> </span><span class="nc">true</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="p">(</span><span class="py">followed</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">follower</span><span class="err">.</span><span class="py">username</span><span class="p">,</span><span class="w"> </span><span class="py">followed</span><span class="err">.</span><span class="py">username</span><span class="w">
</span></span></span></code></pre></div><div class="docs-tabs mb-4">
<ul class="nav nav-tabs" id="tabs-1774880884046251563" role="tablist"><li class="nav-item" role="presentation">
<button
class="nav-link active"
id="tabs-1774880884046251563-tab-0-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884046251563-tab-0"
type="button"
role="tab"
aria-controls="tabs-1774880884046251563-tab-0"
aria-selected="true"
>
Go
</button>
</li><li class="nav-item" role="presentation">
<button
class="nav-link"
id="tabs-1774880884046251563-tab-1-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884046251563-tab-1"
type="button"
role="tab"
aria-controls="tabs-1774880884046251563-tab-1"
aria-selected="false"
>
Python
</button>
</li><li class="nav-item" role="presentation">
<button
class="nav-link"
id="tabs-1774880884046251563-tab-2-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884046251563-tab-2"
type="button"
role="tab"
aria-controls="tabs-1774880884046251563-tab-2"
aria-selected="false"
>
Rust
</button>
</li><li class="nav-item" role="presentation">
<button
class="nav-link"
id="tabs-1774880884046251563-tab-3-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884046251563-tab-3"
type="button"
role="tab"
aria-controls="tabs-1774880884046251563-tab-3"
aria-selected="false"
>
Node.js
</button>
</li><li class="nav-item" role="presentation">
<button
class="nav-link"
id="tabs-1774880884046251563-tab-4-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884046251563-tab-4"
type="button"
role="tab"
aria-controls="tabs-1774880884046251563-tab-4"
aria-selected="false"
>
Zig
</button>
</li></ul>
<div class="tab-content border border-top-0 rounded-bottom p-3" id="tabs-1774880884046251563-content"><div
class="tab-pane fade show active"
id="tabs-1774880884046251563-tab-0"
role="tabpanel"
aria-labelledby="tabs-1774880884046251563-tab-0-tab"
>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">FollowUser</span><span class="p">(</span><span class="nx">ctx</span> <span class="nx">context</span><span class="p">.</span><span class="nx">Context</span><span class="p">,</span> <span class="nx">db</span> <span class="o">*</span><span class="nx">sql</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">followerID</span><span class="p">,</span> <span class="nx">followedID</span> <span class="kt">string</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">result</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nf">ExecContext</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span> <span class="s">`
</span></span></span><span class="line"><span class="cl"><span class="s"> MATCH (follower:User {id: ?})
</span></span></span><span class="line"><span class="cl"><span class="s"> MATCH (followed:User {id: ?})
</span></span></span><span class="line"><span class="cl"><span class="s"> WHERE NOT (follower)-[:FOLLOWS]->(followed)
</span></span></span><span class="line"><span class="cl"><span class="s"> AND NOT (follower)-[:BLOCKS]->(followed)
</span></span></span><span class="line"><span class="cl"><span class="s"> AND NOT (followed)-[:BLOCKS]->(follower)
</span></span></span><span class="line"><span class="cl"><span class="s"> CREATE (follower)-[:FOLLOWS {
</span></span></span><span class="line"><span class="cl"><span class="s"> since: timestamp(),
</span></span></span><span class="line"><span class="cl"><span class="s"> notifications: true
</span></span></span><span class="line"><span class="cl"><span class="s"> }]->(followed)
</span></span></span><span class="line"><span class="cl"><span class="s"> `</span><span class="p">,</span> <span class="nx">followerID</span><span class="p">,</span> <span class="nx">followedID</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">err</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="nx">rowsAffected</span><span class="p">,</span> <span class="nx">_</span> <span class="o">:=</span> <span class="nx">result</span><span class="p">.</span><span class="nf">RowsAffected</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">rowsAffected</span> <span class="o">==</span> <span class="mi">0</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Errorf</span><span class="p">(</span><span class="s">"could not follow user"</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="kc">nil</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>
</div><div
class="tab-pane fade"
id="tabs-1774880884046251563-tab-1"
role="tabpanel"
aria-labelledby="tabs-1774880884046251563-tab-1-tab"
>
<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">follow_user</span><span class="p">(</span><span class="n">client</span><span class="p">,</span> <span class="n">follower_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span> <span class="n">followed_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Follow another user."""</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (follower:User {id: $follower_id})
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (followed:User {id: $followed_id})
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE NOT (follower)-[:FOLLOWS]->(followed)
</span></span></span><span class="line"><span class="cl"><span class="s2"> AND NOT (follower)-[:BLOCKS]->(followed)
</span></span></span><span class="line"><span class="cl"><span class="s2"> AND NOT (followed)-[:BLOCKS]->(follower)
</span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE (follower)-[:FOLLOWS {
</span></span></span><span class="line"><span class="cl"><span class="s2"> since: timestamp(),
</span></span></span><span class="line"><span class="cl"><span class="s2"> notifications: true
</span></span></span><span class="line"><span class="cl"><span class="s2"> }]->(followed)
</span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN follower.username AS follower, followed.username AS followed
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span><span class="s2">"follower_id"</span><span class="p">:</span> <span class="n">follower_id</span><span class="p">,</span> <span class="s2">"followed_id"</span><span class="p">:</span> <span class="n">followed_id</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="nb">len</span><span class="p">(</span><span class="n">result</span><span class="o">.</span><span class="n">rows</span><span class="p">)</span> <span class="o">></span> <span class="mi">0</span>
</span></span></code></pre></div>
</div><div
class="tab-pane fade"
id="tabs-1774880884046251563-tab-2"
role="tabpanel"
aria-labelledby="tabs-1774880884046251563-tab-2-tab"
>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="k">async</span><span class="w"> </span><span class="k">fn</span> <span class="nf">follow_user</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">conn</span>: <span class="kp">&</span><span class="nc">mut</span><span class="w"> </span><span class="n">geode_client</span>::<span class="n">Connection</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">follower_id</span>: <span class="kp">&</span><span class="kt">str</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">followed_id</span>: <span class="kp">&</span><span class="kt">str</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 class="nb">Result</span><span class="o"><</span><span class="kt">bool</span><span class="p">,</span><span class="w"> </span><span class="nb">Box</span><span class="o"><</span><span class="k">dyn</span><span class="w"> </span><span class="n">std</span>::<span class="n">error</span>::<span class="n">Error</span><span class="o">>></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="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">params</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">HashMap</span>::<span class="n">new</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">"follower_id"</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span><span class="w"> </span><span class="n">Value</span>::<span class="n">string</span><span class="p">(</span><span class="n">follower_id</span><span class="p">));</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">"followed_id"</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span><span class="w"> </span><span class="n">Value</span>::<span class="n">string</span><span class="p">(</span><span class="n">followed_id</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="kd">let</span><span class="w"> </span><span class="p">(</span><span class="n">page</span><span class="p">,</span><span class="w"> </span><span class="n">_</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">query_with_params</span><span class="p">(</span><span class="sa">r</span><span class="s">#"
</span></span></span><span class="line"><span class="cl"><span class="s"> MATCH (follower:User {id: $follower_id})
</span></span></span><span class="line"><span class="cl"><span class="s"> MATCH (followed:User {id: $followed_id})
</span></span></span><span class="line"><span class="cl"><span class="s"> WHERE NOT (follower)-[:FOLLOWS]->(followed)
</span></span></span><span class="line"><span class="cl"><span class="s"> AND NOT (follower)-[:BLOCKS]->(followed)
</span></span></span><span class="line"><span class="cl"><span class="s"> AND NOT (followed)-[:BLOCKS]->(follower)
</span></span></span><span class="line"><span class="cl"><span class="s"> CREATE (follower)-[:FOLLOWS {
</span></span></span><span class="line"><span class="cl"><span class="s"> since: timestamp(),
</span></span></span><span class="line"><span class="cl"><span class="s"> notifications: true
</span></span></span><span class="line"><span class="cl"><span class="s"> }]->(followed)
</span></span></span><span class="line"><span class="cl"><span class="s"> RETURN follower.username, followed.username
</span></span></span><span class="line"><span class="cl"><span class="s"> "#</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">params</span><span class="p">).</span><span class="k">await</span><span class="o">?</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="nb">Ok</span><span class="p">(</span><span class="o">!</span><span class="n">page</span><span class="p">.</span><span class="n">rows</span><span class="p">.</span><span class="n">is_empty</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></code></pre></div>
</div><div
class="tab-pane fade"
id="tabs-1774880884046251563-tab-3"
role="tabpanel"
aria-labelledby="tabs-1774880884046251563-tab-3-tab"
>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kr">async</span> <span class="kd">function</span> <span class="nx">followUser</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="nx">client</span>: <span class="kt">Client</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">followerId</span>: <span class="kt">string</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">followedId</span>: <span class="kt">string</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span><span class="o">:</span> <span class="nx">Promise</span><span class="p"><</span><span class="nt">boolean</span><span class="p">></span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kr">const</span> <span class="nx">result</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">client</span><span class="p">.</span><span class="nx">queryAll</span><span class="p">(</span><span class="sb">`
</span></span></span><span class="line"><span class="cl"><span class="sb"> MATCH (follower:User {id: $follower_id})
</span></span></span><span class="line"><span class="cl"><span class="sb"> MATCH (followed:User {id: $followed_id})
</span></span></span><span class="line"><span class="cl"><span class="sb"> WHERE NOT (follower)-[:FOLLOWS]->(followed)
</span></span></span><span class="line"><span class="cl"><span class="sb"> AND NOT (follower)-[:BLOCKS]->(followed)
</span></span></span><span class="line"><span class="cl"><span class="sb"> AND NOT (followed)-[:BLOCKS]->(follower)
</span></span></span><span class="line"><span class="cl"><span class="sb"> CREATE (follower)-[:FOLLOWS {
</span></span></span><span class="line"><span class="cl"><span class="sb"> since: timestamp(),
</span></span></span><span class="line"><span class="cl"><span class="sb"> notifications: true
</span></span></span><span class="line"><span class="cl"><span class="sb"> }]->(followed)
</span></span></span><span class="line"><span class="cl"><span class="sb"> RETURN follower.username, followed.username
</span></span></span><span class="line"><span class="cl"><span class="sb"> `</span><span class="p">,</span> <span class="p">{</span> <span class="nx">params</span><span class="o">:</span> <span class="p">{</span> <span class="nx">follower_id</span>: <span class="kt">followerId</span><span class="p">,</span> <span class="nx">followed_id</span>: <span class="kt">followedId</span> <span class="p">}</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="nx">result</span><span class="p">.</span><span class="nx">length</span> <span class="o">></span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>
</div><div
class="tab-pane fade"
id="tabs-1774880884046251563-tab-4"
role="tabpanel"
aria-labelledby="tabs-1774880884046251563-tab-4-tab"
>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-zig" data-lang="zig"><span class="line"><span class="cl"><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">followUser</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">client</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">geode</span><span class="p">.</span><span class="n">GeodeClient</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">allocator</span><span class="o">:</span><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">mem</span><span class="p">.</span><span class="n">Allocator</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">follower_id</span><span class="o">:</span><span class="w"> </span><span class="p">[]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">followed_id</span><span class="o">:</span><span class="w"> </span><span class="p">[]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</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 class="o">!</span><span class="kt">bool</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="kr">var</span><span class="w"> </span><span class="n">params</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">json</span><span class="p">.</span><span class="n">ObjectMap</span><span class="p">.</span><span class="n">init</span><span class="p">(</span><span class="n">allocator</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">defer</span><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">deinit</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="k">try</span><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s">"follower_id"</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="w"> </span><span class="p">.</span><span class="n">string</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">follower_id</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="k">try</span><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s">"followed_id"</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="w"> </span><span class="p">.</span><span class="n">string</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">followed_id</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></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">sendRunGql</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\MATCH (follower:User {id: $follower_id})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\MATCH (followed:User {id: $followed_id})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\WHERE NOT (follower)-[:FOLLOWS]->(followed)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ AND NOT (follower)-[:BLOCKS]->(followed)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ AND NOT (followed)-[:BLOCKS]->(follower)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\CREATE (follower)-[:FOLLOWS {</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ since: timestamp(),</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ notifications: true</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\}]->(followed)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\RETURN follower.username, followed.username</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 class="p">.{</span><span class="w"> </span><span class="p">.</span><span class="n">object</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">params</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></span><span class="line"><span class="cl"><span class="w"> </span><span class="kr">const</span><span class="w"> </span><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">receiveMessage</span><span class="p">(</span><span class="mi">30000</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">defer</span><span class="w"> </span><span class="n">allocator</span><span class="p">.</span><span class="n">free</span><span class="p">(</span><span class="n">result</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="c1">// Parse result to check if follow was created
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">mem</span><span class="p">.</span><span class="n">indexOf</span><span class="p">(</span><span class="kt">u8</span><span class="p">,</span><span class="w"> </span><span class="n">result</span><span class="p">,</span><span class="w"> </span><span class="s">"BINDINGS"</span><span class="p">)</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</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></code></pre></div>
</div></div>
</div>
<h3 id="content-creation" class="position-relative d-flex align-items-center group">
<span>Content Creation</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="content-creation"
aria-haspopup="dialog"
aria-label="Share link: Content Creation">
<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="create-post" class="position-relative d-flex align-items-center group">
<span>Create Post</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="create-post"
aria-haspopup="dialog"
aria-label="Share link: Create Post">
<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">a</span><span class="w"> </span><span class="py">post</span><span class="w"> </span><span class="py">with</span><span class="w"> </span><span class="py">hashtags</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">author</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">$author_id</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">CREATE</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="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">id</span><span class="p">:</span><span class="w"> </span><span class="nv">$post_id</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">content</span><span class="p">:</span><span class="w"> </span><span class="nv">$content</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">media_urls</span><span class="p">:</span><span class="w"> </span><span class="nv">$media_urls</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">visibility</span><span class="p">:</span><span class="w"> </span><span class="nv">$visibility</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">reply_count</span><span class="p">:</span><span class="w"> </span><span class="nc">0</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">like_count</span><span class="p">:</span><span class="w"> </span><span class="nc">0</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 class="nc">0</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">created_at</span><span class="p">:</span><span class="w"> </span><span class="nc">timestamp</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">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">author</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">POSTED</span><span class="w"> </span><span class="p">{</span><span class="py">timestamp</span><span class="p">:</span><span class="w"> </span><span class="nc">timestamp</span><span class="p">()}]</span><span class="err">-></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></span><span class="line"><span class="cl"><span class="w"></span><span class="err">//</span><span class="w"> </span><span class="py">Extract</span><span class="w"> </span><span class="py">and</span><span class="w"> </span><span class="py">link</span><span class="w"> </span><span class="py">hashtags</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">author</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="nv">$hashtags</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">tag</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MERGE</span><span class="w"> </span><span class="p">(</span><span class="py">h</span><span class="p">:</span><span class="nc">Hashtag</span><span class="w"> </span><span class="p">{</span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="nc">tag</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ON</span><span class="w"> </span><span class="py">CREATE</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">h</span><span class="err">.</span><span class="py">usage_count</span><span class="w"> </span><span class="p">=</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 class="py">ON</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="py">SET</span><span class="w"> </span><span class="py">h</span><span class="err">.</span><span class="py">usage_count</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">h</span><span class="err">.</span><span class="py">usage_count</span><span class="w"> </span><span class="err">+</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 class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">TAGGED</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">h</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">Extract</span><span class="w"> </span><span class="py">and</span><span class="w"> </span><span class="py">link</span><span class="w"> </span><span class="py">mentions</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">author</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="nv">$mentions</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">username</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">mentioned</span><span class="p">:</span><span class="nc">User</span><span class="w"> </span><span class="p">{</span><span class="py">username</span><span class="p">:</span><span class="w"> </span><span class="nc">username</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">p</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">MENTIONS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">mentioned</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">RETURN</span><span class="w"> </span><span class="py">p</span><span class="w">
</span></span></span></code></pre></div><div class="docs-tabs mb-4">
<ul class="nav nav-tabs" id="tabs-1774880884055105829" role="tablist"><li class="nav-item" role="presentation">
<button
class="nav-link active"
id="tabs-1774880884055105829-tab-0-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884055105829-tab-0"
type="button"
role="tab"
aria-controls="tabs-1774880884055105829-tab-0"
aria-selected="true"
>
Go
</button>
</li><li class="nav-item" role="presentation">
<button
class="nav-link"
id="tabs-1774880884055105829-tab-1-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884055105829-tab-1"
type="button"
role="tab"
aria-controls="tabs-1774880884055105829-tab-1"
aria-selected="false"
>
Python
</button>
</li><li class="nav-item" role="presentation">
<button
class="nav-link"
id="tabs-1774880884055105829-tab-2-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884055105829-tab-2"
type="button"
role="tab"
aria-controls="tabs-1774880884055105829-tab-2"
aria-selected="false"
>
Rust
</button>
</li><li class="nav-item" role="presentation">
<button
class="nav-link"
id="tabs-1774880884055105829-tab-3-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884055105829-tab-3"
type="button"
role="tab"
aria-controls="tabs-1774880884055105829-tab-3"
aria-selected="false"
>
Node.js
</button>
</li><li class="nav-item" role="presentation">
<button
class="nav-link"
id="tabs-1774880884055105829-tab-4-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884055105829-tab-4"
type="button"
role="tab"
aria-controls="tabs-1774880884055105829-tab-4"
aria-selected="false"
>
Zig
</button>
</li></ul>
<div class="tab-content border border-top-0 rounded-bottom p-3" id="tabs-1774880884055105829-content"><div
class="tab-pane fade show active"
id="tabs-1774880884055105829-tab-0"
role="tabpanel"
aria-labelledby="tabs-1774880884055105829-tab-0-tab"
>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kn">import</span> <span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="s">"regexp"</span>
</span></span><span class="line"><span class="cl"> <span class="s">"strings"</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">Post</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">ID</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl"> <span class="nx">Content</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl"> <span class="nx">MediaURLs</span> <span class="p">[]</span><span class="kt">string</span>
</span></span><span class="line"><span class="cl"> <span class="nx">Visibility</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">extractHashtags</span><span class="p">(</span><span class="nx">content</span> <span class="kt">string</span><span class="p">)</span> <span class="p">[]</span><span class="kt">string</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">re</span> <span class="o">:=</span> <span class="nx">regexp</span><span class="p">.</span><span class="nf">MustCompile</span><span class="p">(</span><span class="s">`#(\w+)`</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nx">matches</span> <span class="o">:=</span> <span class="nx">re</span><span class="p">.</span><span class="nf">FindAllStringSubmatch</span><span class="p">(</span><span class="nx">content</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nx">hashtags</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">([]</span><span class="kt">string</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="nx">matches</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="nx">i</span><span class="p">,</span> <span class="nx">match</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">matches</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">hashtags</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="p">=</span> <span class="nx">strings</span><span class="p">.</span><span class="nf">ToLower</span><span class="p">(</span><span class="nx">match</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">hashtags</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">extractMentions</span><span class="p">(</span><span class="nx">content</span> <span class="kt">string</span><span class="p">)</span> <span class="p">[]</span><span class="kt">string</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">re</span> <span class="o">:=</span> <span class="nx">regexp</span><span class="p">.</span><span class="nf">MustCompile</span><span class="p">(</span><span class="s">`@(\w+)`</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nx">matches</span> <span class="o">:=</span> <span class="nx">re</span><span class="p">.</span><span class="nf">FindAllStringSubmatch</span><span class="p">(</span><span class="nx">content</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nx">mentions</span> <span class="o">:=</span> <span class="nb">make</span><span class="p">([]</span><span class="kt">string</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="nx">matches</span><span class="p">))</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="nx">i</span><span class="p">,</span> <span class="nx">match</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">matches</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">mentions</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="p">=</span> <span class="nx">match</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">mentions</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">CreatePost</span><span class="p">(</span><span class="nx">ctx</span> <span class="nx">context</span><span class="p">.</span><span class="nx">Context</span><span class="p">,</span> <span class="nx">db</span> <span class="o">*</span><span class="nx">sql</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">authorID</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">post</span> <span class="nx">Post</span><span class="p">)</span> <span class="kt">error</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">post</span><span class="p">.</span><span class="nx">ID</span> <span class="p">=</span> <span class="nx">uuid</span><span class="p">.</span><span class="nf">New</span><span class="p">().</span><span class="nf">String</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="nx">hashtags</span> <span class="o">:=</span> <span class="nf">extractHashtags</span><span class="p">(</span><span class="nx">post</span><span class="p">.</span><span class="nx">Content</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="nx">mentions</span> <span class="o">:=</span> <span class="nf">extractMentions</span><span class="p">(</span><span class="nx">post</span><span class="p">.</span><span class="nx">Content</span><span class="p">)</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="nx">tx</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nf">BeginTx</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span> <span class="kc">nil</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">err</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="k">defer</span> <span class="nx">tx</span><span class="p">.</span><span class="nf">Rollback</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1">// Create post
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="nx">_</span><span class="p">,</span> <span class="nx">err</span> <span class="p">=</span> <span class="nx">tx</span><span class="p">.</span><span class="nf">ExecContext</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span> <span class="s">`
</span></span></span><span class="line"><span class="cl"><span class="s"> MATCH (author:User {id: ?})
</span></span></span><span class="line"><span class="cl"><span class="s"> CREATE (p:Post {
</span></span></span><span class="line"><span class="cl"><span class="s"> id: ?,
</span></span></span><span class="line"><span class="cl"><span class="s"> content: ?,
</span></span></span><span class="line"><span class="cl"><span class="s"> visibility: ?,
</span></span></span><span class="line"><span class="cl"><span class="s"> reply_count: 0,
</span></span></span><span class="line"><span class="cl"><span class="s"> like_count: 0,
</span></span></span><span class="line"><span class="cl"><span class="s"> share_count: 0,
</span></span></span><span class="line"><span class="cl"><span class="s"> created_at: timestamp()
</span></span></span><span class="line"><span class="cl"><span class="s"> })
</span></span></span><span class="line"><span class="cl"><span class="s"> CREATE (author)-[:POSTED {timestamp: timestamp()}]->(p)
</span></span></span><span class="line"><span class="cl"><span class="s"> `</span><span class="p">,</span> <span class="nx">authorID</span><span class="p">,</span> <span class="nx">post</span><span class="p">.</span><span class="nx">ID</span><span class="p">,</span> <span class="nx">post</span><span class="p">.</span><span class="nx">Content</span><span class="p">,</span> <span class="nx">post</span><span class="p">.</span><span class="nx">Visibility</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">err</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1">// Link hashtags
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="k">for</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">tag</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">hashtags</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">_</span><span class="p">,</span> <span class="nx">err</span> <span class="p">=</span> <span class="nx">tx</span><span class="p">.</span><span class="nf">ExecContext</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span> <span class="s">`
</span></span></span><span class="line"><span class="cl"><span class="s"> MATCH (p:Post {id: ?})
</span></span></span><span class="line"><span class="cl"><span class="s"> MERGE (h:Hashtag {name: ?})
</span></span></span><span class="line"><span class="cl"><span class="s"> ON CREATE SET h.usage_count = 1
</span></span></span><span class="line"><span class="cl"><span class="s"> ON MATCH SET h.usage_count = h.usage_count + 1
</span></span></span><span class="line"><span class="cl"><span class="s"> CREATE (p)-[:TAGGED]->(h)
</span></span></span><span class="line"><span class="cl"><span class="s"> `</span><span class="p">,</span> <span class="nx">post</span><span class="p">.</span><span class="nx">ID</span><span class="p">,</span> <span class="nx">tag</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">err</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1">// Link mentions
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="k">for</span> <span class="nx">_</span><span class="p">,</span> <span class="nx">username</span> <span class="o">:=</span> <span class="k">range</span> <span class="nx">mentions</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">_</span><span class="p">,</span> <span class="nx">err</span> <span class="p">=</span> <span class="nx">tx</span><span class="p">.</span><span class="nf">ExecContext</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span> <span class="s">`
</span></span></span><span class="line"><span class="cl"><span class="s"> MATCH (p:Post {id: ?})
</span></span></span><span class="line"><span class="cl"><span class="s"> MATCH (mentioned:User {username: ?})
</span></span></span><span class="line"><span class="cl"><span class="s"> CREATE (p)-[:MENTIONS]->(mentioned)
</span></span></span><span class="line"><span class="cl"><span class="s"> `</span><span class="p">,</span> <span class="nx">post</span><span class="p">.</span><span class="nx">ID</span><span class="p">,</span> <span class="nx">username</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="c1">// Ignore errors for non-existent users
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">tx</span><span class="p">.</span><span class="nf">Commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>
</div><div
class="tab-pane fade"
id="tabs-1774880884055105829-tab-1"
role="tabpanel"
aria-labelledby="tabs-1774880884055105829-tab-1-tab"
>
<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">re</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">List</span><span class="p">,</span> <span class="n">Optional</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_hashtags</span><span class="p">(</span><span class="n">content</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Extract hashtags from content."""</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="p">[</span><span class="n">tag</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="k">for</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="sa">r</span><span class="s1">'#(\w+)'</span><span class="p">,</span> <span class="n">content</span><span class="p">)]</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_mentions</span><span class="p">(</span><span class="n">content</span><span class="p">:</span> <span class="nb">str</span><span class="p">)</span> <span class="o">-></span> <span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Extract @mentions from content."""</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">re</span><span class="o">.</span><span class="n">findall</span><span class="p">(</span><span class="sa">r</span><span class="s1">'@(\w+)'</span><span class="p">,</span> <span class="n">content</span><span class="p">)</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">create_post</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">author_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">content</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">media_urls</span><span class="p">:</span> <span class="n">Optional</span><span class="p">[</span><span class="n">List</span><span class="p">[</span><span class="nb">str</span><span class="p">]]</span> <span class="o">=</span> <span class="kc">None</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">visibility</span><span class="p">:</span> <span class="nb">str</span> <span class="o">=</span> <span class="s2">"public"</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span> <span class="o">-></span> <span class="nb">dict</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Create a new post with automatic hashtag and mention extraction."""</span>
</span></span><span class="line"><span class="cl"> <span class="n">post_id</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">uuid4</span><span class="p">())</span>
</span></span><span class="line"><span class="cl"> <span class="n">hashtags</span> <span class="o">=</span> <span class="n">extract_hashtags</span><span class="p">(</span><span class="n">content</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="n">mentions</span> <span class="o">=</span> <span class="n">extract_mentions</span><span class="p">(</span><span class="n">content</span><span class="p">)</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">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">begin</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"># Create the post</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (author:User {id: $author_id})
</span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE (p:Post {
</span></span></span><span class="line"><span class="cl"><span class="s2"> id: $post_id,
</span></span></span><span class="line"><span class="cl"><span class="s2"> content: $content,
</span></span></span><span class="line"><span class="cl"><span class="s2"> media_urls: $media_urls,
</span></span></span><span class="line"><span class="cl"><span class="s2"> visibility: $visibility,
</span></span></span><span class="line"><span class="cl"><span class="s2"> reply_count: 0,
</span></span></span><span class="line"><span class="cl"><span class="s2"> like_count: 0,
</span></span></span><span class="line"><span class="cl"><span class="s2"> share_count: 0,
</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"> CREATE (author)-[:POSTED {timestamp: timestamp()}]->(p)
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"author_id"</span><span class="p">:</span> <span class="n">author_id</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"post_id"</span><span class="p">:</span> <span class="n">post_id</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"content"</span><span class="p">:</span> <span class="n">content</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"media_urls"</span><span class="p">:</span> <span class="n">media_urls</span> <span class="ow">or</span> <span class="p">[],</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"visibility"</span><span class="p">:</span> <span class="n">visibility</span>
</span></span><span class="line"><span class="cl"> <span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Link hashtags</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">hashtags</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (p:Post {id: $post_id})
</span></span></span><span class="line"><span class="cl"><span class="s2"> MERGE (h:Hashtag {name: $tag})
</span></span></span><span class="line"><span class="cl"><span class="s2"> ON CREATE SET h.usage_count = 1
</span></span></span><span class="line"><span class="cl"><span class="s2"> ON MATCH SET h.usage_count = h.usage_count + 1
</span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE (p)-[:TAGGED]->(h)
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span><span class="s2">"post_id"</span><span class="p">:</span> <span class="n">post_id</span><span class="p">,</span> <span class="s2">"tag"</span><span class="p">:</span> <span class="n">tag</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1"># Link mentions</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">username</span> <span class="ow">in</span> <span class="n">mentions</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">execute</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (p:Post {id: $post_id})
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (mentioned:User {username: $username})
</span></span></span><span class="line"><span class="cl"><span class="s2"> CREATE (p)-[:MENTIONS]->(mentioned)
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span><span class="s2">"post_id"</span><span class="p">:</span> <span class="n">post_id</span><span class="p">,</span> <span class="s2">"username"</span><span class="p">:</span> <span class="n">username</span><span class="p">})</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">conn</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</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">rollback</span><span class="p">()</span>
</span></span><span class="line"><span class="cl"> <span class="k">raise</span> <span class="n">e</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"id"</span><span class="p">:</span> <span class="n">post_id</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"content"</span><span class="p">:</span> <span class="n">content</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"hashtags"</span><span class="p">:</span> <span class="n">hashtags</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"mentions"</span><span class="p">:</span> <span class="n">mentions</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span></code></pre></div>
</div><div
class="tab-pane fade"
id="tabs-1774880884055105829-tab-2"
role="tabpanel"
aria-labelledby="tabs-1774880884055105829-tab-2-tab"
>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="k">use</span><span class="w"> </span><span class="n">regex</span>::<span class="n">Regex</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="k">fn</span> <span class="nf">extract_hashtags</span><span class="p">(</span><span class="n">content</span>: <span class="kp">&</span><span class="kt">str</span><span class="p">)</span><span class="w"> </span>-> <span class="nb">Vec</span><span class="o"><</span><span class="nb">String</span><span class="o">></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="kd">let</span><span class="w"> </span><span class="n">re</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Regex</span>::<span class="n">new</span><span class="p">(</span><span class="sa">r</span><span class="s">"#(\w+)"</span><span class="p">).</span><span class="n">unwrap</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">re</span><span class="p">.</span><span class="n">captures_iter</span><span class="p">(</span><span class="n">content</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="n">map</span><span class="p">(</span><span class="o">|</span><span class="n">cap</span><span class="o">|</span><span class="w"> </span><span class="n">cap</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="n">to_lowercase</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="n">collect</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></span><span class="line"><span class="cl"><span class="w"></span><span class="k">fn</span> <span class="nf">extract_mentions</span><span class="p">(</span><span class="n">content</span>: <span class="kp">&</span><span class="kt">str</span><span class="p">)</span><span class="w"> </span>-> <span class="nb">Vec</span><span class="o"><</span><span class="nb">String</span><span class="o">></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="kd">let</span><span class="w"> </span><span class="n">re</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Regex</span>::<span class="n">new</span><span class="p">(</span><span class="sa">r</span><span class="s">"@(\w+)"</span><span class="p">).</span><span class="n">unwrap</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">re</span><span class="p">.</span><span class="n">captures_iter</span><span class="p">(</span><span class="n">content</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="n">map</span><span class="p">(</span><span class="o">|</span><span class="n">cap</span><span class="o">|</span><span class="w"> </span><span class="n">cap</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="n">to_string</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="n">collect</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></span><span class="line"><span class="cl"><span class="w"></span><span class="k">async</span><span class="w"> </span><span class="k">fn</span> <span class="nf">create_post</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">conn</span>: <span class="kp">&</span><span class="nc">mut</span><span class="w"> </span><span class="n">geode_client</span>::<span class="n">Connection</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">author_id</span>: <span class="kp">&</span><span class="kt">str</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">content</span>: <span class="kp">&</span><span class="kt">str</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">visibility</span>: <span class="kp">&</span><span class="kt">str</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 class="nb">Result</span><span class="o"><</span><span class="nb">String</span><span class="p">,</span><span class="w"> </span><span class="nb">Box</span><span class="o"><</span><span class="k">dyn</span><span class="w"> </span><span class="n">std</span>::<span class="n">error</span>::<span class="n">Error</span><span class="o">>></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="kd">let</span><span class="w"> </span><span class="n">post_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Uuid</span>::<span class="n">new_v4</span><span class="p">().</span><span class="n">to_string</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">hashtags</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">extract_hashtags</span><span class="p">(</span><span class="n">content</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="n">mentions</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">extract_mentions</span><span class="p">(</span><span class="n">content</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="n">conn</span><span class="p">.</span><span class="n">begin</span><span class="p">().</span><span class="k">await</span><span class="o">?</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="c1">// Create post
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">params</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">HashMap</span>::<span class="n">new</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">"author_id"</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span><span class="w"> </span><span class="n">Value</span>::<span class="n">string</span><span class="p">(</span><span class="n">author_id</span><span class="p">));</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">"post_id"</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span><span class="w"> </span><span class="n">Value</span>::<span class="n">string</span><span class="p">(</span><span class="o">&</span><span class="n">post_id</span><span class="p">));</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">"content"</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span><span class="w"> </span><span class="n">Value</span>::<span class="n">string</span><span class="p">(</span><span class="n">content</span><span class="p">));</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">"visibility"</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span><span class="w"> </span><span class="n">Value</span>::<span class="n">string</span><span class="p">(</span><span class="n">visibility</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="n">conn</span><span class="p">.</span><span class="n">query_with_params</span><span class="p">(</span><span class="sa">r</span><span class="s">#"
</span></span></span><span class="line"><span class="cl"><span class="s"> MATCH (author:User {id: $author_id})
</span></span></span><span class="line"><span class="cl"><span class="s"> CREATE (p:Post {
</span></span></span><span class="line"><span class="cl"><span class="s"> id: $post_id,
</span></span></span><span class="line"><span class="cl"><span class="s"> content: $content,
</span></span></span><span class="line"><span class="cl"><span class="s"> visibility: $visibility,
</span></span></span><span class="line"><span class="cl"><span class="s"> reply_count: 0,
</span></span></span><span class="line"><span class="cl"><span class="s"> like_count: 0,
</span></span></span><span class="line"><span class="cl"><span class="s"> share_count: 0,
</span></span></span><span class="line"><span class="cl"><span class="s"> created_at: timestamp()
</span></span></span><span class="line"><span class="cl"><span class="s"> })
</span></span></span><span class="line"><span class="cl"><span class="s"> CREATE (author)-[:POSTED {timestamp: timestamp()}]->(p)
</span></span></span><span class="line"><span class="cl"><span class="s"> "#</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">params</span><span class="p">).</span><span class="k">await</span><span class="o">?</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="c1">// Link hashtags
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">tag</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="o">&</span><span class="n">hashtags</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="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">tag_params</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">HashMap</span>::<span class="n">new</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">tag_params</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">"post_id"</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span><span class="w"> </span><span class="n">Value</span>::<span class="n">string</span><span class="p">(</span><span class="o">&</span><span class="n">post_id</span><span class="p">));</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">tag_params</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">"tag"</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span><span class="w"> </span><span class="n">Value</span>::<span class="n">string</span><span class="p">(</span><span class="n">tag</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="n">conn</span><span class="p">.</span><span class="n">query_with_params</span><span class="p">(</span><span class="sa">r</span><span class="s">#"
</span></span></span><span class="line"><span class="cl"><span class="s"> MATCH (p:Post {id: $post_id})
</span></span></span><span class="line"><span class="cl"><span class="s"> MERGE (h:Hashtag {name: $tag})
</span></span></span><span class="line"><span class="cl"><span class="s"> ON CREATE SET h.usage_count = 1
</span></span></span><span class="line"><span class="cl"><span class="s"> ON MATCH SET h.usage_count = h.usage_count + 1
</span></span></span><span class="line"><span class="cl"><span class="s"> CREATE (p)-[:TAGGED]->(h)
</span></span></span><span class="line"><span class="cl"><span class="s"> "#</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">tag_params</span><span class="p">).</span><span class="k">await</span><span class="o">?</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></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// Link mentions
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">username</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="o">&</span><span class="n">mentions</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="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">mention_params</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">HashMap</span>::<span class="n">new</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">mention_params</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">"post_id"</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span><span class="w"> </span><span class="n">Value</span>::<span class="n">string</span><span class="p">(</span><span class="o">&</span><span class="n">post_id</span><span class="p">));</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">mention_params</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">"username"</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span><span class="w"> </span><span class="n">Value</span>::<span class="n">string</span><span class="p">(</span><span class="n">username</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="kd">let</span><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">query_with_params</span><span class="p">(</span><span class="sa">r</span><span class="s">#"
</span></span></span><span class="line"><span class="cl"><span class="s"> MATCH (p:Post {id: $post_id})
</span></span></span><span class="line"><span class="cl"><span class="s"> MATCH (mentioned:User {username: $username})
</span></span></span><span class="line"><span class="cl"><span class="s"> CREATE (p)-[:MENTIONS]->(mentioned)
</span></span></span><span class="line"><span class="cl"><span class="s"> "#</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">mention_params</span><span class="p">).</span><span class="k">await</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></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">commit</span><span class="p">().</span><span class="k">await</span><span class="o">?</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="nb">Ok</span><span class="p">(</span><span class="n">post_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="w">
</span></span></span></code></pre></div>
</div><div
class="tab-pane fade"
id="tabs-1774880884055105829-tab-3"
role="tabpanel"
aria-labelledby="tabs-1774880884055105829-tab-3-tab"
>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">extractHashtags</span><span class="p">(</span><span class="nx">content</span>: <span class="kt">string</span><span class="p">)</span><span class="o">:</span> <span class="kt">string</span><span class="p">[]</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kr">const</span> <span class="nx">matches</span> <span class="o">=</span> <span class="nx">content</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="sr">/#(\w+)/g</span><span class="p">)</span> <span class="o">||</span> <span class="p">[];</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">matches</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">tag</span> <span class="o">=></span> <span class="nx">tag</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="mi">1</span><span class="p">).</span><span class="nx">toLowerCase</span><span class="p">());</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">function</span> <span class="nx">extractMentions</span><span class="p">(</span><span class="nx">content</span>: <span class="kt">string</span><span class="p">)</span><span class="o">:</span> <span class="kt">string</span><span class="p">[]</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kr">const</span> <span class="nx">matches</span> <span class="o">=</span> <span class="nx">content</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="sr">/@(\w+)/g</span><span class="p">)</span> <span class="o">||</span> <span class="p">[];</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">matches</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">mention</span> <span class="o">=></span> <span class="nx">mention</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="mi">1</span><span class="p">));</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">async</span> <span class="kd">function</span> <span class="nx">createPost</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="nx">client</span>: <span class="kt">Client</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">authorId</span>: <span class="kt">string</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">content</span>: <span class="kt">string</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">visibility</span>: <span class="kt">string</span> <span class="o">=</span> <span class="s1">'public'</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span><span class="o">:</span> <span class="nx">Promise</span><span class="o"><</span><span class="p">{</span> <span class="nx">id</span>: <span class="kt">string</span><span class="p">;</span> <span class="nx">hashtags</span>: <span class="kt">string</span><span class="p">[];</span> <span class="nx">mentions</span>: <span class="kt">string</span><span class="p">[]</span> <span class="p">}</span><span class="o">></span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kr">const</span> <span class="nx">postId</span> <span class="o">=</span> <span class="nx">uuidv4</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"> <span class="kr">const</span> <span class="nx">hashtags</span> <span class="o">=</span> <span class="nx">extractHashtags</span><span class="p">(</span><span class="nx">content</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"> <span class="kr">const</span> <span class="nx">mentions</span> <span class="o">=</span> <span class="nx">extractMentions</span><span class="p">(</span><span class="nx">content</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="nx">client</span><span class="p">.</span><span class="nx">withTransaction</span><span class="p">(</span><span class="kr">async</span> <span class="p">(</span><span class="nx">tx</span><span class="p">)</span> <span class="o">=></span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="c1">// Create post
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="k">await</span> <span class="nx">tx</span><span class="p">.</span><span class="nx">exec</span><span class="p">(</span><span class="sb">`
</span></span></span><span class="line"><span class="cl"><span class="sb"> MATCH (author:User {id: $author_id})
</span></span></span><span class="line"><span class="cl"><span class="sb"> CREATE (p:Post {
</span></span></span><span class="line"><span class="cl"><span class="sb"> id: $post_id,
</span></span></span><span class="line"><span class="cl"><span class="sb"> content: $content,
</span></span></span><span class="line"><span class="cl"><span class="sb"> visibility: $visibility,
</span></span></span><span class="line"><span class="cl"><span class="sb"> reply_count: 0,
</span></span></span><span class="line"><span class="cl"><span class="sb"> like_count: 0,
</span></span></span><span class="line"><span class="cl"><span class="sb"> share_count: 0,
</span></span></span><span class="line"><span class="cl"><span class="sb"> created_at: timestamp()
</span></span></span><span class="line"><span class="cl"><span class="sb"> })
</span></span></span><span class="line"><span class="cl"><span class="sb"> CREATE (author)-[:POSTED {timestamp: timestamp()}]->(p)
</span></span></span><span class="line"><span class="cl"><span class="sb"> `</span><span class="p">,</span> <span class="p">{</span> <span class="nx">params</span><span class="o">:</span> <span class="p">{</span> <span class="nx">author_id</span>: <span class="kt">authorId</span><span class="p">,</span> <span class="nx">post_id</span>: <span class="kt">postId</span><span class="p">,</span> <span class="nx">content</span><span class="p">,</span> <span class="nx">visibility</span> <span class="p">}</span> <span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1">// Link hashtags
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="k">for</span> <span class="p">(</span><span class="kr">const</span> <span class="nx">tag</span> <span class="k">of</span> <span class="nx">hashtags</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="nx">tx</span><span class="p">.</span><span class="nx">exec</span><span class="p">(</span><span class="sb">`
</span></span></span><span class="line"><span class="cl"><span class="sb"> MATCH (p:Post {id: $post_id})
</span></span></span><span class="line"><span class="cl"><span class="sb"> MERGE (h:Hashtag {name: $tag})
</span></span></span><span class="line"><span class="cl"><span class="sb"> ON CREATE SET h.usage_count = 1
</span></span></span><span class="line"><span class="cl"><span class="sb"> ON MATCH SET h.usage_count = h.usage_count + 1
</span></span></span><span class="line"><span class="cl"><span class="sb"> CREATE (p)-[:TAGGED]->(h)
</span></span></span><span class="line"><span class="cl"><span class="sb"> `</span><span class="p">,</span> <span class="p">{</span> <span class="nx">params</span><span class="o">:</span> <span class="p">{</span> <span class="nx">post_id</span>: <span class="kt">postId</span><span class="p">,</span> <span class="nx">tag</span> <span class="p">}</span> <span class="p">});</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="c1">// Link mentions
</span></span></span><span class="line"><span class="cl"><span class="c1"></span> <span class="k">for</span> <span class="p">(</span><span class="kr">const</span> <span class="nx">username</span> <span class="k">of</span> <span class="nx">mentions</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">await</span> <span class="nx">tx</span><span class="p">.</span><span class="nx">exec</span><span class="p">(</span><span class="sb">`
</span></span></span><span class="line"><span class="cl"><span class="sb"> MATCH (p:Post {id: $post_id})
</span></span></span><span class="line"><span class="cl"><span class="sb"> MATCH (mentioned:User {username: $username})
</span></span></span><span class="line"><span class="cl"><span class="sb"> CREATE (p)-[:MENTIONS]->(mentioned)
</span></span></span><span class="line"><span class="cl"><span class="sb"> `</span><span class="p">,</span> <span class="p">{</span> <span class="nx">params</span><span class="o">:</span> <span class="p">{</span> <span class="nx">post_id</span>: <span class="kt">postId</span><span class="p">,</span> <span class="nx">username</span> <span class="p">}</span> <span class="p">});</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="p">});</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="p">{</span> <span class="nx">id</span>: <span class="kt">postId</span><span class="p">,</span> <span class="nx">hashtags</span><span class="p">,</span> <span class="nx">mentions</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>
</div><div
class="tab-pane fade"
id="tabs-1774880884055105829-tab-4"
role="tabpanel"
aria-labelledby="tabs-1774880884055105829-tab-4-tab"
>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-zig" data-lang="zig"><span class="line"><span class="cl"><span class="kr">const</span><span class="w"> </span><span class="n">std</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">@import</span><span class="p">(</span><span class="s">"std"</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">const</span><span class="w"> </span><span class="n">geode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">@import</span><span class="p">(</span><span class="s">"geode_client"</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="k">fn</span><span class="w"> </span><span class="n">extractHashtags</span><span class="p">(</span><span class="n">allocator</span><span class="o">:</span><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">mem</span><span class="p">.</span><span class="n">Allocator</span><span class="p">,</span><span class="w"> </span><span class="n">content</span><span class="o">:</span><span class="w"> </span><span class="p">[]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</span><span class="p">)</span><span class="w"> </span><span class="o">!</span><span class="n">std</span><span class="p">.</span><span class="n">ArrayList</span><span class="p">([]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</span><span class="p">)</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="kr">var</span><span class="w"> </span><span class="n">hashtags</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">ArrayList</span><span class="p">([]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</span><span class="p">).</span><span class="n">init</span><span class="p">(</span><span class="n">allocator</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="kr">var</span><span class="w"> </span><span class="n">i</span><span class="o">:</span><span class="w"> </span><span class="kt">usize</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">content</span><span class="p">.</span><span class="n">len</span><span class="p">)</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="p">(</span><span class="n">i</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mi">1</span><span class="p">)</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="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">content</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s">'#'</span><span class="p">)</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="kr">const</span><span class="w"> </span><span class="n">start</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kr">var</span><span class="w"> </span><span class="n">end</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">start</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">end</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">content</span><span class="p">.</span><span class="n">len</span><span class="w"> </span><span class="k">and</span><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">ascii</span><span class="p">.</span><span class="n">isAlphanumeric</span><span class="p">(</span><span class="n">content</span><span class="p">[</span><span class="n">end</span><span class="p">]))</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="p">(</span><span class="n">end</span><span class="w"> </span><span class="o">+=</span><span class="w"> </span><span class="mi">1</span><span class="p">)</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="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">end</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="n">start</span><span class="p">)</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="kr">const</span><span class="w"> </span><span class="n">tag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">allocator</span><span class="p">.</span><span class="n">dupe</span><span class="p">(</span><span class="kt">u8</span><span class="p">,</span><span class="w"> </span><span class="n">content</span><span class="p">[</span><span class="n">start</span><span class="p">..</span><span class="n">end</span><span class="p">]);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">hashtags</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">tag</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="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">end</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="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="k">return</span><span class="w"> </span><span class="n">hashtags</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></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">createPost</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">client</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">geode</span><span class="p">.</span><span class="n">GeodeClient</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">allocator</span><span class="o">:</span><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">mem</span><span class="p">.</span><span class="n">Allocator</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">author_id</span><span class="o">:</span><span class="w"> </span><span class="p">[]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">content</span><span class="o">:</span><span class="w"> </span><span class="p">[]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">visibility</span><span class="o">:</span><span class="w"> </span><span class="p">[]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</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 class="o">!</span><span class="p">[]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</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="kr">const</span><span class="w"> </span><span class="n">post_id</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">uuid</span><span class="p">.</span><span class="n">v4</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kr">var</span><span class="w"> </span><span class="n">hashtags</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">extractHashtags</span><span class="p">(</span><span class="n">allocator</span><span class="p">,</span><span class="w"> </span><span class="n">content</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">defer</span><span class="w"> </span><span class="n">hashtags</span><span class="p">.</span><span class="n">deinit</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="c1">// Begin transaction
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">sendBegin</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">receiveMessage</span><span class="p">(</span><span class="mi">30000</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="c1">// Create post
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="kr">var</span><span class="w"> </span><span class="n">params</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">json</span><span class="p">.</span><span class="n">ObjectMap</span><span class="p">.</span><span class="n">init</span><span class="p">(</span><span class="n">allocator</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">defer</span><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">deinit</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s">"author_id"</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="w"> </span><span class="p">.</span><span class="n">string</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">author_id</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="k">try</span><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s">"post_id"</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="w"> </span><span class="p">.</span><span class="n">string</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&</span><span class="n">post_id</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="k">try</span><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s">"content"</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="w"> </span><span class="p">.</span><span class="n">string</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">content</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="k">try</span><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s">"visibility"</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="w"> </span><span class="p">.</span><span class="n">string</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">visibility</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></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">sendRunGql</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\MATCH (author:User {id: $author_id})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\CREATE (p:Post {</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ id: $post_id,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ content: $content,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ visibility: $visibility,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ reply_count: 0,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ like_count: 0,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ share_count: 0,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ created_at: timestamp()</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\CREATE (author)-[:POSTED {timestamp: timestamp()}]->(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 class="p">.{</span><span class="w"> </span><span class="p">.</span><span class="n">object</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">params</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="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">receiveMessage</span><span class="p">(</span><span class="mi">30000</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="c1">// Link hashtags
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">hashtags</span><span class="p">.</span><span class="n">items</span><span class="p">)</span><span class="w"> </span><span class="o">|</span><span class="n">tag</span><span class="o">|</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="kr">var</span><span class="w"> </span><span class="n">tag_params</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">json</span><span class="p">.</span><span class="n">ObjectMap</span><span class="p">.</span><span class="n">init</span><span class="p">(</span><span class="n">allocator</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">defer</span><span class="w"> </span><span class="n">tag_params</span><span class="p">.</span><span class="n">deinit</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">tag_params</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s">"post_id"</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="w"> </span><span class="p">.</span><span class="n">string</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">&</span><span class="n">post_id</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="k">try</span><span class="w"> </span><span class="n">tag_params</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s">"tag"</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="w"> </span><span class="p">.</span><span class="n">string</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">tag</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></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">sendRunGql</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\MATCH (p:Post {id: $post_id})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\MERGE (h:Hashtag {name: $tag})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ON CREATE SET h.usage_count = 1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ON MATCH SET h.usage_count = h.usage_count + 1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\CREATE (p)-[:TAGGED]->(h)</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 class="p">.{</span><span class="w"> </span><span class="p">.</span><span class="n">object</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">tag_params</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="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">receiveMessage</span><span class="p">(</span><span class="mi">30000</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></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// Commit transaction
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">sendCommit</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">receiveMessage</span><span class="p">(</span><span class="mi">30000</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="k">return</span><span class="w"> </span><span class="o">&</span><span class="n">post_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="w">
</span></span></span></code></pre></div>
</div></div>
</div>
<h4 id="like-post" class="position-relative d-flex align-items-center group">
<span>Like Post</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="like-post"
aria-haspopup="dialog"
aria-label="Share link: Like Post">
<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">Like</span><span class="w"> </span><span class="py">a</span><span class="w"> </span><span class="py">post</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="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="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">post</span><span class="p">:</span><span class="nc">Post</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">$post_id</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">WHERE</span><span class="w"> </span><span class="py">NOT</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">LIKES</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">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">CREATE</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">LIKES</span><span class="w"> </span><span class="p">{</span><span class="py">timestamp</span><span class="p">:</span><span class="w"> </span><span class="nc">timestamp</span><span class="p">()}]</span><span class="err">-></span><span class="p">(</span><span class="py">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">SET</span><span class="w"> </span><span class="py">post</span><span class="err">.</span><span class="py">like_count</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">post</span><span class="err">.</span><span class="py">like_count</span><span class="w"> </span><span class="err">+</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 class="py">RETURN</span><span class="w"> </span><span class="py">post</span><span class="err">.</span><span class="py">like_count</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">likes</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="add-comment" class="position-relative d-flex align-items-center group">
<span>Add Comment</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="add-comment"
aria-haspopup="dialog"
aria-label="Share link: Add Comment">
<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">Add</span><span class="w"> </span><span class="py">comment</span><span class="w"> </span><span class="py">to</span><span class="w"> </span><span class="py">post</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">author</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">$author_id</span><span class="p">})</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">post</span><span class="p">:</span><span class="nc">Post</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">$post_id</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">c</span><span class="p">:</span><span class="nc">Comment</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">id</span><span class="p">:</span><span class="w"> </span><span class="nv">$comment_id</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">content</span><span class="p">:</span><span class="w"> </span><span class="nv">$content</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">like_count</span><span class="p">:</span><span class="w"> </span><span class="nc">0</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">created_at</span><span class="p">:</span><span class="w"> </span><span class="nc">timestamp</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">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">author</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">COMMENTED</span><span class="w"> </span><span class="p">{</span><span class="py">timestamp</span><span class="p">:</span><span class="w"> </span><span class="nc">timestamp</span><span class="p">()}]</span><span class="err">-></span><span class="p">(</span><span class="py">c</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">c</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">ON</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">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">SET</span><span class="w"> </span><span class="py">post</span><span class="err">.</span><span class="py">reply_count</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">post</span><span class="err">.</span><span class="py">reply_count</span><span class="w"> </span><span class="err">+</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 class="py">RETURN</span><span class="w"> </span><span class="py">c</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="feed-generation" class="position-relative d-flex align-items-center group">
<span>Feed Generation</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="feed-generation"
aria-haspopup="dialog"
aria-label="Share link: Feed Generation">
<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="home-feed" class="position-relative d-flex align-items-center group">
<span>Home Feed</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="home-feed"
aria-haspopup="dialog"
aria-label="Share link: Home Feed">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><p>The home feed shows posts from users you follow, ordered by recency.</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">Get</span><span class="w"> </span><span class="py">home</span><span class="w"> </span><span class="py">feed</span><span class="w"> </span><span class="py">for</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">me</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">-></span><span class="p">(</span><span class="nc">followed</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">followed</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">-></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">WHERE</span><span class="w"> </span><span class="py">post</span><span class="err">.</span><span class="py">visibility</span><span class="w"> </span><span class="py">IN</span><span class="w"> </span><span class="p">[</span><span class="err">'</span><span class="py">public</span><span class="err">'</span><span class="p">,</span><span class="w"> </span><span class="err">'</span><span class="py">friends</span><span class="err">'</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">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"><-</span><span class="p">[</span><span class="py">like</span><span class="p">:</span><span class="nc">LIKES</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">me</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"><-</span><span class="p">[:</span><span class="nc">POSTED</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">author</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">post</span><span class="err">.</span><span class="py">id</span><span class="w"> </span><span class="py">AS</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">post</span><span class="err">.</span><span class="py">content</span><span class="w"> </span><span class="py">AS</span><span class="w"> </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">created_at</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">created_at</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">like_count</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">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">post</span><span class="err">.</span><span class="py">reply_count</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">replies</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">author</span><span class="err">.</span><span class="py">username</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">author_username</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">author</span><span class="err">.</span><span class="py">display_name</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">author_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">author</span><span class="err">.</span><span class="py">avatar_url</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">author_avatar</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">like</span><span class="w"> </span><span class="py">IS</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="py">NULL</span><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="py">true</span><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="py">false</span><span class="w"> </span><span class="py">END</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">liked_by_me</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">created_at</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="nv">$limit</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">OFFSET</span><span class="w"> </span><span class="nv">$offset</span><span class="w">
</span></span></span></code></pre></div><div class="docs-tabs mb-4">
<ul class="nav nav-tabs" id="tabs-1774880884107607684" role="tablist"><li class="nav-item" role="presentation">
<button
class="nav-link active"
id="tabs-1774880884107607684-tab-0-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884107607684-tab-0"
type="button"
role="tab"
aria-controls="tabs-1774880884107607684-tab-0"
aria-selected="true"
>
Go
</button>
</li><li class="nav-item" role="presentation">
<button
class="nav-link"
id="tabs-1774880884107607684-tab-1-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884107607684-tab-1"
type="button"
role="tab"
aria-controls="tabs-1774880884107607684-tab-1"
aria-selected="false"
>
Python
</button>
</li><li class="nav-item" role="presentation">
<button
class="nav-link"
id="tabs-1774880884107607684-tab-2-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884107607684-tab-2"
type="button"
role="tab"
aria-controls="tabs-1774880884107607684-tab-2"
aria-selected="false"
>
Rust
</button>
</li><li class="nav-item" role="presentation">
<button
class="nav-link"
id="tabs-1774880884107607684-tab-3-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884107607684-tab-3"
type="button"
role="tab"
aria-controls="tabs-1774880884107607684-tab-3"
aria-selected="false"
>
Node.js
</button>
</li><li class="nav-item" role="presentation">
<button
class="nav-link"
id="tabs-1774880884107607684-tab-4-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884107607684-tab-4"
type="button"
role="tab"
aria-controls="tabs-1774880884107607684-tab-4"
aria-selected="false"
>
Zig
</button>
</li></ul>
<div class="tab-content border border-top-0 rounded-bottom p-3" id="tabs-1774880884107607684-content"><div
class="tab-pane fade show active"
id="tabs-1774880884107607684-tab-0"
role="tabpanel"
aria-labelledby="tabs-1774880884107607684-tab-0-tab"
>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">FeedItem</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">ID</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl"> <span class="nx">Content</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl"> <span class="nx">CreatedAt</span> <span class="nx">time</span><span class="p">.</span><span class="nx">Time</span>
</span></span><span class="line"><span class="cl"> <span class="nx">Likes</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl"> <span class="nx">Replies</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl"> <span class="nx">AuthorUsername</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl"> <span class="nx">AuthorName</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl"> <span class="nx">AuthorAvatar</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl"> <span class="nx">LikedByMe</span> <span class="kt">bool</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">GetHomeFeed</span><span class="p">(</span><span class="nx">ctx</span> <span class="nx">context</span><span class="p">.</span><span class="nx">Context</span><span class="p">,</span> <span class="nx">db</span> <span class="o">*</span><span class="nx">sql</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">userID</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">limit</span><span class="p">,</span> <span class="nx">offset</span> <span class="kt">int</span><span class="p">)</span> <span class="p">([]</span><span class="nx">FeedItem</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">rows</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nf">QueryContext</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span> <span class="s">`
</span></span></span><span class="line"><span class="cl"><span class="s"> MATCH (me:User {id: ?})-[:FOLLOWS]->(followed:User)
</span></span></span><span class="line"><span class="cl"><span class="s"> MATCH (followed)-[:POSTED]->(post:Post)
</span></span></span><span class="line"><span class="cl"><span class="s"> WHERE post.visibility IN ['public', 'friends']
</span></span></span><span class="line"><span class="cl"><span class="s"> OPTIONAL MATCH (post)<-[like:LIKES]-(me)
</span></span></span><span class="line"><span class="cl"><span class="s"> OPTIONAL MATCH (post)<-[:POSTED]-(author:User)
</span></span></span><span class="line"><span class="cl"><span class="s"> RETURN
</span></span></span><span class="line"><span class="cl"><span class="s"> post.id AS id,
</span></span></span><span class="line"><span class="cl"><span class="s"> post.content AS content,
</span></span></span><span class="line"><span class="cl"><span class="s"> post.created_at AS created_at,
</span></span></span><span class="line"><span class="cl"><span class="s"> post.like_count AS likes,
</span></span></span><span class="line"><span class="cl"><span class="s"> post.reply_count AS replies,
</span></span></span><span class="line"><span class="cl"><span class="s"> author.username AS author_username,
</span></span></span><span class="line"><span class="cl"><span class="s"> author.display_name AS author_name,
</span></span></span><span class="line"><span class="cl"><span class="s"> author.avatar_url AS author_avatar,
</span></span></span><span class="line"><span class="cl"><span class="s"> CASE WHEN like IS NOT NULL THEN true ELSE false END AS liked_by_me
</span></span></span><span class="line"><span class="cl"><span class="s"> ORDER BY post.created_at DESC
</span></span></span><span class="line"><span class="cl"><span class="s"> LIMIT ?
</span></span></span><span class="line"><span class="cl"><span class="s"> OFFSET ?
</span></span></span><span class="line"><span class="cl"><span class="s"> `</span><span class="p">,</span> <span class="nx">userID</span><span class="p">,</span> <span class="nx">limit</span><span class="p">,</span> <span class="nx">offset</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">err</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="k">defer</span> <span class="nx">rows</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="kd">var</span> <span class="nx">feed</span> <span class="p">[]</span><span class="nx">FeedItem</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="nx">rows</span><span class="p">.</span><span class="nf">Next</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kd">var</span> <span class="nx">item</span> <span class="nx">FeedItem</span>
</span></span><span class="line"><span class="cl"> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">rows</span><span class="p">.</span><span class="nf">Scan</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="o">&</span><span class="nx">item</span><span class="p">.</span><span class="nx">ID</span><span class="p">,</span> <span class="o">&</span><span class="nx">item</span><span class="p">.</span><span class="nx">Content</span><span class="p">,</span> <span class="o">&</span><span class="nx">item</span><span class="p">.</span><span class="nx">CreatedAt</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="o">&</span><span class="nx">item</span><span class="p">.</span><span class="nx">Likes</span><span class="p">,</span> <span class="o">&</span><span class="nx">item</span><span class="p">.</span><span class="nx">Replies</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="o">&</span><span class="nx">item</span><span class="p">.</span><span class="nx">AuthorUsername</span><span class="p">,</span> <span class="o">&</span><span class="nx">item</span><span class="p">.</span><span class="nx">AuthorName</span><span class="p">,</span> <span class="o">&</span><span class="nx">item</span><span class="p">.</span><span class="nx">AuthorAvatar</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="o">&</span><span class="nx">item</span><span class="p">.</span><span class="nx">LikedByMe</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">err</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="nx">feed</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">feed</span><span class="p">,</span> <span class="nx">item</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">feed</span><span class="p">,</span> <span class="kc">nil</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>
</div><div
class="tab-pane fade"
id="tabs-1774880884107607684-tab-1"
role="tabpanel"
aria-labelledby="tabs-1774880884107607684-tab-1-tab"
>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">dataclasses</span> <span class="kn">import</span> <span class="n">dataclass</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span>
</span></span><span class="line"><span class="cl"><span class="kn">from</span> <span class="nn">typing</span> <span class="kn">import</span> <span class="n">List</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="nd">@dataclass</span>
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">FeedItem</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="nb">id</span><span class="p">:</span> <span class="nb">str</span>
</span></span><span class="line"><span class="cl"> <span class="n">content</span><span class="p">:</span> <span class="nb">str</span>
</span></span><span class="line"><span class="cl"> <span class="n">created_at</span><span class="p">:</span> <span class="n">datetime</span>
</span></span><span class="line"><span class="cl"> <span class="n">likes</span><span class="p">:</span> <span class="nb">int</span>
</span></span><span class="line"><span class="cl"> <span class="n">replies</span><span class="p">:</span> <span class="nb">int</span>
</span></span><span class="line"><span class="cl"> <span class="n">author_username</span><span class="p">:</span> <span class="nb">str</span>
</span></span><span class="line"><span class="cl"> <span class="n">author_name</span><span class="p">:</span> <span class="nb">str</span>
</span></span><span class="line"><span class="cl"> <span class="n">author_avatar</span><span class="p">:</span> <span class="nb">str</span>
</span></span><span class="line"><span class="cl"> <span class="n">liked_by_me</span><span class="p">:</span> <span class="nb">bool</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">get_home_feed</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">user_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">limit</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">20</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">offset</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span> <span class="o">-></span> <span class="n">List</span><span class="p">[</span><span class="n">FeedItem</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Get personalized home feed for a user."""</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (me:User {id: $user_id})-[:FOLLOWS]->(followed:User)
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (followed)-[:POSTED]->(post:Post)
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE post.visibility IN ['public', 'friends']
</span></span></span><span class="line"><span class="cl"><span class="s2"> OPTIONAL MATCH (post)<-[like:LIKES]-(me)
</span></span></span><span class="line"><span class="cl"><span class="s2"> OPTIONAL MATCH (post)<-[:POSTED]-(author:User)
</span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN
</span></span></span><span class="line"><span class="cl"><span class="s2"> post.id AS id,
</span></span></span><span class="line"><span class="cl"><span class="s2"> post.content AS content,
</span></span></span><span class="line"><span class="cl"><span class="s2"> post.created_at AS created_at,
</span></span></span><span class="line"><span class="cl"><span class="s2"> post.like_count AS likes,
</span></span></span><span class="line"><span class="cl"><span class="s2"> post.reply_count AS replies,
</span></span></span><span class="line"><span class="cl"><span class="s2"> author.username AS author_username,
</span></span></span><span class="line"><span class="cl"><span class="s2"> author.display_name AS author_name,
</span></span></span><span class="line"><span class="cl"><span class="s2"> author.avatar_url AS author_avatar,
</span></span></span><span class="line"><span class="cl"><span class="s2"> CASE WHEN like IS NOT NULL THEN true ELSE false END AS liked_by_me
</span></span></span><span class="line"><span class="cl"><span class="s2"> ORDER BY post.created_at DESC
</span></span></span><span class="line"><span class="cl"><span class="s2"> LIMIT $limit
</span></span></span><span class="line"><span class="cl"><span class="s2"> OFFSET $offset
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span><span class="s2">"user_id"</span><span class="p">:</span> <span class="n">user_id</span><span class="p">,</span> <span class="s2">"limit"</span><span class="p">:</span> <span class="n">limit</span><span class="p">,</span> <span class="s2">"offset"</span><span class="p">:</span> <span class="n">offset</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="n">feed</span> <span class="o">=</span> <span class="p">[]</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">feed</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">FeedItem</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="nb">id</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">'id'</span><span class="p">]</span><span class="o">.</span><span class="n">as_string</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">content</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">'content'</span><span class="p">]</span><span class="o">.</span><span class="n">as_string</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">created_at</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">'created_at'</span><span class="p">]</span><span class="o">.</span><span class="n">as_datetime</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">likes</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">'likes'</span><span class="p">]</span><span class="o">.</span><span class="n">as_int</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">replies</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">'replies'</span><span class="p">]</span><span class="o">.</span><span class="n">as_int</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">author_username</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">'author_username'</span><span class="p">]</span><span class="o">.</span><span class="n">as_string</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">author_name</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">'author_name'</span><span class="p">]</span><span class="o">.</span><span class="n">as_string</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">author_avatar</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">'author_avatar'</span><span class="p">]</span><span class="o">.</span><span class="n">as_string</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">liked_by_me</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">'liked_by_me'</span><span class="p">]</span><span class="o">.</span><span class="n">as_bool</span>
</span></span><span class="line"><span class="cl"> <span class="p">))</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="n">feed</span>
</span></span></code></pre></div>
</div><div
class="tab-pane fade"
id="tabs-1774880884107607684-tab-2"
role="tabpanel"
aria-labelledby="tabs-1774880884107607684-tab-2-tab"
>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="cp">#[derive(Debug)]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">struct</span> <span class="nc">FeedItem</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="n">id</span>: <span class="nb">String</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">content</span>: <span class="nb">String</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">created_at</span>: <span class="kt">i64</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">likes</span>: <span class="kt">i64</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">replies</span>: <span class="kt">i64</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">author_username</span>: <span class="nb">String</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">author_name</span>: <span class="nb">String</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">author_avatar</span>: <span class="nb">String</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">liked_by_me</span>: <span class="kt">bool</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></span><span class="line"><span class="cl"><span class="w"></span><span class="k">async</span><span class="w"> </span><span class="k">fn</span> <span class="nf">get_home_feed</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">conn</span>: <span class="kp">&</span><span class="nc">mut</span><span class="w"> </span><span class="n">geode_client</span>::<span class="n">Connection</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">user_id</span>: <span class="kp">&</span><span class="kt">str</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">limit</span>: <span class="kt">i64</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">offset</span>: <span class="kt">i64</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 class="nb">Result</span><span class="o"><</span><span class="nb">Vec</span><span class="o"><</span><span class="n">FeedItem</span><span class="o">></span><span class="p">,</span><span class="w"> </span><span class="nb">Box</span><span class="o"><</span><span class="k">dyn</span><span class="w"> </span><span class="n">std</span>::<span class="n">error</span>::<span class="n">Error</span><span class="o">>></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="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">params</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">HashMap</span>::<span class="n">new</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">"user_id"</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span><span class="w"> </span><span class="n">Value</span>::<span class="n">string</span><span class="p">(</span><span class="n">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="n">params</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">"limit"</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span><span class="w"> </span><span class="n">Value</span>::<span class="n">int</span><span class="p">(</span><span class="n">limit</span><span class="p">));</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">"offset"</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span><span class="w"> </span><span class="n">Value</span>::<span class="n">int</span><span class="p">(</span><span class="n">offset</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="kd">let</span><span class="w"> </span><span class="p">(</span><span class="n">page</span><span class="p">,</span><span class="w"> </span><span class="n">_</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">query_with_params</span><span class="p">(</span><span class="sa">r</span><span class="s">#"
</span></span></span><span class="line"><span class="cl"><span class="s"> MATCH (me:User {id: $user_id})-[:FOLLOWS]->(followed:User)
</span></span></span><span class="line"><span class="cl"><span class="s"> MATCH (followed)-[:POSTED]->(post:Post)
</span></span></span><span class="line"><span class="cl"><span class="s"> WHERE post.visibility IN ['public', 'friends']
</span></span></span><span class="line"><span class="cl"><span class="s"> OPTIONAL MATCH (post)<-[like:LIKES]-(me)
</span></span></span><span class="line"><span class="cl"><span class="s"> OPTIONAL MATCH (post)<-[:POSTED]-(author:User)
</span></span></span><span class="line"><span class="cl"><span class="s"> RETURN
</span></span></span><span class="line"><span class="cl"><span class="s"> post.id AS id,
</span></span></span><span class="line"><span class="cl"><span class="s"> post.content AS content,
</span></span></span><span class="line"><span class="cl"><span class="s"> post.created_at AS created_at,
</span></span></span><span class="line"><span class="cl"><span class="s"> post.like_count AS likes,
</span></span></span><span class="line"><span class="cl"><span class="s"> post.reply_count AS replies,
</span></span></span><span class="line"><span class="cl"><span class="s"> author.username AS author_username,
</span></span></span><span class="line"><span class="cl"><span class="s"> author.display_name AS author_name,
</span></span></span><span class="line"><span class="cl"><span class="s"> author.avatar_url AS author_avatar,
</span></span></span><span class="line"><span class="cl"><span class="s"> CASE WHEN like IS NOT NULL THEN true ELSE false END AS liked_by_me
</span></span></span><span class="line"><span class="cl"><span class="s"> ORDER BY post.created_at DESC
</span></span></span><span class="line"><span class="cl"><span class="s"> LIMIT $limit
</span></span></span><span class="line"><span class="cl"><span class="s"> OFFSET $offset
</span></span></span><span class="line"><span class="cl"><span class="s"> "#</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">params</span><span class="p">).</span><span class="k">await</span><span class="o">?</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="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">feed</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">Vec</span>::<span class="n">new</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">row</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="o">&</span><span class="n">page</span><span class="p">.</span><span class="n">rows</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="n">feed</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">FeedItem</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="n">id</span>: <span class="nc">row</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"id"</span><span class="p">).</span><span class="n">unwrap</span><span class="p">().</span><span class="n">as_string</span><span class="p">()</span><span class="o">?</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">content</span>: <span class="nc">row</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"content"</span><span class="p">).</span><span class="n">unwrap</span><span class="p">().</span><span class="n">as_string</span><span class="p">()</span><span class="o">?</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">created_at</span>: <span class="nc">row</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"created_at"</span><span class="p">).</span><span class="n">unwrap</span><span class="p">().</span><span class="n">as_int</span><span class="p">()</span><span class="o">?</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">likes</span>: <span class="nc">row</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"likes"</span><span class="p">).</span><span class="n">unwrap</span><span class="p">().</span><span class="n">as_int</span><span class="p">()</span><span class="o">?</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">replies</span>: <span class="nc">row</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"replies"</span><span class="p">).</span><span class="n">unwrap</span><span class="p">().</span><span class="n">as_int</span><span class="p">()</span><span class="o">?</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">author_username</span>: <span class="nc">row</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"author_username"</span><span class="p">).</span><span class="n">unwrap</span><span class="p">().</span><span class="n">as_string</span><span class="p">()</span><span class="o">?</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">author_name</span>: <span class="nc">row</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"author_name"</span><span class="p">).</span><span class="n">unwrap</span><span class="p">().</span><span class="n">as_string</span><span class="p">()</span><span class="o">?</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">author_avatar</span>: <span class="nc">row</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"author_avatar"</span><span class="p">).</span><span class="n">unwrap</span><span class="p">().</span><span class="n">as_string</span><span class="p">()</span><span class="o">?</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">liked_by_me</span>: <span class="nc">row</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"liked_by_me"</span><span class="p">).</span><span class="n">unwrap</span><span class="p">().</span><span class="n">as_bool</span><span class="p">()</span><span class="o">?</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="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="nb">Ok</span><span class="p">(</span><span class="n">feed</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></code></pre></div>
</div><div
class="tab-pane fade"
id="tabs-1774880884107607684-tab-3"
role="tabpanel"
aria-labelledby="tabs-1774880884107607684-tab-3-tab"
>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kr">interface</span> <span class="nx">FeedItem</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">id</span>: <span class="kt">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="nx">content</span>: <span class="kt">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="nx">createdAt</span>: <span class="kt">Date</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="nx">likes</span>: <span class="kt">number</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="nx">replies</span>: <span class="kt">number</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="nx">authorUsername</span>: <span class="kt">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="nx">authorName</span>: <span class="kt">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="nx">authorAvatar</span>: <span class="kt">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="nx">likedByMe</span>: <span class="kt">boolean</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">async</span> <span class="kd">function</span> <span class="nx">getHomeFeed</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="nx">client</span>: <span class="kt">Client</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">userId</span>: <span class="kt">string</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">limit</span>: <span class="kt">number</span> <span class="o">=</span> <span class="mi">20</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">offset</span>: <span class="kt">number</span> <span class="o">=</span> <span class="mi">0</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span><span class="o">:</span> <span class="nx">Promise</span><span class="p"><</span><span class="nt">FeedItem</span><span class="err">[]</span><span class="p">></span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kr">const</span> <span class="nx">rows</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">client</span><span class="p">.</span><span class="nx">queryAll</span><span class="p">(</span><span class="sb">`
</span></span></span><span class="line"><span class="cl"><span class="sb"> MATCH (me:User {id: $user_id})-[:FOLLOWS]->(followed:User)
</span></span></span><span class="line"><span class="cl"><span class="sb"> MATCH (followed)-[:POSTED]->(post:Post)
</span></span></span><span class="line"><span class="cl"><span class="sb"> WHERE post.visibility IN ['public', 'friends']
</span></span></span><span class="line"><span class="cl"><span class="sb"> OPTIONAL MATCH (post)<-[like:LIKES]-(me)
</span></span></span><span class="line"><span class="cl"><span class="sb"> OPTIONAL MATCH (post)<-[:POSTED]-(author:User)
</span></span></span><span class="line"><span class="cl"><span class="sb"> RETURN
</span></span></span><span class="line"><span class="cl"><span class="sb"> post.id AS id,
</span></span></span><span class="line"><span class="cl"><span class="sb"> post.content AS content,
</span></span></span><span class="line"><span class="cl"><span class="sb"> post.created_at AS created_at,
</span></span></span><span class="line"><span class="cl"><span class="sb"> post.like_count AS likes,
</span></span></span><span class="line"><span class="cl"><span class="sb"> post.reply_count AS replies,
</span></span></span><span class="line"><span class="cl"><span class="sb"> author.username AS author_username,
</span></span></span><span class="line"><span class="cl"><span class="sb"> author.display_name AS author_name,
</span></span></span><span class="line"><span class="cl"><span class="sb"> author.avatar_url AS author_avatar,
</span></span></span><span class="line"><span class="cl"><span class="sb"> CASE WHEN like IS NOT NULL THEN true ELSE false END AS liked_by_me
</span></span></span><span class="line"><span class="cl"><span class="sb"> ORDER BY post.created_at DESC
</span></span></span><span class="line"><span class="cl"><span class="sb"> LIMIT $limit
</span></span></span><span class="line"><span class="cl"><span class="sb"> OFFSET $offset
</span></span></span><span class="line"><span class="cl"><span class="sb"> `</span><span class="p">,</span> <span class="p">{</span> <span class="nx">params</span><span class="o">:</span> <span class="p">{</span> <span class="nx">user_id</span>: <span class="kt">userId</span><span class="p">,</span> <span class="nx">limit</span><span class="p">,</span> <span class="nx">offset</span> <span class="p">}</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="nx">rows</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">row</span> <span class="o">=></span> <span class="p">({</span>
</span></span><span class="line"><span class="cl"> <span class="nx">id</span>: <span class="kt">row.get</span><span class="p">(</span><span class="s1">'id'</span><span class="p">)</span><span class="o">?</span><span class="p">.</span><span class="nx">asString</span> <span class="o">??</span> <span class="s1">''</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">content</span>: <span class="kt">row.get</span><span class="p">(</span><span class="s1">'content'</span><span class="p">)</span><span class="o">?</span><span class="p">.</span><span class="nx">asString</span> <span class="o">??</span> <span class="s1">''</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">createdAt</span>: <span class="kt">new</span> <span class="nb">Date</span><span class="p">(</span><span class="nx">row</span><span class="p">.</span><span class="kr">get</span><span class="p">(</span><span class="s1">'created_at'</span><span class="p">)</span><span class="o">?</span><span class="p">.</span><span class="nx">asNumber</span> <span class="o">??</span> <span class="mi">0</span><span class="p">),</span>
</span></span><span class="line"><span class="cl"> <span class="nx">likes</span>: <span class="kt">row.get</span><span class="p">(</span><span class="s1">'likes'</span><span class="p">)</span><span class="o">?</span><span class="p">.</span><span class="nx">asNumber</span> <span class="o">??</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">replies</span>: <span class="kt">row.get</span><span class="p">(</span><span class="s1">'replies'</span><span class="p">)</span><span class="o">?</span><span class="p">.</span><span class="nx">asNumber</span> <span class="o">??</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">authorUsername</span>: <span class="kt">row.get</span><span class="p">(</span><span class="s1">'author_username'</span><span class="p">)</span><span class="o">?</span><span class="p">.</span><span class="nx">asString</span> <span class="o">??</span> <span class="s1">''</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">authorName</span>: <span class="kt">row.get</span><span class="p">(</span><span class="s1">'author_name'</span><span class="p">)</span><span class="o">?</span><span class="p">.</span><span class="nx">asString</span> <span class="o">??</span> <span class="s1">''</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">authorAvatar</span>: <span class="kt">row.get</span><span class="p">(</span><span class="s1">'author_avatar'</span><span class="p">)</span><span class="o">?</span><span class="p">.</span><span class="nx">asString</span> <span class="o">??</span> <span class="s1">''</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">likedByMe</span>: <span class="kt">row.get</span><span class="p">(</span><span class="s1">'liked_by_me'</span><span class="p">)</span><span class="o">?</span><span class="p">.</span><span class="nx">asBool</span> <span class="o">??</span> <span class="kc">false</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">}));</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>
</div><div
class="tab-pane fade"
id="tabs-1774880884107607684-tab-4"
role="tabpanel"
aria-labelledby="tabs-1774880884107607684-tab-4-tab"
>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-zig" data-lang="zig"><span class="line"><span class="cl"><span class="kr">const</span><span class="w"> </span><span class="n">FeedItem</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">struct</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="n">id</span><span class="o">:</span><span class="w"> </span><span class="p">[]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">content</span><span class="o">:</span><span class="w"> </span><span class="p">[]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">created_at</span><span class="o">:</span><span class="w"> </span><span class="kt">i64</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">likes</span><span class="o">:</span><span class="w"> </span><span class="kt">i64</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">replies</span><span class="o">:</span><span class="w"> </span><span class="kt">i64</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">author_username</span><span class="o">:</span><span class="w"> </span><span class="p">[]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">author_name</span><span class="o">:</span><span class="w"> </span><span class="p">[]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">author_avatar</span><span class="o">:</span><span class="w"> </span><span class="p">[]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">liked_by_me</span><span class="o">:</span><span class="w"> </span><span class="kt">bool</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></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">getHomeFeed</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">client</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">geode</span><span class="p">.</span><span class="n">GeodeClient</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">allocator</span><span class="o">:</span><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">mem</span><span class="p">.</span><span class="n">Allocator</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">user_id</span><span class="o">:</span><span class="w"> </span><span class="p">[]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">limit</span><span class="o">:</span><span class="w"> </span><span class="kt">i64</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">offset</span><span class="o">:</span><span class="w"> </span><span class="kt">i64</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 class="o">!</span><span class="n">std</span><span class="p">.</span><span class="n">ArrayList</span><span class="p">(</span><span class="n">FeedItem</span><span class="p">)</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="kr">var</span><span class="w"> </span><span class="n">params</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">json</span><span class="p">.</span><span class="n">ObjectMap</span><span class="p">.</span><span class="n">init</span><span class="p">(</span><span class="n">allocator</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">defer</span><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">deinit</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s">"user_id"</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="w"> </span><span class="p">.</span><span class="n">string</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">user_id</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="k">try</span><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s">"limit"</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="w"> </span><span class="p">.</span><span class="n">integer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">limit</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="k">try</span><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s">"offset"</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="w"> </span><span class="p">.</span><span class="n">integer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">offset</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></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">sendRunGql</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\MATCH (me:User {id: $user_id})-[:FOLLOWS]->(followed:User)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\MATCH (followed)-[:POSTED]->(post:Post)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\WHERE post.visibility IN ['public', 'friends']</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\OPTIONAL MATCH (post)<-[like:LIKES]-(me)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\OPTIONAL MATCH (post)<-[:POSTED]-(author:User)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\RETURN</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ post.id AS id,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ post.content AS content,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ post.created_at AS created_at,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ post.like_count AS likes,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ post.reply_count AS replies,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ author.username AS author_username,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ author.display_name AS author_name,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ author.avatar_url AS author_avatar,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ CASE WHEN like IS NOT NULL THEN true ELSE false END AS liked_by_me</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ORDER BY post.created_at DESC</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\LIMIT $limit</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\OFFSET $offset</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 class="p">.{</span><span class="w"> </span><span class="p">.</span><span class="n">object</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">params</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></span><span class="line"><span class="cl"><span class="w"> </span><span class="kr">const</span><span class="w"> </span><span class="n">schema</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">receiveMessage</span><span class="p">(</span><span class="mi">30000</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">defer</span><span class="w"> </span><span class="n">allocator</span><span class="p">.</span><span class="n">free</span><span class="p">(</span><span class="n">schema</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="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">sendPull</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">1000</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kr">const</span><span class="w"> </span><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">receiveMessage</span><span class="p">(</span><span class="mi">30000</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">defer</span><span class="w"> </span><span class="n">allocator</span><span class="p">.</span><span class="n">free</span><span class="p">(</span><span class="n">result</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="c1">// Parse JSON result and build feed items
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="kr">var</span><span class="w"> </span><span class="n">feed</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">ArrayList</span><span class="p">(</span><span class="n">FeedItem</span><span class="p">).</span><span class="n">init</span><span class="p">(</span><span class="n">allocator</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// ... parse result JSON and populate feed ...
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">feed</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></code></pre></div>
</div></div>
</div>
<h4 id="trending-feed" class="position-relative d-flex align-items-center group">
<span>Trending Feed</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="trending-feed"
aria-haspopup="dialog"
aria-label="Share link: Trending Feed">
<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">Get</span><span class="w"> </span><span class="py">trending</span><span class="w"> </span><span class="py">posts</span><span class="w"> </span><span class="p">(</span><span class="py">most</span><span class="w"> </span><span class="py">engagement</span><span class="w"> </span><span class="py">in</span><span class="w"> </span><span class="py">last</span><span class="w"> </span><span class="py">24</span><span class="w"> </span><span class="py">hours</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">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">WHERE</span><span class="w"> </span><span class="py">post</span><span class="err">.</span><span class="py">created_at</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="py">timestamp</span><span class="p">()</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="py">duration</span><span class="p">(</span><span class="err">'</span><span class="py">P1D</span><span class="err">'</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WITH</span><span class="w"> </span><span class="py">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">post</span><span class="err">.</span><span class="py">like_count</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="py">post</span><span class="err">.</span><span class="py">reply_count</span><span class="w"> </span><span class="err">*</span><span class="w"> </span><span class="py">2</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="py">post</span><span class="err">.</span><span class="py">share_count</span><span class="w"> </span><span class="err">*</span><span class="w"> </span><span class="py">3</span><span class="w"> </span><span class="py">AS</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">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">engagement</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">50</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">post</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">-</span><span class="p">(</span><span class="py">author</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">post</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">TAGGED</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">hashtag</span><span class="p">:</span><span class="nc">Hashtag</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></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">post</span><span class="err">.</span><span class="py">id</span><span class="w"> </span><span class="py">AS</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">post</span><span class="err">.</span><span class="py">content</span><span class="w"> </span><span class="py">AS</span><span class="w"> </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">created_at</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">created_at</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">engagement</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">author</span><span class="err">.</span><span class="py">username</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">author_username</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">author</span><span class="err">.</span><span class="py">display_name</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">author_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">collect</span><span class="p">(</span><span class="py">DISTINCT</span><span class="w"> </span><span class="py">hashtag</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">hashtags</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</span><span class="w"> </span><span class="py">DESC</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="user-timeline" class="position-relative d-flex align-items-center group">
<span>User Timeline</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="user-timeline"
aria-haspopup="dialog"
aria-label="Share link: User Timeline">
<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">Get</span><span class="w"> </span><span class="py">user</span><span class="err">'</span><span class="py">s</span><span class="w"> </span><span class="py">own</span><span class="w"> </span><span class="py">posts</span><span class="w"> </span><span class="py">and</span><span class="w"> </span><span class="py">activity</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="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="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="nc">Get</span><span class="w"> </span><span class="py">posts</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">POSTED</span><span class="p">]</span><span class="err">-></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">WITH</span><span class="w"> </span><span class="py">user</span><span class="p">,</span><span class="w"> </span><span class="py">collect</span><span class="p">({</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kd">type</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">post</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">id</span><span class="p">:</span><span class="w"> </span><span class="nc">post</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">content</span><span class="p">:</span><span class="w"> </span><span class="nc">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">timestamp</span><span class="p">:</span><span class="w"> </span><span class="nc">post</span><span class="err">.</span><span class="py">created_at</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 class="py">AS</span><span class="w"> </span><span class="py">posts</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">Get</span><span class="w"> </span><span class="py">likes</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="py">like</span><span class="p">:</span><span class="nc">LIKES</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">liked_post</span><span class="p">:</span><span class="nc">Post</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">-</span><span class="p">(</span><span class="py">author</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">posts</span><span class="p">,</span><span class="w"> </span><span class="py">collect</span><span class="p">({</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kd">type</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">like</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">id</span><span class="p">:</span><span class="w"> </span><span class="nc">liked_post</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">content</span><span class="p">:</span><span class="w"> </span><span class="nc">liked_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">author</span><span class="p">:</span><span class="w"> </span><span class="nc">author</span><span class="err">.</span><span class="py">username</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">timestamp</span><span class="p">:</span><span class="w"> </span><span class="nc">like</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="p">})</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">likes</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">Combine</span><span class="w"> </span><span class="py">and</span><span class="w"> </span><span class="py">sort</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">posts</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="py">likes</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">activities</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">activities</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">activity</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">activity</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">activity</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">LIMIT</span><span class="w"> </span><span class="nv">$limit</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="friend-recommendations" class="position-relative d-flex align-items-center group">
<span>Friend 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="friend-recommendations"
aria-haspopup="dialog"
aria-label="Share link: Friend 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>
</h3>
<h4 id="friends-of-friends" class="position-relative d-flex align-items-center group">
<span>Friends of Friends</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="friends-of-friends"
aria-haspopup="dialog"
aria-label="Share link: Friends of Friends">
<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">Recommend</span><span class="w"> </span><span class="py">users</span><span class="w"> </span><span class="py">that</span><span class="w"> </span><span class="py">your</span><span class="w"> </span><span class="py">friends</span><span class="w"> </span><span class="py">follow</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">me</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">-></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">FOLLOWS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">suggestion</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">NOT</span><span class="w"> </span><span class="p">(</span><span class="py">me</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">FOLLOWS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">suggestion</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">NOT</span><span class="w"> </span><span class="p">(</span><span class="py">me</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">BLOCKS</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">suggestion</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">me</span><span class="w"> </span><span class="err"><></span><span class="w"> </span><span class="py">suggestion</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">suggestion</span><span class="p">,</span><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">friend</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">mutual_friends</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">mutual_friends</span><span class="w"> </span><span class="py">DESC</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">LIMIT</span><span class="w"> </span><span class="py">10</span><span class="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">suggestion</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">suggestion</span><span class="p">)</span><span class="err"><-</span><span class="p">[:</span><span class="nc">FOLLOWS</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">follower</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></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">suggestion</span><span class="err">.</span><span class="py">id</span><span class="w"> </span><span class="py">AS</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">suggestion</span><span class="err">.</span><span class="py">username</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">username</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">suggestion</span><span class="err">.</span><span class="py">display_name</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">display_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">suggestion</span><span class="err">.</span><span class="py">avatar_url</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">avatar_url</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">suggestion</span><span class="err">.</span><span class="py">bio</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">bio</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">mutual_friends</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">follower</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">follower_count</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="py">mutual_friends</span><span class="w"> </span><span class="py">DESC</span><span class="w">
</span></span></span></code></pre></div><div class="docs-tabs mb-4">
<ul class="nav nav-tabs" id="tabs-1774880884153894107" role="tablist"><li class="nav-item" role="presentation">
<button
class="nav-link active"
id="tabs-1774880884153894107-tab-0-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884153894107-tab-0"
type="button"
role="tab"
aria-controls="tabs-1774880884153894107-tab-0"
aria-selected="true"
>
Go
</button>
</li><li class="nav-item" role="presentation">
<button
class="nav-link"
id="tabs-1774880884153894107-tab-1-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884153894107-tab-1"
type="button"
role="tab"
aria-controls="tabs-1774880884153894107-tab-1"
aria-selected="false"
>
Python
</button>
</li><li class="nav-item" role="presentation">
<button
class="nav-link"
id="tabs-1774880884153894107-tab-2-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884153894107-tab-2"
type="button"
role="tab"
aria-controls="tabs-1774880884153894107-tab-2"
aria-selected="false"
>
Rust
</button>
</li><li class="nav-item" role="presentation">
<button
class="nav-link"
id="tabs-1774880884153894107-tab-3-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884153894107-tab-3"
type="button"
role="tab"
aria-controls="tabs-1774880884153894107-tab-3"
aria-selected="false"
>
Node.js
</button>
</li><li class="nav-item" role="presentation">
<button
class="nav-link"
id="tabs-1774880884153894107-tab-4-tab"
data-bs-toggle="tab"
data-bs-target="#tabs-1774880884153894107-tab-4"
type="button"
role="tab"
aria-controls="tabs-1774880884153894107-tab-4"
aria-selected="false"
>
Zig
</button>
</li></ul>
<div class="tab-content border border-top-0 rounded-bottom p-3" id="tabs-1774880884153894107-content"><div
class="tab-pane fade show active"
id="tabs-1774880884153894107-tab-0"
role="tabpanel"
aria-labelledby="tabs-1774880884153894107-tab-0-tab"
>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-go" data-lang="go"><span class="line"><span class="cl"><span class="kd">type</span> <span class="nx">UserSuggestion</span> <span class="kd">struct</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">ID</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl"> <span class="nx">Username</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl"> <span class="nx">DisplayName</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl"> <span class="nx">AvatarURL</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl"> <span class="nx">Bio</span> <span class="kt">string</span>
</span></span><span class="line"><span class="cl"> <span class="nx">MutualFriends</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl"> <span class="nx">FollowerCount</span> <span class="kt">int</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kd">func</span> <span class="nf">GetFriendRecommendations</span><span class="p">(</span><span class="nx">ctx</span> <span class="nx">context</span><span class="p">.</span><span class="nx">Context</span><span class="p">,</span> <span class="nx">db</span> <span class="o">*</span><span class="nx">sql</span><span class="p">.</span><span class="nx">DB</span><span class="p">,</span> <span class="nx">userID</span> <span class="kt">string</span><span class="p">,</span> <span class="nx">limit</span> <span class="kt">int</span><span class="p">)</span> <span class="p">([]</span><span class="nx">UserSuggestion</span><span class="p">,</span> <span class="kt">error</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">rows</span><span class="p">,</span> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">db</span><span class="p">.</span><span class="nf">QueryContext</span><span class="p">(</span><span class="nx">ctx</span><span class="p">,</span> <span class="s">`
</span></span></span><span class="line"><span class="cl"><span class="s"> MATCH (me:User {id: ?})-[:FOLLOWS]->(friend:User)-[:FOLLOWS]->(suggestion:User)
</span></span></span><span class="line"><span class="cl"><span class="s"> WHERE NOT (me)-[:FOLLOWS]->(suggestion)
</span></span></span><span class="line"><span class="cl"><span class="s"> AND NOT (me)-[:BLOCKS]-(suggestion)
</span></span></span><span class="line"><span class="cl"><span class="s"> AND me <> suggestion
</span></span></span><span class="line"><span class="cl"><span class="s"> WITH suggestion, count(DISTINCT friend) AS mutual_friends
</span></span></span><span class="line"><span class="cl"><span class="s"> ORDER BY mutual_friends DESC
</span></span></span><span class="line"><span class="cl"><span class="s"> LIMIT ?
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s"> MATCH (suggestion)
</span></span></span><span class="line"><span class="cl"><span class="s"> OPTIONAL MATCH (suggestion)<-[:FOLLOWS]-(follower)
</span></span></span><span class="line"><span class="cl"><span class="s"> RETURN
</span></span></span><span class="line"><span class="cl"><span class="s"> suggestion.id AS id,
</span></span></span><span class="line"><span class="cl"><span class="s"> suggestion.username AS username,
</span></span></span><span class="line"><span class="cl"><span class="s"> suggestion.display_name AS display_name,
</span></span></span><span class="line"><span class="cl"><span class="s"> suggestion.avatar_url AS avatar_url,
</span></span></span><span class="line"><span class="cl"><span class="s"> suggestion.bio AS bio,
</span></span></span><span class="line"><span class="cl"><span class="s"> mutual_friends,
</span></span></span><span class="line"><span class="cl"><span class="s"> count(DISTINCT follower) AS follower_count
</span></span></span><span class="line"><span class="cl"><span class="s"> ORDER BY mutual_friends DESC
</span></span></span><span class="line"><span class="cl"><span class="s"> `</span><span class="p">,</span> <span class="nx">userID</span><span class="p">,</span> <span class="nx">limit</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">err</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="k">defer</span> <span class="nx">rows</span><span class="p">.</span><span class="nf">Close</span><span class="p">()</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="kd">var</span> <span class="nx">suggestions</span> <span class="p">[]</span><span class="nx">UserSuggestion</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="nx">rows</span><span class="p">.</span><span class="nf">Next</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kd">var</span> <span class="nx">s</span> <span class="nx">UserSuggestion</span>
</span></span><span class="line"><span class="cl"> <span class="nx">err</span> <span class="o">:=</span> <span class="nx">rows</span><span class="p">.</span><span class="nf">Scan</span><span class="p">(</span><span class="o">&</span><span class="nx">s</span><span class="p">.</span><span class="nx">ID</span><span class="p">,</span> <span class="o">&</span><span class="nx">s</span><span class="p">.</span><span class="nx">Username</span><span class="p">,</span> <span class="o">&</span><span class="nx">s</span><span class="p">.</span><span class="nx">DisplayName</span><span class="p">,</span> <span class="o">&</span><span class="nx">s</span><span class="p">.</span><span class="nx">AvatarURL</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="o">&</span><span class="nx">s</span><span class="p">.</span><span class="nx">Bio</span><span class="p">,</span> <span class="o">&</span><span class="nx">s</span><span class="p">.</span><span class="nx">MutualFriends</span><span class="p">,</span> <span class="o">&</span><span class="nx">s</span><span class="p">.</span><span class="nx">FollowerCount</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">if</span> <span class="nx">err</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="kc">nil</span><span class="p">,</span> <span class="nx">err</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl"> <span class="nx">suggestions</span> <span class="p">=</span> <span class="nb">append</span><span class="p">(</span><span class="nx">suggestions</span><span class="p">,</span> <span class="nx">s</span><span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="nx">suggestions</span><span class="p">,</span> <span class="kc">nil</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>
</div><div
class="tab-pane fade"
id="tabs-1774880884153894107-tab-1"
role="tabpanel"
aria-labelledby="tabs-1774880884153894107-tab-1-tab"
>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-python" data-lang="python"><span class="line"><span class="cl"><span class="nd">@dataclass</span>
</span></span><span class="line"><span class="cl"><span class="k">class</span> <span class="nc">UserSuggestion</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="nb">id</span><span class="p">:</span> <span class="nb">str</span>
</span></span><span class="line"><span class="cl"> <span class="n">username</span><span class="p">:</span> <span class="nb">str</span>
</span></span><span class="line"><span class="cl"> <span class="n">display_name</span><span class="p">:</span> <span class="nb">str</span>
</span></span><span class="line"><span class="cl"> <span class="n">avatar_url</span><span class="p">:</span> <span class="nb">str</span>
</span></span><span class="line"><span class="cl"> <span class="n">bio</span><span class="p">:</span> <span class="nb">str</span>
</span></span><span class="line"><span class="cl"> <span class="n">mutual_friends</span><span class="p">:</span> <span class="nb">int</span>
</span></span><span class="line"><span class="cl"> <span class="n">follower_count</span><span class="p">:</span> <span class="nb">int</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">async</span> <span class="k">def</span> <span class="nf">get_friend_recommendations</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="n">client</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">user_id</span><span class="p">:</span> <span class="nb">str</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">limit</span><span class="p">:</span> <span class="nb">int</span> <span class="o">=</span> <span class="mi">10</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span> <span class="o">-></span> <span class="n">List</span><span class="p">[</span><span class="n">UserSuggestion</span><span class="p">]:</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"""Get friend recommendations based on mutual connections."""</span>
</span></span><span class="line"><span class="cl"> <span class="k">async</span> <span class="k">with</span> <span class="n">client</span><span class="o">.</span><span class="n">connection</span><span class="p">()</span> <span class="k">as</span> <span class="n">conn</span><span class="p">:</span>
</span></span><span class="line"><span class="cl"> <span class="n">result</span><span class="p">,</span> <span class="n">_</span> <span class="o">=</span> <span class="k">await</span> <span class="n">conn</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="s2">"""
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (me:User {id: $user_id})-[:FOLLOWS]->(friend:User)-[:FOLLOWS]->(suggestion:User)
</span></span></span><span class="line"><span class="cl"><span class="s2"> WHERE NOT (me)-[:FOLLOWS]->(suggestion)
</span></span></span><span class="line"><span class="cl"><span class="s2"> AND NOT (me)-[:BLOCKS]-(suggestion)
</span></span></span><span class="line"><span class="cl"><span class="s2"> AND me <> suggestion
</span></span></span><span class="line"><span class="cl"><span class="s2"> WITH suggestion, count(DISTINCT friend) AS mutual_friends
</span></span></span><span class="line"><span class="cl"><span class="s2"> ORDER BY mutual_friends DESC
</span></span></span><span class="line"><span class="cl"><span class="s2"> LIMIT $limit
</span></span></span><span class="line"><span class="cl"><span class="s2">
</span></span></span><span class="line"><span class="cl"><span class="s2"> MATCH (suggestion)
</span></span></span><span class="line"><span class="cl"><span class="s2"> OPTIONAL MATCH (suggestion)<-[:FOLLOWS]-(follower)
</span></span></span><span class="line"><span class="cl"><span class="s2"> RETURN
</span></span></span><span class="line"><span class="cl"><span class="s2"> suggestion.id AS id,
</span></span></span><span class="line"><span class="cl"><span class="s2"> suggestion.username AS username,
</span></span></span><span class="line"><span class="cl"><span class="s2"> suggestion.display_name AS display_name,
</span></span></span><span class="line"><span class="cl"><span class="s2"> suggestion.avatar_url AS avatar_url,
</span></span></span><span class="line"><span class="cl"><span class="s2"> suggestion.bio AS bio,
</span></span></span><span class="line"><span class="cl"><span class="s2"> mutual_friends,
</span></span></span><span class="line"><span class="cl"><span class="s2"> count(DISTINCT follower) AS follower_count
</span></span></span><span class="line"><span class="cl"><span class="s2"> ORDER BY mutual_friends DESC
</span></span></span><span class="line"><span class="cl"><span class="s2"> """</span><span class="p">,</span> <span class="p">{</span><span class="s2">"user_id"</span><span class="p">:</span> <span class="n">user_id</span><span class="p">,</span> <span class="s2">"limit"</span><span class="p">:</span> <span class="n">limit</span><span class="p">})</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"> <span class="k">return</span> <span class="p">[</span>
</span></span><span class="line"><span class="cl"> <span class="n">UserSuggestion</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="nb">id</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">'id'</span><span class="p">]</span><span class="o">.</span><span class="n">as_string</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">username</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">'username'</span><span class="p">]</span><span class="o">.</span><span class="n">as_string</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">display_name</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">'display_name'</span><span class="p">]</span><span class="o">.</span><span class="n">as_string</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">avatar_url</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">'avatar_url'</span><span class="p">]</span><span class="o">.</span><span class="n">as_string</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">bio</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">'bio'</span><span class="p">]</span><span class="o">.</span><span class="n">as_string</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">mutual_friends</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">'mutual_friends'</span><span class="p">]</span><span class="o">.</span><span class="n">as_int</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="n">follower_count</span><span class="o">=</span><span class="n">row</span><span class="p">[</span><span class="s1">'follower_count'</span><span class="p">]</span><span class="o">.</span><span class="n">as_int</span>
</span></span><span class="line"><span class="cl"> <span class="p">)</span>
</span></span><span class="line"><span class="cl"> <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="n">result</span><span class="o">.</span><span class="n">rows</span>
</span></span><span class="line"><span class="cl"> <span class="p">]</span>
</span></span></code></pre></div>
</div><div
class="tab-pane fade"
id="tabs-1774880884153894107-tab-2"
role="tabpanel"
aria-labelledby="tabs-1774880884153894107-tab-2-tab"
>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-rust" data-lang="rust"><span class="line"><span class="cl"><span class="cp">#[derive(Debug)]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="k">struct</span> <span class="nc">UserSuggestion</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="n">id</span>: <span class="nb">String</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">username</span>: <span class="nb">String</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">display_name</span>: <span class="nb">String</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">avatar_url</span>: <span class="nb">String</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">bio</span>: <span class="nb">String</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">mutual_friends</span>: <span class="kt">i64</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">follower_count</span>: <span class="kt">i64</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></span><span class="line"><span class="cl"><span class="w"></span><span class="k">async</span><span class="w"> </span><span class="k">fn</span> <span class="nf">get_friend_recommendations</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">conn</span>: <span class="kp">&</span><span class="nc">mut</span><span class="w"> </span><span class="n">geode_client</span>::<span class="n">Connection</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">user_id</span>: <span class="kp">&</span><span class="kt">str</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">limit</span>: <span class="kt">i64</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 class="nb">Result</span><span class="o"><</span><span class="nb">Vec</span><span class="o"><</span><span class="n">UserSuggestion</span><span class="o">></span><span class="p">,</span><span class="w"> </span><span class="nb">Box</span><span class="o"><</span><span class="k">dyn</span><span class="w"> </span><span class="n">std</span>::<span class="n">error</span>::<span class="n">Error</span><span class="o">>></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="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">params</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">HashMap</span>::<span class="n">new</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">"user_id"</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span><span class="w"> </span><span class="n">Value</span>::<span class="n">string</span><span class="p">(</span><span class="n">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="n">params</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="s">"limit"</span><span class="p">.</span><span class="n">to_string</span><span class="p">(),</span><span class="w"> </span><span class="n">Value</span>::<span class="n">int</span><span class="p">(</span><span class="n">limit</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="kd">let</span><span class="w"> </span><span class="p">(</span><span class="n">page</span><span class="p">,</span><span class="w"> </span><span class="n">_</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">conn</span><span class="p">.</span><span class="n">query_with_params</span><span class="p">(</span><span class="sa">r</span><span class="s">#"
</span></span></span><span class="line"><span class="cl"><span class="s"> MATCH (me:User {id: $user_id})-[:FOLLOWS]->(friend:User)-[:FOLLOWS]->(suggestion:User)
</span></span></span><span class="line"><span class="cl"><span class="s"> WHERE NOT (me)-[:FOLLOWS]->(suggestion)
</span></span></span><span class="line"><span class="cl"><span class="s"> AND NOT (me)-[:BLOCKS]-(suggestion)
</span></span></span><span class="line"><span class="cl"><span class="s"> AND me <> suggestion
</span></span></span><span class="line"><span class="cl"><span class="s"> WITH suggestion, count(DISTINCT friend) AS mutual_friends
</span></span></span><span class="line"><span class="cl"><span class="s"> ORDER BY mutual_friends DESC
</span></span></span><span class="line"><span class="cl"><span class="s"> LIMIT $limit
</span></span></span><span class="line"><span class="cl"><span class="s">
</span></span></span><span class="line"><span class="cl"><span class="s"> MATCH (suggestion)
</span></span></span><span class="line"><span class="cl"><span class="s"> OPTIONAL MATCH (suggestion)<-[:FOLLOWS]-(follower)
</span></span></span><span class="line"><span class="cl"><span class="s"> RETURN
</span></span></span><span class="line"><span class="cl"><span class="s"> suggestion.id AS id,
</span></span></span><span class="line"><span class="cl"><span class="s"> suggestion.username AS username,
</span></span></span><span class="line"><span class="cl"><span class="s"> suggestion.display_name AS display_name,
</span></span></span><span class="line"><span class="cl"><span class="s"> suggestion.avatar_url AS avatar_url,
</span></span></span><span class="line"><span class="cl"><span class="s"> suggestion.bio AS bio,
</span></span></span><span class="line"><span class="cl"><span class="s"> mutual_friends,
</span></span></span><span class="line"><span class="cl"><span class="s"> count(DISTINCT follower) AS follower_count
</span></span></span><span class="line"><span class="cl"><span class="s"> ORDER BY mutual_friends DESC
</span></span></span><span class="line"><span class="cl"><span class="s"> "#</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">params</span><span class="p">).</span><span class="k">await</span><span class="o">?</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="kd">let</span><span class="w"> </span><span class="k">mut</span><span class="w"> </span><span class="n">suggestions</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">Vec</span>::<span class="n">new</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">row</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="o">&</span><span class="n">page</span><span class="p">.</span><span class="n">rows</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="n">suggestions</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">UserSuggestion</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="n">id</span>: <span class="nc">row</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"id"</span><span class="p">).</span><span class="n">unwrap</span><span class="p">().</span><span class="n">as_string</span><span class="p">()</span><span class="o">?</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">username</span>: <span class="nc">row</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"username"</span><span class="p">).</span><span class="n">unwrap</span><span class="p">().</span><span class="n">as_string</span><span class="p">()</span><span class="o">?</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">display_name</span>: <span class="nc">row</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"display_name"</span><span class="p">).</span><span class="n">unwrap</span><span class="p">().</span><span class="n">as_string</span><span class="p">()</span><span class="o">?</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">avatar_url</span>: <span class="nc">row</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"avatar_url"</span><span class="p">).</span><span class="n">unwrap</span><span class="p">().</span><span class="n">as_string</span><span class="p">()</span><span class="o">?</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">bio</span>: <span class="nc">row</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"bio"</span><span class="p">).</span><span class="n">unwrap</span><span class="p">().</span><span class="n">as_string</span><span class="p">()</span><span class="o">?</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">mutual_friends</span>: <span class="nc">row</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"mutual_friends"</span><span class="p">).</span><span class="n">unwrap</span><span class="p">().</span><span class="n">as_int</span><span class="p">()</span><span class="o">?</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">follower_count</span>: <span class="nc">row</span><span class="p">.</span><span class="n">get</span><span class="p">(</span><span class="s">"follower_count"</span><span class="p">).</span><span class="n">unwrap</span><span class="p">().</span><span class="n">as_int</span><span class="p">()</span><span class="o">?</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="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="nb">Ok</span><span class="p">(</span><span class="n">suggestions</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></code></pre></div>
</div><div
class="tab-pane fade"
id="tabs-1774880884153894107-tab-3"
role="tabpanel"
aria-labelledby="tabs-1774880884153894107-tab-3-tab"
>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-typescript" data-lang="typescript"><span class="line"><span class="cl"><span class="kr">interface</span> <span class="nx">UserSuggestion</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="nx">id</span>: <span class="kt">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="nx">username</span>: <span class="kt">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="nx">displayName</span>: <span class="kt">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="nx">avatarUrl</span>: <span class="kt">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="nx">bio</span>: <span class="kt">string</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="nx">mutualFriends</span>: <span class="kt">number</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"> <span class="nx">followerCount</span>: <span class="kt">number</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kr">async</span> <span class="kd">function</span> <span class="nx">getFriendRecommendations</span><span class="p">(</span>
</span></span><span class="line"><span class="cl"> <span class="nx">client</span>: <span class="kt">Client</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">userId</span>: <span class="kt">string</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">limit</span>: <span class="kt">number</span> <span class="o">=</span> <span class="mi">10</span>
</span></span><span class="line"><span class="cl"><span class="p">)</span><span class="o">:</span> <span class="nx">Promise</span><span class="p"><</span><span class="nt">UserSuggestion</span><span class="err">[]</span><span class="p">></span> <span class="p">{</span>
</span></span><span class="line"><span class="cl"> <span class="kr">const</span> <span class="nx">rows</span> <span class="o">=</span> <span class="k">await</span> <span class="nx">client</span><span class="p">.</span><span class="nx">queryAll</span><span class="p">(</span><span class="sb">`
</span></span></span><span class="line"><span class="cl"><span class="sb"> MATCH (me:User {id: $user_id})-[:FOLLOWS]->(friend:User)-[:FOLLOWS]->(suggestion:User)
</span></span></span><span class="line"><span class="cl"><span class="sb"> WHERE NOT (me)-[:FOLLOWS]->(suggestion)
</span></span></span><span class="line"><span class="cl"><span class="sb"> AND NOT (me)-[:BLOCKS]-(suggestion)
</span></span></span><span class="line"><span class="cl"><span class="sb"> AND me <> suggestion
</span></span></span><span class="line"><span class="cl"><span class="sb"> WITH suggestion, count(DISTINCT friend) AS mutual_friends
</span></span></span><span class="line"><span class="cl"><span class="sb"> ORDER BY mutual_friends DESC
</span></span></span><span class="line"><span class="cl"><span class="sb"> LIMIT $limit
</span></span></span><span class="line"><span class="cl"><span class="sb">
</span></span></span><span class="line"><span class="cl"><span class="sb"> MATCH (suggestion)
</span></span></span><span class="line"><span class="cl"><span class="sb"> OPTIONAL MATCH (suggestion)<-[:FOLLOWS]-(follower)
</span></span></span><span class="line"><span class="cl"><span class="sb"> RETURN
</span></span></span><span class="line"><span class="cl"><span class="sb"> suggestion.id AS id,
</span></span></span><span class="line"><span class="cl"><span class="sb"> suggestion.username AS username,
</span></span></span><span class="line"><span class="cl"><span class="sb"> suggestion.display_name AS display_name,
</span></span></span><span class="line"><span class="cl"><span class="sb"> suggestion.avatar_url AS avatar_url,
</span></span></span><span class="line"><span class="cl"><span class="sb"> suggestion.bio AS bio,
</span></span></span><span class="line"><span class="cl"><span class="sb"> mutual_friends,
</span></span></span><span class="line"><span class="cl"><span class="sb"> count(DISTINCT follower) AS follower_count
</span></span></span><span class="line"><span class="cl"><span class="sb"> ORDER BY mutual_friends DESC
</span></span></span><span class="line"><span class="cl"><span class="sb"> `</span><span class="p">,</span> <span class="p">{</span> <span class="nx">params</span><span class="o">:</span> <span class="p">{</span> <span class="nx">user_id</span>: <span class="kt">userId</span><span class="p">,</span> <span class="nx">limit</span> <span class="p">}</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="nx">rows</span><span class="p">.</span><span class="nx">map</span><span class="p">(</span><span class="nx">row</span> <span class="o">=></span> <span class="p">({</span>
</span></span><span class="line"><span class="cl"> <span class="nx">id</span>: <span class="kt">row.get</span><span class="p">(</span><span class="s1">'id'</span><span class="p">)</span><span class="o">?</span><span class="p">.</span><span class="nx">asString</span> <span class="o">??</span> <span class="s1">''</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">username</span>: <span class="kt">row.get</span><span class="p">(</span><span class="s1">'username'</span><span class="p">)</span><span class="o">?</span><span class="p">.</span><span class="nx">asString</span> <span class="o">??</span> <span class="s1">''</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">displayName</span>: <span class="kt">row.get</span><span class="p">(</span><span class="s1">'display_name'</span><span class="p">)</span><span class="o">?</span><span class="p">.</span><span class="nx">asString</span> <span class="o">??</span> <span class="s1">''</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">avatarUrl</span>: <span class="kt">row.get</span><span class="p">(</span><span class="s1">'avatar_url'</span><span class="p">)</span><span class="o">?</span><span class="p">.</span><span class="nx">asString</span> <span class="o">??</span> <span class="s1">''</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">bio</span>: <span class="kt">row.get</span><span class="p">(</span><span class="s1">'bio'</span><span class="p">)</span><span class="o">?</span><span class="p">.</span><span class="nx">asString</span> <span class="o">??</span> <span class="s1">''</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">mutualFriends</span>: <span class="kt">row.get</span><span class="p">(</span><span class="s1">'mutual_friends'</span><span class="p">)</span><span class="o">?</span><span class="p">.</span><span class="nx">asNumber</span> <span class="o">??</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="nx">followerCount</span>: <span class="kt">row.get</span><span class="p">(</span><span class="s1">'follower_count'</span><span class="p">)</span><span class="o">?</span><span class="p">.</span><span class="nx">asNumber</span> <span class="o">??</span> <span class="mi">0</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="p">}));</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></div>
</div><div
class="tab-pane fade"
id="tabs-1774880884153894107-tab-4"
role="tabpanel"
aria-labelledby="tabs-1774880884153894107-tab-4-tab"
>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-zig" data-lang="zig"><span class="line"><span class="cl"><span class="kr">const</span><span class="w"> </span><span class="n">UserSuggestion</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">struct</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="n">id</span><span class="o">:</span><span class="w"> </span><span class="p">[]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">username</span><span class="o">:</span><span class="w"> </span><span class="p">[]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">display_name</span><span class="o">:</span><span class="w"> </span><span class="p">[]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">avatar_url</span><span class="o">:</span><span class="w"> </span><span class="p">[]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">bio</span><span class="o">:</span><span class="w"> </span><span class="p">[]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">mutual_friends</span><span class="o">:</span><span class="w"> </span><span class="kt">i64</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">follower_count</span><span class="o">:</span><span class="w"> </span><span class="kt">i64</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></span><span class="line"><span class="cl"><span class="w"></span><span class="kr">pub</span><span class="w"> </span><span class="k">fn</span><span class="w"> </span><span class="n">getFriendRecommendations</span><span class="p">(</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">client</span><span class="o">:</span><span class="w"> </span><span class="o">*</span><span class="n">geode</span><span class="p">.</span><span class="n">GeodeClient</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">allocator</span><span class="o">:</span><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">mem</span><span class="p">.</span><span class="n">Allocator</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">user_id</span><span class="o">:</span><span class="w"> </span><span class="p">[]</span><span class="kr">const</span><span class="w"> </span><span class="kt">u8</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">limit</span><span class="o">:</span><span class="w"> </span><span class="kt">i64</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 class="o">!</span><span class="n">std</span><span class="p">.</span><span class="n">ArrayList</span><span class="p">(</span><span class="n">UserSuggestion</span><span class="p">)</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="kr">var</span><span class="w"> </span><span class="n">params</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">json</span><span class="p">.</span><span class="n">ObjectMap</span><span class="p">.</span><span class="n">init</span><span class="p">(</span><span class="n">allocator</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">defer</span><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">deinit</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s">"user_id"</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="w"> </span><span class="p">.</span><span class="n">string</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">user_id</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="k">try</span><span class="w"> </span><span class="n">params</span><span class="p">.</span><span class="n">put</span><span class="p">(</span><span class="s">"limit"</span><span class="p">,</span><span class="w"> </span><span class="p">.{</span><span class="w"> </span><span class="p">.</span><span class="n">integer</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">limit</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></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">sendRunGql</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\MATCH (me:User {id: $user_id})-[:FOLLOWS]->(friend:User)-[:FOLLOWS]->(suggestion:User)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\WHERE NOT (me)-[:FOLLOWS]->(suggestion)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ AND NOT (me)-[:BLOCKS]-(suggestion)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ AND me <> suggestion</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\WITH suggestion, count(DISTINCT friend) AS mutual_friends</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ORDER BY mutual_friends DESC</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\LIMIT $limit</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\MATCH (suggestion)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\OPTIONAL MATCH (suggestion)<-[:FOLLOWS]-(follower)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\RETURN</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ suggestion.id AS id,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ suggestion.username AS username,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ suggestion.display_name AS display_name,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ suggestion.avatar_url AS avatar_url,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ suggestion.bio AS bio,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ mutual_friends,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ count(DISTINCT follower) AS follower_count</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="sh">\\ORDER BY mutual_friends DESC</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 class="p">.{</span><span class="w"> </span><span class="p">.</span><span class="n">object</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">params</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></span><span class="line"><span class="cl"><span class="w"> </span><span class="n">_</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">receiveMessage</span><span class="p">(</span><span class="mi">30000</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">sendPull</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">1000</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kr">const</span><span class="w"> </span><span class="n">result</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">try</span><span class="w"> </span><span class="n">client</span><span class="p">.</span><span class="n">receiveMessage</span><span class="p">(</span><span class="mi">30000</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">defer</span><span class="w"> </span><span class="n">allocator</span><span class="p">.</span><span class="n">free</span><span class="p">(</span><span class="n">result</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="kr">var</span><span class="w"> </span><span class="n">suggestions</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">std</span><span class="p">.</span><span class="n">ArrayList</span><span class="p">(</span><span class="n">UserSuggestion</span><span class="p">).</span><span class="n">init</span><span class="p">(</span><span class="n">allocator</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="c1">// Parse result and populate suggestions
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">suggestions</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></code></pre></div>
</div></div>
</div>
<h4 id="similar-interests" class="position-relative d-flex align-items-center group">
<span>Similar Interests</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="similar-interests"
aria-haspopup="dialog"
aria-label="Share link: Similar Interests">
<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">Recommend</span><span class="w"> </span><span class="py">users</span><span class="w"> </span><span class="py">who</span><span class="w"> </span><span class="py">like</span><span class="w"> </span><span class="py">similar</span><span class="w"> </span><span class="py">content</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">me</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">LIKES</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="nc">post</span><span class="p">:</span><span class="nc">Post</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">TAGGED</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">hashtag</span><span class="p">:</span><span class="nc">Hashtag</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">me</span><span class="p">,</span><span class="w"> </span><span class="py">hashtag</span><span class="p">,</span><span class="w"> </span><span class="py">count</span><span class="p">(</span><span class="py">post</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">my_interest</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">my_interest</span><span class="w"> </span><span class="py">DESC</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">LIMIT</span><span class="w"> </span><span class="py">10</span><span class="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">hashtag</span><span class="p">)</span><span class="err"><-</span><span class="p">[:</span><span class="nc">TAGGED</span><span class="p">]</span><span class="err">-</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="err"><-</span><span class="p">[:</span><span class="nc">LIKES</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="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"><></span><span class="w"> </span><span class="py">me</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">NOT</span><span class="w"> </span><span class="p">(</span><span class="py">me</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">FOLLOWS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">other</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">NOT</span><span class="w"> </span><span class="p">(</span><span class="py">me</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">BLOCKS</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">other</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">other</span><span class="p">,</span><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">hashtag</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">shared_interests</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">shared_interests</span><span class="w"> </span><span class="py">DESC</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">LIMIT</span><span class="w"> </span><span class="py">10</span><span class="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">RETURN</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">other</span><span class="err">.</span><span class="py">id</span><span class="w"> </span><span class="py">AS</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">other</span><span class="err">.</span><span class="py">username</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">username</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">other</span><span class="err">.</span><span class="py">display_name</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">display_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">shared_interests</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="activity-timeline" class="position-relative d-flex align-items-center group">
<span>Activity Timeline</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="activity-timeline"
aria-haspopup="dialog"
aria-label="Share link: Activity Timeline">
<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="user-notifications" class="position-relative d-flex align-items-center group">
<span>User Notifications</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="user-notifications"
aria-haspopup="dialog"
aria-label="Share link: User Notifications">
<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">Get</span><span class="w"> </span><span class="py">notifications</span><span class="w"> </span><span class="py">for</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">me</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="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="nc">Someone</span><span class="w"> </span><span class="py">followed</span><span class="w"> </span><span class="py">me</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">follower</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="err">-</span><span class="p">[</span><span class="py">f</span><span class="p">:</span><span class="nc">FOLLOWS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">me</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">f</span><span class="err">.</span><span class="py">since</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="nv">$since</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">me</span><span class="p">,</span><span class="w"> </span><span class="py">collect</span><span class="p">({</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kd">type</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">follow</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">actor_id</span><span class="p">:</span><span class="w"> </span><span class="nc">follower</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">actor_name</span><span class="p">:</span><span class="w"> </span><span class="nc">follower</span><span class="err">.</span><span class="py">username</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">timestamp</span><span class="p">:</span><span class="w"> </span><span class="nc">f</span><span class="err">.</span><span class="py">since</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 class="py">AS</span><span class="w"> </span><span class="py">follow_notifications</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">Someone</span><span class="w"> </span><span class="py">liked</span><span class="w"> </span><span class="py">my</span><span class="w"> </span><span class="py">post</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">liker</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="err">-</span><span class="p">[</span><span class="py">l</span><span class="p">:</span><span class="nc">LIKES</span><span class="p">]</span><span class="err">-></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="err"><-</span><span class="p">[:</span><span class="nc">POSTED</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">me</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">l</span><span class="err">.</span><span class="py">timestamp</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="nv">$since</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">me</span><span class="p">,</span><span class="w"> </span><span class="py">follow_notifications</span><span class="p">,</span><span class="w"> </span><span class="py">collect</span><span class="p">({</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kd">type</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">like</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">actor_id</span><span class="p">:</span><span class="w"> </span><span class="nc">liker</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">actor_name</span><span class="p">:</span><span class="w"> </span><span class="nc">liker</span><span class="err">.</span><span class="py">username</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_id</span><span class="p">:</span><span class="w"> </span><span class="nc">post</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">timestamp</span><span class="p">:</span><span class="w"> </span><span class="nc">l</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="p">})</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">like_notifications</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">Someone</span><span class="w"> </span><span class="py">commented</span><span class="w"> </span><span class="kd">on</span><span class="w"> </span><span class="py">my</span><span class="w"> </span><span class="py">post</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">commenter</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="err">-</span><span class="p">[</span><span class="py">c</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="err">-</span><span class="p">[:</span><span class="nc">ON</span><span class="p">]</span><span class="err">-></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="err"><-</span><span class="p">[:</span><span class="nc">POSTED</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">me</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">c</span><span class="err">.</span><span class="py">timestamp</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="nv">$since</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">follow_notifications</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="py">like_notifications</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">notifications</span><span class="p">,</span><span class="w"> </span><span class="py">collect</span><span class="p">({</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kd">type</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">comment</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">actor_id</span><span class="p">:</span><span class="w"> </span><span class="nc">commenter</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">actor_name</span><span class="p">:</span><span class="w"> </span><span class="nc">commenter</span><span class="err">.</span><span class="py">username</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_id</span><span class="p">:</span><span class="w"> </span><span class="nc">post</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">comment_id</span><span class="p">:</span><span class="w"> </span><span class="nc">comment</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">timestamp</span><span class="p">:</span><span class="w"> </span><span class="nc">c</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="p">})</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">comment_notifications</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">Someone</span><span class="w"> </span><span class="py">mentioned</span><span class="w"> </span><span class="py">me</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">author</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">-></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="err">-</span><span class="p">[:</span><span class="nc">MENTIONS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">me</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">post</span><span class="err">.</span><span class="py">created_at</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="nv">$since</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">notifications</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="py">comment_notifications</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">all_notifs</span><span class="p">,</span><span class="w"> </span><span class="py">collect</span><span class="p">({</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="kd">type</span><span class="p">:</span><span class="w"> </span><span class="err">'</span><span class="nc">mention</span><span class="err">'</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="nc">actor_id</span><span class="p">:</span><span class="w"> </span><span class="nc">author</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">actor_name</span><span class="p">:</span><span class="w"> </span><span class="nc">author</span><span class="err">.</span><span class="py">username</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_id</span><span class="p">:</span><span class="w"> </span><span class="nc">post</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">timestamp</span><span class="p">:</span><span class="w"> </span><span class="nc">post</span><span class="err">.</span><span class="py">created_at</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 class="py">AS</span><span class="w"> </span><span class="py">mention_notifications</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">Combine</span><span class="w"> </span><span class="py">all</span><span class="w"> </span><span class="py">notifications</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">all_notifs</span><span class="w"> </span><span class="err">+</span><span class="w"> </span><span class="py">mention_notifications</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">notifications</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">notifications</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">n</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">n</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">n</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">LIMIT</span><span class="w"> </span><span class="nv">$limit</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="privacy-considerations" class="position-relative d-flex align-items-center group">
<span>Privacy Considerations</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="privacy-considerations"
aria-haspopup="dialog"
aria-label="Share link: Privacy Considerations">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3>
<h4 id="privacy-aware-queries" class="position-relative d-flex align-items-center group">
<span>Privacy-Aware 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="privacy-aware-queries"
aria-haspopup="dialog"
aria-label="Share link: Privacy-Aware 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><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">Check</span><span class="w"> </span><span class="py">if</span><span class="w"> </span><span class="py">user</span><span class="w"> </span><span class="py">can</span><span class="w"> </span><span class="py">view</span><span class="w"> </span><span class="py">post</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">viewer</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">$viewer_id</span><span class="p">})</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">post</span><span class="p">:</span><span class="nc">Post</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">$post_id</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">-</span><span class="p">(</span><span class="nc">author</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></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="py">Public</span><span class="w"> </span><span class="py">posts</span><span class="w"> </span><span class="py">visible</span><span class="w"> </span><span class="py">to</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">post</span><span class="err">.</span><span class="py">visibility</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">public</span><span class="err">'</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></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="err">-</span><span class="kd">on</span><span class="py">ly</span><span class="w"> </span><span class="py">posts</span><span class="w"> </span><span class="py">visible</span><span class="w"> </span><span class="py">to</span><span class="w"> </span><span class="py">followers</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(</span><span class="py">post</span><span class="err">.</span><span class="py">visibility</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">friends</span><span class="err">'</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="p">(</span><span class="py">viewer</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">FOLLOWS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">author</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></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="py">Private</span><span class="w"> </span><span class="py">posts</span><span class="w"> </span><span class="kd">on</span><span class="py">ly</span><span class="w"> </span><span class="py">visible</span><span class="w"> </span><span class="py">to</span><span class="w"> </span><span class="py">author</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="p">(</span><span class="py">post</span><span class="err">.</span><span class="py">visibility</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="err">'</span><span class="py">private</span><span class="err">'</span><span class="w"> </span><span class="py">AND</span><span class="w"> </span><span class="py">viewer</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">author</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="err">//</span><span class="w"> </span><span class="py">And</span><span class="w"> </span><span class="py">not</span><span class="w"> </span><span class="py">blocked</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">NOT</span><span class="w"> </span><span class="p">(</span><span class="py">viewer</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">BLOCKS</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">author</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">post</span><span class="p">,</span><span class="w"> </span><span class="py">author</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="block-user" class="position-relative d-flex align-items-center group">
<span>Block User</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="block-user"
aria-haspopup="dialog"
aria-label="Share link: Block User">
<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">Block</span><span class="w"> </span><span class="py">a</span><span class="w"> </span><span class="py">user</span><span class="w"> </span><span class="p">(</span><span class="py">also</span><span class="w"> </span><span class="py">removes</span><span class="w"> </span><span class="py">follow</span><span class="w"> </span><span class="py">relationships</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">blocker</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">$blocker_id</span><span class="p">})</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">blocked</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">$blocked_id</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="nc">Remove</span><span class="w"> </span><span class="py">any</span><span class="w"> </span><span class="py">existing</span><span class="w"> </span><span class="py">follows</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">blocker</span><span class="p">)</span><span class="err">-</span><span class="p">[</span><span class="py">f1</span><span class="p">:</span><span class="nc">FOLLOWS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">blocked</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">DELETE</span><span class="w"> </span><span class="py">f1</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">OPTIONAL</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">blocked</span><span class="p">)</span><span class="err">-</span><span class="p">[</span><span class="py">f2</span><span class="p">:</span><span class="nc">FOLLOWS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">blocker</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">DELETE</span><span class="w"> </span><span class="py">f2</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">block</span><span class="w"> </span><span class="py">relationship</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="p">(</span><span class="py">blocker</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">BLOCKS</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">since</span><span class="p">:</span><span class="w"> </span><span class="nc">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">reason</span><span class="p">:</span><span class="w"> </span><span class="nv">$reason</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="p">(</span><span class="nc">blocked</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">RETURN</span><span class="w"> </span><span class="py">blocker</span><span class="err">.</span><span class="py">username</span><span class="p">,</span><span class="w"> </span><span class="py">blocked</span><span class="err">.</span><span class="py">username</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="data-export-gdpr" class="position-relative d-flex align-items-center group">
<span>Data Export (GDPR)</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="data-export-gdpr"
aria-haspopup="dialog"
aria-label="Share link: Data Export (GDPR)">
<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">Export</span><span class="w"> </span><span class="py">all</span><span class="w"> </span><span class="py">user</span><span class="w"> </span><span class="py">data</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="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="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="nc">Get</span><span class="w"> </span><span class="py">user</span><span class="w"> </span><span class="py">profile</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="p">{</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">profile</span><span class="p">:</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="nc">id</span><span class="p">:</span><span class="w"> </span><span class="nc">user</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">username</span><span class="p">:</span><span class="w"> </span><span class="nc">user</span><span class="err">.</span><span class="py">username</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">email</span><span class="p">:</span><span class="w"> </span><span class="nc">user</span><span class="err">.</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 class="py">display_name</span><span class="p">:</span><span class="w"> </span><span class="nc">user</span><span class="err">.</span><span class="py">display_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">bio</span><span class="p">:</span><span class="w"> </span><span class="nc">user</span><span class="err">.</span><span class="py">bio</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">created_at</span><span class="p">:</span><span class="w"> </span><span class="nc">user</span><span class="err">.</span><span class="py">created_at</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="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">data</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">Get</span><span class="w"> </span><span class="py">posts</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">POSTED</span><span class="p">]</span><span class="err">-></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">WITH</span><span class="w"> </span><span class="py">user</span><span class="p">,</span><span class="w"> </span><span class="py">data</span><span class="p">,</span><span class="w"> </span><span class="py">collect</span><span class="p">({</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">post</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">content</span><span class="p">:</span><span class="w"> </span><span class="nc">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">created_at</span><span class="p">:</span><span class="w"> </span><span class="nc">post</span><span class="err">.</span><span class="py">created_at</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 class="py">AS</span><span class="w"> </span><span class="py">posts</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">Get</span><span class="w"> </span><span class="py">comments</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">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">user</span><span class="p">,</span><span class="w"> </span><span class="py">data</span><span class="p">,</span><span class="w"> </span><span class="py">posts</span><span class="p">,</span><span class="w"> </span><span class="py">collect</span><span class="p">({</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">comment</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">content</span><span class="p">:</span><span class="w"> </span><span class="nc">comment</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">created_at</span><span class="p">:</span><span class="w"> </span><span class="nc">comment</span><span class="err">.</span><span class="py">created_at</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 class="py">AS</span><span class="w"> </span><span class="py">comments</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">Get</span><span class="w"> </span><span class="py">follows</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">FOLLOWS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">followed</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">data</span><span class="p">,</span><span class="w"> </span><span class="py">posts</span><span class="p">,</span><span class="w"> </span><span class="py">comments</span><span class="p">,</span><span class="w"> </span><span class="py">collect</span><span class="p">(</span><span class="py">followed</span><span class="err">.</span><span class="py">username</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">following</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">OPTIONAL</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">follower</span><span class="p">:</span><span class="nc">User</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">FOLLOWS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">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">data</span><span class="p">,</span><span class="w"> </span><span class="py">posts</span><span class="p">,</span><span class="w"> </span><span class="py">comments</span><span class="p">,</span><span class="w"> </span><span class="py">following</span><span class="p">,</span><span class="w"> </span><span class="py">collect</span><span class="p">(</span><span class="py">follower</span><span class="err">.</span><span class="py">username</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">followers</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">RETURN</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">profile</span><span class="p">:</span><span class="w"> </span><span class="nc">data</span><span class="err">.</span><span class="py">profile</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">posts</span><span class="p">:</span><span class="w"> </span><span class="nc">posts</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">comments</span><span class="p">:</span><span class="w"> </span><span class="nc">comments</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">following</span><span class="p">:</span><span class="w"> </span><span class="nc">following</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">followers</span><span class="p">:</span><span class="w"> </span><span class="nc">followers</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 class="py">AS</span><span class="w"> </span><span class="py">user_data</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="performance-at-scale" class="position-relative d-flex align-items-center group">
<span>Performance at Scale</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="performance-at-scale"
aria-haspopup="dialog"
aria-label="Share link: Performance at Scale">
<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="indexing-strategy" class="position-relative d-flex align-items-center group">
<span>Indexing Strategy</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="indexing-strategy"
aria-haspopup="dialog"
aria-label="Share link: Indexing Strategy">
<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">Essential</span><span class="w"> </span><span class="py">indexes</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">social</span><span class="w"> </span><span class="py">networks</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">INDEX</span><span class="w"> </span><span class="py">user_id</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">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">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">user_username</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">User</span><span class="p">(</span><span class="py">username</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="py">INDEX</span><span class="w"> </span><span class="py">post_id</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Post</span><span class="p">(</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">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">post_created_at</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Post</span><span class="p">(</span><span class="py">created_at</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="py">INDEX</span><span class="w"> </span><span class="py">hashtag_name</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Hashtag</span><span class="p">(</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></span><span class="line"><span class="cl"><span class="w"></span><span class="err">//</span><span class="w"> </span><span class="py">Composite</span><span class="w"> </span><span class="py">indexes</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">common</span><span class="w"> </span><span class="py">queries</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">INDEX</span><span class="w"> </span><span class="py">post_visibility_created</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="p">:</span><span class="nc">Post</span><span class="p">(</span><span class="py">visibility</span><span class="p">,</span><span class="w"> </span><span class="py">created_at</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="feed-caching-pattern" class="position-relative d-flex align-items-center group">
<span>Feed Caching Pattern</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="feed-caching-pattern"
aria-haspopup="dialog"
aria-label="Share link: Feed Caching Pattern">
<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>For high-traffic feeds, consider a materialized feed approach:</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">Pre</span><span class="err">-</span><span class="py">compute</span><span class="w"> </span><span class="py">feed</span><span class="w"> </span><span class="py">items</span><span class="w"> </span><span class="py">for</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">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">WHERE</span><span class="w"> </span><span class="py">user</span><span class="err">.</span><span class="py">last_active</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="py">timestamp</span><span class="p">()</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="py">duration</span><span class="p">(</span><span class="err">'</span><span class="py">P7D</span><span class="err">'</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">//</span><span class="w"> </span><span class="py">Get</span><span class="w"> </span><span class="py">their</span><span class="w"> </span><span class="py">feed</span><span class="w"> </span><span class="py">items</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="err">-</span><span class="p">[:</span><span class="nc">FOLLOWS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">followed</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">-></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">WHERE</span><span class="w"> </span><span class="py">post</span><span class="err">.</span><span class="py">created_at</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="py">timestamp</span><span class="p">()</span><span class="w"> </span><span class="err">-</span><span class="w"> </span><span class="py">duration</span><span class="p">(</span><span class="err">'</span><span class="py">P1D</span><span class="err">'</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">//</span><span class="w"> </span><span class="py">Store</span><span class="w"> </span><span class="py">in</span><span class="w"> </span><span class="py">feed</span><span class="w"> </span><span class="py">cache</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MERGE</span><span class="w"> </span><span class="p">(</span><span class="py">feed</span><span class="p">:</span><span class="nc">FeedCache</span><span class="w"> </span><span class="p">{</span><span class="py">user_id</span><span class="p">:</span><span class="w"> </span><span class="nc">user</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">SET</span><span class="w"> </span><span class="py">feed</span><span class="err">.</span><span class="py">items</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">collect</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_id</span><span class="p">:</span><span class="w"> </span><span class="nc">post</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">author_id</span><span class="p">:</span><span class="w"> </span><span class="nc">followed</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">timestamp</span><span class="p">:</span><span class="w"> </span><span class="nc">post</span><span class="err">.</span><span class="py">created_at</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="p">})[</span><span class="py">0</span><span class="err">.</span><span class="mf">.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">feed</span><span class="err">.</span><span class="py">updated_at</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="py">timestamp</span><span class="p">()</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="pagination-best-practices" class="position-relative d-flex align-items-center group">
<span>Pagination Best Practices</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="pagination-best-practices"
aria-haspopup="dialog"
aria-label="Share link: Pagination Best Practices">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</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">Cursor</span><span class="err">-</span><span class="py">based</span><span class="w"> </span><span class="py">pagination</span><span class="w"> </span><span class="p">(</span><span class="py">more</span><span class="w"> </span><span class="py">efficient</span><span class="w"> </span><span class="py">than</span><span class="w"> </span><span class="py">OFFSET</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">me</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">-></span><span class="p">(</span><span class="nc">followed</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">followed</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">-></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">WHERE</span><span class="w"> </span><span class="py">post</span><span class="err">.</span><span class="py">created_at</span><span class="w"> </span><span class="err"><</span><span class="w"> </span><span class="nv">$cursor_timestamp</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">created_at</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="nv">$limit</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">post</span><span class="err">.</span><span class="py">id</span><span class="p">,</span><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 class="py">post</span><span class="err">.</span><span class="py">created_at</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="batch-operations" class="position-relative d-flex align-items-center group">
<span>Batch Operations</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="batch-operations"
aria-haspopup="dialog"
aria-label="Share link: Batch Operations">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><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">Batch</span><span class="w"> </span><span class="py">follow</span><span class="w"> </span><span class="py">multiple</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">UNWIND</span><span class="w"> </span><span class="nv">$user_ids</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">followed_id</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">me</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">$my_id</span><span class="p">})</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">other</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="nc">followed_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">WHERE</span><span class="w"> </span><span class="py">NOT</span><span class="w"> </span><span class="p">(</span><span class="py">me</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">FOLLOWS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">other</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">me</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">FOLLOWS</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">timestamp</span><span class="p">()}]</span><span class="err">-></span><span class="p">(</span><span class="py">other</span><span class="p">)</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="analytics-queries" class="position-relative d-flex align-items-center group">
<span>Analytics 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="analytics-queries"
aria-haspopup="dialog"
aria-label="Share link: Analytics 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>
</h3>
<h4 id="user-engagement" class="position-relative d-flex align-items-center group">
<span>User Engagement</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="user-engagement"
aria-haspopup="dialog"
aria-label="Share link: User Engagement">
<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">Get</span><span class="w"> </span><span class="py">user</span><span class="w"> </span><span class="py">engagement</span><span class="w"> </span><span class="py">metrics</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="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="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="nc">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">POSTED</span><span class="p">]</span><span class="err">-></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">WITH</span><span class="w"> </span><span class="py">user</span><span class="p">,</span><span class="w"> </span><span class="py">count</span><span class="p">(</span><span class="py">post</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 class="py">sum</span><span class="p">(</span><span class="py">post</span><span class="err">.</span><span class="py">like_count</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="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">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">FOLLOWS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">following</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">post_count</span><span class="p">,</span><span class="w"> </span><span class="py">total_likes</span><span class="p">,</span><span class="w"> </span><span class="py">count</span><span class="p">(</span><span class="py">following</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">following_count</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">OPTIONAL</span><span class="w"> </span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">follower</span><span class="p">)</span><span class="err">-</span><span class="p">[:</span><span class="nc">FOLLOWS</span><span class="p">]</span><span class="err">-></span><span class="p">(</span><span class="py">user</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">user</span><span class="err">.</span><span class="py">username</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">following_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">follower</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">follower_count</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">CASE</span><span class="w"> </span><span class="py">WHEN</span><span class="w"> </span><span class="py">following_count</span><span class="w"> </span><span class="err">></span><span class="w"> </span><span class="py">0</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">THEN</span><span class="w"> </span><span class="py">toFloat</span><span class="p">(</span><span class="py">count</span><span class="p">(</span><span class="py">follower</span><span class="p">))</span><span class="w"> </span><span class="err">/</span><span class="w"> </span><span class="py">following_count</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">ELSE</span><span class="w"> </span><span class="py">0</span><span class="w"> </span><span class="py">END</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">follower_ratio</span><span class="w">
</span></span></span></code></pre></div>
<h4 id="content-performance" class="position-relative d-flex align-items-center group">
<span>Content Performance</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="content-performance"
aria-haspopup="dialog"
aria-label="Share link: Content Performance">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h4><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">Analyze</span><span class="w"> </span><span class="py">post</span><span class="w"> </span><span class="py">performance</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">post</span><span class="p">:</span><span class="nc">Post</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">$post_id</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">-</span><span class="p">(</span><span class="nc">author</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">post</span><span class="p">)</span><span class="err"><-</span><span class="p">[:</span><span class="nc">LIKES</span><span class="p">]</span><span class="err">-</span><span class="p">(</span><span class="py">liker</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">post</span><span class="p">,</span><span class="w"> </span><span class="py">author</span><span class="p">,</span><span class="w"> </span><span class="py">collect</span><span class="p">(</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">likers</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">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"><-</span><span class="p">[:</span><span class="nc">ON</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="err"><-</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="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">post</span><span class="p">,</span><span class="w"> </span><span class="py">author</span><span class="p">,</span><span class="w"> </span><span class="py">likers</span><span class="p">,</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">commenter</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">commenters</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">RETURN</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">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">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">author</span><span class="err">.</span><span class="py">username</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">author</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="py">size</span><span class="p">(</span><span class="py">likers</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">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">size</span><span class="p">(</span><span class="py">commenters</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">unique_commenters</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">reply_count</span><span class="w"> </span><span class="py">AS</span><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="py">post</span><span class="err">.</span><span class="py">share_count</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">shares</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">post</span><span class="err">.</span><span class="py">created_at</span><span class="p">,</span><span class="w"> </span><span class="py">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">age_hours</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="next-steps" class="position-relative d-flex align-items-center group">
<span>Next Steps</span>
<button type="button"
class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1"
data-share-target="next-steps"
aria-haspopup="dialog"
aria-label="Share link: Next Steps">
<i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i>
<span class="visually-hidden">Share link</span>
</button>
</h3><ul>
<li><a
href="/guides/recommendations/"
>Recommendation Engine Guide</a>
- Advanced recommendation algorithms</li>
<li><a
href="/guides/query-performance/"
>Query Performance Guide</a>
- Optimize social network queries</li>
<li><a
href="/guides/high-availability/"
>High Availability Guide</a>
- Scale your social network</li>
<li><a
href="/docs/security/"
>Security Guide</a>
- Protect user data</li>
</ul>
<h3 id="resources" class="position-relative d-flex align-items-center group">
<span>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="resources"
aria-haspopup="dialog"
aria-label="Share link: 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><a
href="/docs/gql-reference/"
>GQL Reference</a>
</li>
<li><a
href="/guides/graph-modeling/"
>Graph Modeling Guide</a>
</li>
<li><a
href="https://gitlab.com/devnw/codepros/geode/examples"
aria-label="Example Applications – opens in new window"
target="_blank" rel="noopener noreferrer"
>Example Applications
<span aria-hidden="true" class="external-icon">↗</span>
</a>
</li>
</ul>
<hr>
<p><strong>Questions?</strong> Join our <a
href="https://forum.geodedb.com"
aria-label="community forum – opens in new window"
target="_blank" rel="noopener noreferrer"
>community forum
<span aria-hidden="true" class="external-icon">↗</span>
</a>
to discuss social network implementations.</p>
Social Network Guide
Build a scalable social network with Geode - users, posts, comments, likes, and friend recommendations
27 min read