<!-- CANARY: REQ=REQ-DOCS-001; FEATURE="Docs"; ASPECT=Documentation; STATUS=TESTED; OWNER=docs; UPDATED=2026-01-28 --> <h2 id="migration-guide" class="position-relative d-flex align-items-center group"> <span>Migration 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="migration-guide" aria-haspopup="dialog" aria-label="Share link: Migration 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 covers migrating data to Geode from other graph databases, relational databases, and between Geode environments.</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>Geode supports multiple migration scenarios:</p> <table> <thead> <tr> <th>Source</th> <th>Method</th> <th>Complexity</th> <th>Downtime</th> </tr> </thead> <tbody> <tr> <td>Neo4j</td> <td>Export/Import</td> <td>Medium</td> <td>Minutes-hours</td> </tr> <tr> <td>JanusGraph</td> <td>Gremlin export</td> <td>Medium</td> <td>Minutes-hours</td> </tr> <tr> <td>PostgreSQL</td> <td>ETL pipeline</td> <td>Medium</td> <td>Varies</td> </tr> <tr> <td>MongoDB</td> <td>ETL pipeline</td> <td>Medium</td> <td>Varies</td> </tr> <tr> <td>CSV/JSON</td> <td>Bulk import</td> <td>Low</td> <td>Minutes</td> </tr> <tr> <td>Another Geode</td> <td>Replication/Backup</td> <td>Low</td> <td>Zero-minutes</td> </tr> </tbody> </table> <h3 id="migration-from-neo4j" class="position-relative d-flex align-items-center group"> <span>Migration from Neo4j</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="migration-from-neo4j" aria-haspopup="dialog" aria-label="Share link: Migration from Neo4j"> <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="compatibility-overview" class="position-relative d-flex align-items-center group"> <span>Compatibility 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="compatibility-overview" aria-haspopup="dialog" aria-label="Share link: Compatibility 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> </h4><p>Neo4j uses Cypher; Geode uses ISO GQL. Most basic Cypher is compatible:</p> <table> <thead> <tr> <th>Cypher Feature</th> <th>GQL Support</th> <th>Notes</th> </tr> </thead> <tbody> <tr> <td>MATCH patterns</td> <td>Full</td> <td>Identical syntax</td> </tr> <tr> <td>CREATE nodes</td> <td>Full</td> <td>Identical syntax</td> </tr> <tr> <td>CREATE relationships</td> <td>Full</td> <td>Identical syntax</td> </tr> <tr> <td>WHERE clauses</td> <td>Full</td> <td>Identical syntax</td> </tr> <tr> <td>RETURN</td> <td>Full</td> <td>Identical syntax</td> </tr> <tr> <td>MERGE</td> <td>Partial</td> <td>Use INSERT&hellip;ON CONFLICT</td> </tr> <tr> <td>APOC procedures</td> <td>None</td> <td>Use built-in functions</td> </tr> <tr> <td>FOREACH</td> <td>Partial</td> <td>Standard loops</td> </tr> </tbody> </table> <h4 id="export-from-neo4j" class="position-relative d-flex align-items-center group"> <span>Export from Neo4j</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="export-from-neo4j" aria-haspopup="dialog" aria-label="Share link: Export from Neo4j"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p><strong>Method 1: CSV Export</strong></p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="o">//</span> <span class="n">Export</span> <span class="n">nodes</span> <span class="n">to</span> <span class="n">CSV</span> </span></span><span class="line"><span class="cl"><span class="n">CALL</span> <span class="n">apoc</span><span class="o">.</span><span class="k">export</span><span class="o">.</span><span class="n">csv</span><span class="o">.</span><span class="n">query</span><span class="p">(</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;MATCH (n) RETURN n.id, labels(n)[0] AS label, properties(n) AS props&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;nodes.csv&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="p">{}</span> </span></span><span class="line"><span class="cl"><span class="p">);</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="o">//</span> <span class="n">Export</span> <span class="n">relationships</span> <span class="n">to</span> <span class="n">CSV</span> </span></span><span class="line"><span class="cl"><span class="n">CALL</span> <span class="n">apoc</span><span class="o">.</span><span class="k">export</span><span class="o">.</span><span class="n">csv</span><span class="o">.</span><span class="n">query</span><span class="p">(</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;MATCH (a)-[r]-&gt;(b) RETURN id(a) AS source, id(b) AS target, type(r) AS type, properties(r) AS props&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="s2">&#34;relationships.csv&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="p">{}</span> </span></span><span class="line"><span class="cl"><span class="p">);</span> </span></span></code></pre></div><p><strong>Method 2: JSON Export</strong></p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="o">//</span> <span class="n">Export</span> <span class="n">entire</span> <span class="n">database</span> <span class="n">to</span> <span class="n">JSON</span> </span></span><span class="line"><span class="cl"><span class="n">CALL</span> <span class="n">apoc</span><span class="o">.</span><span class="k">export</span><span class="o">.</span><span class="n">json</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="s2">&#34;export.json&#34;</span><span class="p">,</span> <span class="p">{</span><span class="n">useTypes</span><span class="p">:</span> <span class="bp">true</span><span class="p">});</span> </span></span></code></pre></div><p><strong>Method 3: Cypher Export</strong></p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gdscript3" data-lang="gdscript3"><span class="line"><span class="cl"><span class="o">//</span> <span class="n">Generate</span> <span class="n">Cypher</span> <span class="n">statements</span> </span></span><span class="line"><span class="cl"><span class="n">CALL</span> <span class="n">apoc</span><span class="o">.</span><span class="k">export</span><span class="o">.</span><span class="n">cypher</span><span class="o">.</span><span class="n">all</span><span class="p">(</span><span class="s2">&#34;export.cypher&#34;</span><span class="p">,</span> <span class="p">{</span> </span></span><span class="line"><span class="cl"> <span class="n">format</span><span class="p">:</span> <span class="s2">&#34;cypher-shell&#34;</span><span class="p">,</span> </span></span><span class="line"><span class="cl"> <span class="n">useOptimizations</span><span class="p">:</span> <span class="p">{</span><span class="n">type</span><span class="p">:</span> <span class="s2">&#34;UNWIND_BATCH&#34;</span><span class="p">,</span> <span class="n">unwindBatchSize</span><span class="p">:</span> <span class="mi">1000</span><span class="p">}</span> </span></span><span class="line"><span class="cl"><span class="p">});</span> </span></span></code></pre></div> <h4 id="import-to-geode" class="position-relative d-flex align-items-center group"> <span>Import to Geode</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="import-to-geode" aria-haspopup="dialog" aria-label="Share link: Import to Geode"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p><strong>From CSV</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash </span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1"># import-neo4j-csv.sh</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Import nodes</span> </span></span><span class="line"><span class="cl">geode import csv <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --file nodes.csv <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --format auto <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --batch-size <span class="m">1000</span> <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --mapping <span class="s1">&#39;{&#34;id&#34;: &#34;id&#34;, &#34;label&#34;: &#34;_label&#34;, &#34;props&#34;: &#34;_properties&#34;}&#39;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Import relationships</span> </span></span><span class="line"><span class="cl">geode import csv <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --file relationships.csv <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --format auto <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --batch-size <span class="m">1000</span> <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --relationship-mode <span class="nb">true</span> <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --mapping <span class="s1">&#39;{&#34;source&#34;: &#34;_source&#34;, &#34;target&#34;: &#34;_target&#34;, &#34;type&#34;: &#34;_type&#34;, &#34;props&#34;: &#34;_properties&#34;}&#39;</span> </span></span></code></pre></div><p><strong>From JSON</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">geode import json <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --file export.json <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --format neo4j <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --batch-size <span class="m">1000</span> </span></span></code></pre></div><p><strong>From Cypher (with conversion)</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Convert Cypher to GQL (if needed)</span> </span></span><span class="line"><span class="cl">geode migrate cypher-to-gql <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --input export.cypher <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --output import.gql </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Execute import</span> </span></span><span class="line"><span class="cl">geode execute-file --file import.gql --batch-size <span class="m">100</span> </span></span></code></pre></div> <h4 id="query-migration" class="position-relative d-flex align-items-center group"> <span>Query Migration</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="query-migration" aria-haspopup="dialog" aria-label="Share link: Query Migration"> <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>Convert common Cypher patterns to GQL:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">// Neo4j: MERGE (create if not exists) </span></span><span class="line"><span class="cl">MERGE (p:Person {email: &#39;[email protected]&#39;}) </span></span><span class="line"><span class="cl">ON CREATE SET p.name = &#39;Alice&#39;, p.created = datetime() </span></span><span class="line"><span class="cl">ON MATCH SET p.updated = datetime() </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">// Geode GQL equivalent </span></span><span class="line"><span class="cl">INSERT (:Person {email: &#39;[email protected]&#39;, name: &#39;Alice&#39;, created: datetime()}) </span></span><span class="line"><span class="cl">ON CONFLICT (email) DO UPDATE SET updated = datetime() </span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">// Neo4j: APOC functions </span></span><span class="line"><span class="cl">CALL apoc.create.uuid() YIELD uuid </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">// Geode GQL equivalent </span></span><span class="line"><span class="cl">SELECT gen_random_uuid() AS uuid </span></span></code></pre></div><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">// Neo4j: FOREACH </span></span><span class="line"><span class="cl">MATCH (p:Person) </span></span><span class="line"><span class="cl">FOREACH (i IN range(1, 10) | CREATE (p)-[:HAS_ITEM]-&gt;(:Item {num: i})) </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl">// Geode GQL equivalent </span></span><span class="line"><span class="cl">MATCH (p:Person) </span></span><span class="line"><span class="cl">UNWIND range(1, 10) AS i </span></span><span class="line"><span class="cl">CREATE (p)-[:HAS_ITEM]-&gt;(:Item {num: i}) </span></span></code></pre></div> <h3 id="migration-from-janusgraph" class="position-relative d-flex align-items-center group"> <span>Migration from JanusGraph</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="migration-from-janusgraph" aria-haspopup="dialog" aria-label="Share link: Migration from JanusGraph"> <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="export-from-janusgraph" class="position-relative d-flex align-items-center group"> <span>Export from JanusGraph</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="export-from-janusgraph" aria-haspopup="dialog" aria-label="Share link: Export from JanusGraph"> <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-groovy" data-lang="groovy"><span class="line"><span class="cl"><span class="c1">// Export using Gremlin </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">g</span><span class="o">.</span><span class="na">V</span><span class="o">().</span><span class="na">valueMap</span><span class="o">(</span><span class="kc">true</span><span class="o">).</span><span class="na">toList</span><span class="o">().</span><span class="na">collect</span> <span class="o">{</span> <span class="n">v</span> <span class="o">-&gt;</span> </span></span><span class="line"><span class="cl"> <span class="o">[</span><span class="nl">id:</span> <span class="n">v</span><span class="o">[</span><span class="n">T</span><span class="o">.</span><span class="na">id</span><span class="o">],</span> <span class="nl">label:</span> <span class="n">v</span><span class="o">[</span><span class="n">T</span><span class="o">.</span><span class="na">label</span><span class="o">],</span> <span class="nl">properties:</span> <span class="n">v</span><span class="o">.</span><span class="na">findAll</span> <span class="o">{</span> <span class="n">k</span><span class="o">,</span> <span class="n">_</span> <span class="o">-&gt;</span> <span class="n">k</span> <span class="o">!=</span> <span class="n">T</span><span class="o">.</span><span class="na">id</span> <span class="o">&amp;&amp;</span> <span class="n">k</span> <span class="o">!=</span> <span class="n">T</span><span class="o">.</span><span class="na">label</span> <span class="o">}]</span> </span></span><span class="line"><span class="cl"><span class="o">}.</span><span class="na">toJson</span><span class="o">()</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="n">g</span><span class="o">.</span><span class="na">E</span><span class="o">().</span><span class="na">valueMap</span><span class="o">(</span><span class="kc">true</span><span class="o">).</span><span class="na">toList</span><span class="o">().</span><span class="na">collect</span> <span class="o">{</span> <span class="n">e</span> <span class="o">-&gt;</span> </span></span><span class="line"><span class="cl"> <span class="o">[</span><span class="nl">id:</span> <span class="n">e</span><span class="o">[</span><span class="n">T</span><span class="o">.</span><span class="na">id</span><span class="o">],</span> <span class="nl">label:</span> <span class="n">e</span><span class="o">[</span><span class="n">T</span><span class="o">.</span><span class="na">label</span><span class="o">],</span> <span class="nl">source:</span> <span class="n">e</span><span class="o">[</span><span class="n">Direction</span><span class="o">.</span><span class="na">OUT</span><span class="o">].</span><span class="na">id</span><span class="o">(),</span> <span class="nl">target:</span> <span class="n">e</span><span class="o">[</span><span class="n">Direction</span><span class="o">.</span><span class="na">IN</span><span class="o">].</span><span class="na">id</span><span class="o">(),</span> <span class="nl">properties:</span> <span class="n">e</span><span class="o">.</span><span class="na">findAll</span> <span class="o">{</span> <span class="n">k</span><span class="o">,</span> <span class="n">_</span> <span class="o">-&gt;</span> <span class="o">!(</span><span class="n">k</span> <span class="k">in</span> <span class="o">[</span><span class="n">T</span><span class="o">.</span><span class="na">id</span><span class="o">,</span> <span class="n">T</span><span class="o">.</span><span class="na">label</span><span class="o">,</span> <span class="n">Direction</span><span class="o">.</span><span class="na">OUT</span><span class="o">,</span> <span class="n">Direction</span><span class="o">.</span><span class="na">IN</span><span class="o">])</span> <span class="o">}]</span> </span></span><span class="line"><span class="cl"><span class="o">}.</span><span class="na">toJson</span><span class="o">()</span> </span></span></code></pre></div> <h4 id="convert-gremlin-to-gql" class="position-relative d-flex align-items-center group"> <span>Convert Gremlin to GQL</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="convert-gremlin-to-gql" aria-haspopup="dialog" aria-label="Share link: Convert Gremlin to GQL"> <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><table> <thead> <tr> <th>Gremlin</th> <th>GQL</th> </tr> </thead> <tbody> <tr> <td><code>g.addV('Person').property('name', 'Alice')</code></td> <td><code>CREATE (:Person {name: 'Alice'})</code></td> </tr> <tr> <td><code>g.V().hasLabel('Person')</code></td> <td><code>MATCH (p:Person) RETURN p</code></td> </tr> <tr> <td><code>g.V().has('name', 'Alice')</code></td> <td><code>MATCH (p {name: 'Alice'}) RETURN p</code></td> </tr> <tr> <td><code>g.V().outE('KNOWS').inV()</code></td> <td><code>MATCH (a)-[:KNOWS]-&gt;(b) RETURN b</code></td> </tr> <tr> <td><code>g.V().both('KNOWS')</code></td> <td><code>MATCH (a)-[:KNOWS]-(b) RETURN b</code></td> </tr> <tr> <td><code>g.V().out('KNOWS').out('KNOWS')</code></td> <td><code>MATCH (a)-[:KNOWS*2]-&gt;(b) RETURN b</code></td> </tr> </tbody> </table> <h4 id="import-script" class="position-relative d-flex align-items-center group"> <span>Import Script</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="import-script" aria-haspopup="dialog" aria-label="Share link: Import Script"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash </span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1"># import-janusgraph.sh</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Convert Gremlin JSON export to GQL</span> </span></span><span class="line"><span class="cl">python3 <span class="s">&lt;&lt; &#39;EOF&#39; </span></span></span><span class="line"><span class="cl"><span class="s">import json </span></span></span><span class="line"><span class="cl"><span class="s"> </span></span></span><span class="line"><span class="cl"><span class="s"># Load JanusGraph export </span></span></span><span class="line"><span class="cl"><span class="s">with open(&#39;vertices.json&#39;) as f: </span></span></span><span class="line"><span class="cl"><span class="s"> vertices = json.load(f) </span></span></span><span class="line"><span class="cl"><span class="s"> </span></span></span><span class="line"><span class="cl"><span class="s">with open(&#39;edges.json&#39;) as f: </span></span></span><span class="line"><span class="cl"><span class="s"> edges = json.load(f) </span></span></span><span class="line"><span class="cl"><span class="s"> </span></span></span><span class="line"><span class="cl"><span class="s"># Generate GQL statements </span></span></span><span class="line"><span class="cl"><span class="s">with open(&#39;import.gql&#39;, &#39;w&#39;) as out: </span></span></span><span class="line"><span class="cl"><span class="s"> # Create nodes </span></span></span><span class="line"><span class="cl"><span class="s"> for v in vertices: </span></span></span><span class="line"><span class="cl"><span class="s"> props = &#39;, &#39;.join(f&#34;{k}: {json.dumps(v[&#39;properties&#39;].get(k, [None])[0])}&#34; </span></span></span><span class="line"><span class="cl"><span class="s"> for k in v[&#39;properties&#39;] if v[&#39;properties&#39;][k]) </span></span></span><span class="line"><span class="cl"><span class="s"> out.write(f&#34;CREATE (:{v[&#39;label&#39;]} {{{props}}});\n&#34;) </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 relationships </span></span></span><span class="line"><span class="cl"><span class="s"> for e in edges: </span></span></span><span class="line"><span class="cl"><span class="s"> props = &#39;, &#39;.join(f&#34;{k}: {json.dumps(v)}&#34; </span></span></span><span class="line"><span class="cl"><span class="s"> for k, v in e.get(&#39;properties&#39;, {}).items()) </span></span></span><span class="line"><span class="cl"><span class="s"> out.write(f&#34;MATCH (a), (b) WHERE id(a) = {e[&#39;source&#39;]} AND id(b) = {e[&#39;target&#39;]} &#34; </span></span></span><span class="line"><span class="cl"><span class="s"> f&#34;CREATE (a)-[:{e[&#39;label&#39;]} {{{props}}}]-&gt;(b);\n&#34;) </span></span></span><span class="line"><span class="cl"><span class="s">EOF</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Execute import</span> </span></span><span class="line"><span class="cl">geode execute-file --file import.gql </span></span></code></pre></div> <h3 id="migration-from-relational-databases" class="position-relative d-flex align-items-center group"> <span>Migration from Relational Databases</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="migration-from-relational-databases" aria-haspopup="dialog" aria-label="Share link: Migration from Relational Databases"> <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="postgresql-to-geode" class="position-relative d-flex align-items-center group"> <span>PostgreSQL to Geode</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="postgresql-to-geode" aria-haspopup="dialog" aria-label="Share link: PostgreSQL to Geode"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><p><strong>Schema Mapping</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">PostgreSQL Table -&gt; Geode Node Label </span></span><span class="line"><span class="cl">PostgreSQL Row -&gt; Geode Node </span></span><span class="line"><span class="cl">PostgreSQL Column -&gt; Geode Property </span></span><span class="line"><span class="cl">PostgreSQL Foreign Key -&gt; Geode Relationship </span></span><span class="line"><span class="cl">PostgreSQL Join Table -&gt; Geode Relationship with properties </span></span></code></pre></div><p><strong>Export from PostgreSQL</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-sql" data-lang="sql"><span class="line"><span class="cl"><span class="c1">-- Export users </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">COPY</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">SELECT</span><span class="w"> </span><span class="n">id</span><span class="p">,</span><span class="w"> </span><span class="n">name</span><span class="p">,</span><span class="w"> </span><span class="n">email</span><span class="p">,</span><span class="w"> </span><span class="n">created_at</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">users</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="k">TO</span><span class="w"> </span><span class="s1">&#39;/tmp/users.csv&#39;</span><span class="w"> </span><span class="k">WITH</span><span class="w"> </span><span class="n">CSV</span><span class="w"> </span><span class="n">HEADER</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">-- Export relationships (friendship) </span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">COPY</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">SELECT</span><span class="w"> </span><span class="n">user_id</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="k">source</span><span class="p">,</span><span class="w"> </span><span class="n">friend_id</span><span class="w"> </span><span class="k">AS</span><span class="w"> </span><span class="n">target</span><span class="p">,</span><span class="w"> </span><span class="n">created_at</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span><span class="k">FROM</span><span class="w"> </span><span class="n">friendships</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="k">TO</span><span class="w"> </span><span class="s1">&#39;/tmp/friendships.csv&#39;</span><span class="w"> </span><span class="k">WITH</span><span class="w"> </span><span class="n">CSV</span><span class="w"> </span><span class="n">HEADER</span><span class="p">;</span><span class="w"> </span></span></span></code></pre></div><p><strong>Import to Geode</strong>:</p> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Import users as Person nodes</span> </span></span><span class="line"><span class="cl">geode import csv <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --file users.csv <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --label Person <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --id-column id <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --batch-size <span class="m">1000</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Import friendships as KNOWS relationships</span> </span></span><span class="line"><span class="cl">geode import csv <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --file friendships.csv <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --relationship KNOWS <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --source-label Person <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --source-id <span class="nb">source</span> <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --target-label Person <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --target-id target <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --batch-size <span class="m">1000</span> </span></span></code></pre></div> <h4 id="mysql-to-geode" class="position-relative d-flex align-items-center group"> <span>MySQL to Geode</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="mysql-to-geode" aria-haspopup="dialog" aria-label="Share link: MySQL to Geode"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Export from MySQL</span> </span></span><span class="line"><span class="cl">mysql -u user -p database -e <span class="s2">&#34; </span></span></span><span class="line"><span class="cl"><span class="s2"> SELECT id, name, email FROM users </span></span></span><span class="line"><span class="cl"><span class="s2">&#34;</span> <span class="p">|</span> tail -n +2 &gt; users.tsv </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Import to Geode</span> </span></span><span class="line"><span class="cl">geode import csv <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --file users.tsv <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --delimiter <span class="s1">&#39;\t&#39;</span> <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --label User <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --id-column id </span></span></code></pre></div> <h4 id="mongodb-to-geode" class="position-relative d-flex align-items-center group"> <span>MongoDB to Geode</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="mongodb-to-geode" aria-haspopup="dialog" aria-label="Share link: MongoDB to Geode"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Export from MongoDB</span> </span></span><span class="line"><span class="cl">mongoexport --db mydb --collection users --out users.json --jsonArray </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Import to Geode</span> </span></span><span class="line"><span class="cl">geode import json <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --file users.json <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --label User <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --id-field _id </span></span></code></pre></div> <h3 id="bulk-import" class="position-relative d-flex align-items-center group"> <span>Bulk Import</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="bulk-import" aria-haspopup="dialog" aria-label="Share link: Bulk Import"> <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="csv-import" class="position-relative d-flex align-items-center group"> <span>CSV Import</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="csv-import" aria-haspopup="dialog" aria-label="Share link: CSV Import"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Basic CSV import</span> </span></span><span class="line"><span class="cl">geode import csv <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --file data.csv <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --label Person <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --batch-size <span class="m">1000</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Advanced options</span> </span></span><span class="line"><span class="cl">geode import csv <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --file data.csv <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --label Person <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --id-column uuid <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --skip-header <span class="nb">true</span> <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --delimiter <span class="s1">&#39;,&#39;</span> <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --quote <span class="s1">&#39;&#34;&#39;</span> <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --escape <span class="s1">&#39;\\&#39;</span> <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --null-value <span class="s1">&#39;NULL&#39;</span> <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --batch-size <span class="m">5000</span> <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --parallel <span class="m">4</span> <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --on-error skip <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --log-errors /var/log/geode/import-errors.log </span></span></code></pre></div> <h4 id="json-import" class="position-relative d-flex align-items-center group"> <span>JSON Import</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="json-import" aria-haspopup="dialog" aria-label="Share link: JSON Import"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># JSON array import</span> </span></span><span class="line"><span class="cl">geode import json <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --file data.json <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --label Person <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --batch-size <span class="m">1000</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># JSONL (JSON Lines) import</span> </span></span><span class="line"><span class="cl">geode import json <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --file data.jsonl <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --format jsonl <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --label Person <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --batch-size <span class="m">1000</span> </span></span></code></pre></div> <h4 id="gql-script-import" class="position-relative d-flex align-items-center group"> <span>GQL Script Import</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="gql-script-import" aria-haspopup="dialog" aria-label="Share link: GQL Script Import"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Execute GQL file</span> </span></span><span class="line"><span class="cl">geode execute-file <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --file import.gql <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --batch-size <span class="m">100</span> <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --continue-on-error <span class="nb">true</span> </span></span></code></pre></div> <h3 id="environment-migration" class="position-relative d-flex align-items-center group"> <span>Environment Migration</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="environment-migration" aria-haspopup="dialog" aria-label="Share link: Environment Migration"> <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="development-to-production" class="position-relative d-flex align-items-center group"> <span>Development to Production</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="development-to-production" aria-haspopup="dialog" aria-label="Share link: Development to Production"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash </span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1"># migrate-dev-to-prod.sh</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nv">DEV_HOST</span><span class="o">=</span><span class="s2">&#34;geode-dev.internal&#34;</span> </span></span><span class="line"><span class="cl"><span class="nv">PROD_HOST</span><span class="o">=</span><span class="s2">&#34;geode-prod.internal&#34;</span> </span></span><span class="line"><span class="cl"><span class="nv">BACKUP_BUCKET</span><span class="o">=</span><span class="s2">&#34;s3://geode-backups&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;=== Migrating Dev to Prod ===&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 1. Create backup from dev</span> </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Creating backup from dev...&#34;</span> </span></span><span class="line"><span class="cl">geode backup <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --host <span class="s2">&#34;</span><span class="nv">$DEV_HOST</span><span class="s2">&#34;</span> <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --dest <span class="s2">&#34;</span><span class="nv">$BACKUP_BUCKET</span><span class="s2">/dev-export-</span><span class="k">$(</span>date +%Y%m%d<span class="k">)</span><span class="s2">&#34;</span> <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --mode full </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 2. Optionally sanitize data</span> </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Sanitizing data...&#34;</span> </span></span><span class="line"><span class="cl"><span class="c1"># Remove test data, mask PII, etc.</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 3. Restore to prod (in maintenance window)</span> </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Restoring to prod...&#34;</span> </span></span><span class="line"><span class="cl">geode restore <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --host <span class="s2">&#34;</span><span class="nv">$PROD_HOST</span><span class="s2">&#34;</span> <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --source <span class="s2">&#34;</span><span class="nv">$BACKUP_BUCKET</span><span class="s2">/dev-export-</span><span class="k">$(</span>date +%Y%m%d<span class="k">)</span><span class="s2">&#34;</span> <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --backup-id latest </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;=== Migration Complete ===&#34;</span> </span></span></code></pre></div> <h4 id="cross-region-migration" class="position-relative d-flex align-items-center group"> <span>Cross-Region Migration</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="cross-region-migration" aria-haspopup="dialog" aria-label="Share link: Cross-Region Migration"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash </span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1"># cross-region-migration.sh</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nv">SOURCE_REGION</span><span class="o">=</span><span class="s2">&#34;us-east-1&#34;</span> </span></span><span class="line"><span class="cl"><span class="nv">TARGET_REGION</span><span class="o">=</span><span class="s2">&#34;eu-west-1&#34;</span> </span></span><span class="line"><span class="cl"><span class="nv">SOURCE_HOST</span><span class="o">=</span><span class="s2">&#34;geode.us-east.example.com&#34;</span> </span></span><span class="line"><span class="cl"><span class="nv">TARGET_HOST</span><span class="o">=</span><span class="s2">&#34;geode.eu-west.example.com&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;=== Cross-Region Migration ===&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 1. Set up replication</span> </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Setting up replication...&#34;</span> </span></span><span class="line"><span class="cl">geode admin replicate <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --source <span class="s2">&#34;</span><span class="nv">$SOURCE_HOST</span><span class="s2">&#34;</span> <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --target <span class="s2">&#34;</span><span class="nv">$TARGET_HOST</span><span class="s2">&#34;</span> <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --mode async </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 2. Wait for sync</span> </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Waiting for initial sync...&#34;</span> </span></span><span class="line"><span class="cl"><span class="k">while</span> true<span class="p">;</span> <span class="k">do</span> </span></span><span class="line"><span class="cl"> <span class="nv">LAG</span><span class="o">=</span><span class="k">$(</span>geode admin replication-lag --target <span class="s2">&#34;</span><span class="nv">$TARGET_HOST</span><span class="s2">&#34;</span><span class="k">)</span> </span></span><span class="line"><span class="cl"> <span class="nb">echo</span> <span class="s2">&#34;Replication lag: </span><span class="nv">$LAG</span><span class="s2"> bytes&#34;</span> </span></span><span class="line"><span class="cl"> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$LAG</span><span class="s2">&#34;</span> -lt <span class="m">1000</span> <span class="o">]</span> <span class="o">&amp;&amp;</span> <span class="nb">break</span> </span></span><span class="line"><span class="cl"> sleep <span class="m">30</span> </span></span><span class="line"><span class="cl"><span class="k">done</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 3. Stop writes to source</span> </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Stopping writes to source...&#34;</span> </span></span><span class="line"><span class="cl">geode admin read-only --host <span class="s2">&#34;</span><span class="nv">$SOURCE_HOST</span><span class="s2">&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 4. Final sync</span> </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Final synchronization...&#34;</span> </span></span><span class="line"><span class="cl">sleep <span class="m">60</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 5. Promote target</span> </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Promoting target...&#34;</span> </span></span><span class="line"><span class="cl">geode admin promote --host <span class="s2">&#34;</span><span class="nv">$TARGET_HOST</span><span class="s2">&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># 6. Update DNS</span> </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Update DNS to point to </span><span class="nv">$TARGET_HOST</span><span class="s2">&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;=== Migration Complete ===&#34;</span> </span></span></code></pre></div> <h3 id="data-validation" class="position-relative d-flex align-items-center group"> <span>Data Validation</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-validation" aria-haspopup="dialog" aria-label="Share link: Data Validation"> <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="pre-migration-validation" class="position-relative d-flex align-items-center group"> <span>Pre-Migration Validation</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="pre-migration-validation" aria-haspopup="dialog" aria-label="Share link: Pre-Migration Validation"> <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">Count</span><span class="w"> </span><span class="py">nodes</span><span class="w"> </span><span class="py">by</span><span class="w"> </span><span class="py">label</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">n</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">labels</span><span class="p">(</span><span class="py">n</span><span class="p">)[</span><span class="py">0</span><span class="p">]</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">label</span><span class="p">,</span><span class="w"> </span><span class="py">count</span><span class="p">(</span><span class="py">n</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">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">label</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Count</span><span class="w"> </span><span class="py">relationships</span><span class="w"> </span><span class="py">by</span><span class="w"> </span><span class="kd">type</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="err">-</span><span class="p">[</span><span class="py">r</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">()</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="kd">type</span><span class="p">(</span><span class="nc">r</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="kd">type</span><span class="p">,</span><span class="w"> </span><span class="nc">count</span><span class="p">(</span><span class="py">r</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">count</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">ORDER</span><span class="w"> </span><span class="py">BY</span><span class="w"> </span><span class="kd">type</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="nc">Check</span><span class="w"> </span><span class="py">for</span><span class="w"> </span><span class="py">orphaned</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="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">a</span><span class="p">)</span><span class="err">-</span><span class="p">[</span><span class="py">r</span><span class="p">]</span><span class="err">-&gt;</span><span class="p">(</span><span class="py">b</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">a</span><span class="w"> </span><span class="py">IS</span><span class="w"> </span><span class="py">NULL</span><span class="w"> </span><span class="py">OR</span><span class="w"> </span><span class="py">b</span><span class="w"> </span><span class="py">IS</span><span class="w"> </span><span class="py">NULL</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">RETURN</span><span class="w"> </span><span class="py">count</span><span class="p">(</span><span class="py">r</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">orphaned</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Find</span><span class="w"> </span><span class="py">duplicates</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">MATCH</span><span class="w"> </span><span class="p">(</span><span class="py">p</span><span class="p">:</span><span class="nc">Person</span><span class="p">)</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WITH</span><span class="w"> </span><span class="py">p</span><span class="err">.</span><span class="py">email</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">email</span><span class="p">,</span><span class="w"> </span><span class="py">count</span><span class="p">(</span><span class="err">*</span><span class="p">)</span><span class="w"> </span><span class="py">AS</span><span class="w"> </span><span class="py">count</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">WHERE</span><span class="w"> </span><span class="py">count</span><span class="w"> </span><span class="err">&gt;</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">email</span><span class="p">,</span><span class="w"> </span><span class="py">count</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div> <h4 id="post-migration-validation" class="position-relative d-flex align-items-center group"> <span>Post-Migration Validation</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="post-migration-validation" aria-haspopup="dialog" aria-label="Share link: Post-Migration Validation"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="cp">#!/bin/bash </span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="c1"># validate-migration.sh</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nv">SOURCE_HOST</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$1</span><span class="s2">&#34;</span> </span></span><span class="line"><span class="cl"><span class="nv">TARGET_HOST</span><span class="o">=</span><span class="s2">&#34;</span><span class="nv">$2</span><span class="s2">&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;=== Migration Validation ===&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Compare node counts</span> </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Comparing node counts...&#34;</span> </span></span><span class="line"><span class="cl"><span class="nv">SOURCE_NODES</span><span class="o">=</span><span class="k">$(</span>geode query <span class="s2">&#34;MATCH (n) RETURN count(n)&#34;</span> --host <span class="s2">&#34;</span><span class="nv">$SOURCE_HOST</span><span class="s2">&#34;</span> --format json <span class="p">|</span> jq -r <span class="s1">&#39;.rows[0][&#34;count(n)&#34;]&#39;</span><span class="k">)</span> </span></span><span class="line"><span class="cl"><span class="nv">TARGET_NODES</span><span class="o">=</span><span class="k">$(</span>geode query <span class="s2">&#34;MATCH (n) RETURN count(n)&#34;</span> --host <span class="s2">&#34;</span><span class="nv">$TARGET_HOST</span><span class="s2">&#34;</span> --format json <span class="p">|</span> jq -r <span class="s1">&#39;.rows[0][&#34;count(n)&#34;]&#39;</span><span class="k">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Source nodes: </span><span class="nv">$SOURCE_NODES</span><span class="s2">&#34;</span> </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Target nodes: </span><span class="nv">$TARGET_NODES</span><span class="s2">&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$SOURCE_NODES</span><span class="s2">&#34;</span> !<span class="o">=</span> <span class="s2">&#34;</span><span class="nv">$TARGET_NODES</span><span class="s2">&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span> </span></span><span class="line"><span class="cl"> <span class="nb">echo</span> <span class="s2">&#34;WARNING: Node count mismatch!&#34;</span> </span></span><span class="line"><span class="cl"><span class="k">fi</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Compare relationship counts</span> </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Comparing relationship counts...&#34;</span> </span></span><span class="line"><span class="cl"><span class="nv">SOURCE_RELS</span><span class="o">=</span><span class="k">$(</span>geode query <span class="s2">&#34;MATCH ()-[r]-&gt;() RETURN count(r)&#34;</span> --host <span class="s2">&#34;</span><span class="nv">$SOURCE_HOST</span><span class="s2">&#34;</span> --format json <span class="p">|</span> jq -r <span class="s1">&#39;.rows[0][&#34;count(r)&#34;]&#39;</span><span class="k">)</span> </span></span><span class="line"><span class="cl"><span class="nv">TARGET_RELS</span><span class="o">=</span><span class="k">$(</span>geode query <span class="s2">&#34;MATCH ()-[r]-&gt;() RETURN count(r)&#34;</span> --host <span class="s2">&#34;</span><span class="nv">$TARGET_HOST</span><span class="s2">&#34;</span> --format json <span class="p">|</span> jq -r <span class="s1">&#39;.rows[0][&#34;count(r)&#34;]&#39;</span><span class="k">)</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Source relationships: </span><span class="nv">$SOURCE_RELS</span><span class="s2">&#34;</span> </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Target relationships: </span><span class="nv">$TARGET_RELS</span><span class="s2">&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="o">[</span> <span class="s2">&#34;</span><span class="nv">$SOURCE_RELS</span><span class="s2">&#34;</span> !<span class="o">=</span> <span class="s2">&#34;</span><span class="nv">$TARGET_RELS</span><span class="s2">&#34;</span> <span class="o">]</span><span class="p">;</span> <span class="k">then</span> </span></span><span class="line"><span class="cl"> <span class="nb">echo</span> <span class="s2">&#34;WARNING: Relationship count mismatch!&#34;</span> </span></span><span class="line"><span class="cl"><span class="k">fi</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Spot check specific records</span> </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;Spot checking records...&#34;</span> </span></span><span class="line"><span class="cl">geode query <span class="s2">&#34;MATCH (p:Person {email: &#39;[email protected]&#39;}) RETURN p&#34;</span> --host <span class="s2">&#34;</span><span class="nv">$TARGET_HOST</span><span class="s2">&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">&#34;=== Validation Complete ===&#34;</span> </span></span></code></pre></div> <h3 id="performance-optimization" class="position-relative d-flex align-items-center group"> <span>Performance Optimization</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-optimization" aria-haspopup="dialog" aria-label="Share link: Performance Optimization"> <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="bulk-loading-best-practices" class="position-relative d-flex align-items-center group"> <span>Bulk Loading 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="bulk-loading-best-practices" aria-haspopup="dialog" aria-label="Share link: Bulk Loading 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><ol> <li><strong>Disable constraints during import</strong>:</li> </ol> <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">Temporarily</span><span class="w"> </span><span class="py">disable</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">ALTER</span><span class="w"> </span><span class="py">DATABASE</span><span class="w"> </span><span class="py">DISABLE</span><span class="w"> </span><span class="py">CONSTRAINTS</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Import</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="err">--</span><span class="w"> </span><span class="kd">...</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="py">Re</span><span class="err">-</span><span class="py">enable</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">ALTER</span><span class="w"> </span><span class="py">DATABASE</span><span class="w"> </span><span class="py">ENABLE</span><span class="w"> </span><span class="py">CONSTRAINTS</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><ol start="2"> <li><strong>Use transactions for batching</strong>:</li> </ol> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-gql" data-lang="gql"><span class="line"><span class="cl"><span class="py">BEGIN</span><span class="w"> </span><span class="py">TRANSACTION</span><span class="err">;</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="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">1</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Alice</span><span class="err">&#39;</span><span class="p">})</span><span class="err">;</span><span class="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="nc">Person</span><span class="w"> </span><span class="p">{</span><span class="py">id</span><span class="p">:</span><span class="w"> </span><span class="nc">2</span><span class="p">,</span><span class="w"> </span><span class="py">name</span><span class="p">:</span><span class="w"> </span><span class="err">&#39;</span><span class="nc">Bob</span><span class="err">&#39;</span><span class="p">})</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="err">--</span><span class="w"> </span><span class="kd">...</span><span class="w"> </span><span class="py">up</span><span class="w"> </span><span class="py">to</span><span class="w"> </span><span class="py">1000</span><span class="w"> </span><span class="py">per</span><span class="w"> </span><span class="py">transaction</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">COMMIT</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><ol start="3"> <li><strong>Create indexes after import</strong>:</li> </ol> <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">Import</span><span class="w"> </span><span class="py">data</span><span class="w"> </span><span class="py">first</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">Then</span><span class="w"> </span><span class="py">create</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">person_email</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Person</span><span class="p">(</span><span class="py">email</span><span class="p">)</span><span class="err">;</span><span class="w"> </span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">CREATE</span><span class="w"> </span><span class="py">INDEX</span><span class="w"> </span><span class="py">person_name</span><span class="w"> </span><span class="py">ON</span><span class="w"> </span><span class="py">Person</span><span class="p">(</span><span class="py">name</span><span class="p">)</span><span class="err">;</span><span class="w"> </span></span></span></code></pre></div><ol start="4"> <li><strong>Use parallel imports</strong>:</li> </ol> <div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Split file and import in parallel</span> </span></span><span class="line"><span class="cl">split -l <span class="m">100000</span> large-file.csv chunk- </span></span><span class="line"><span class="cl">ls chunk-* <span class="p">|</span> parallel -j <span class="m">4</span> <span class="s1">&#39;geode import csv --file {}&#39;</span> </span></span></code></pre></div> <h4 id="memory-optimization" class="position-relative d-flex align-items-center group"> <span>Memory Optimization</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="memory-optimization" aria-haspopup="dialog" aria-label="Share link: Memory Optimization"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># For large imports, increase memory</span> </span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">GEODE_MAX_MEMORY</span><span class="o">=</span>16GB </span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">GEODE_IMPORT_BUFFER_SIZE</span><span class="o">=</span>1GB </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Use streaming import for very large files</span> </span></span><span class="line"><span class="cl">geode import csv <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --file huge-file.csv <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --streaming <span class="nb">true</span> <span class="se">\ </span></span></span><span class="line"><span class="cl"><span class="se"></span> --batch-size <span class="m">1000</span> </span></span></code></pre></div> <h3 id="troubleshooting" class="position-relative d-flex align-items-center group"> <span>Troubleshooting</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="troubleshooting" aria-haspopup="dialog" aria-label="Share link: Troubleshooting"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3> <h4 id="import-fails-with-oom" class="position-relative d-flex align-items-center group"> <span>Import Fails with OOM</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="import-fails-with-oom" aria-haspopup="dialog" aria-label="Share link: Import Fails with OOM"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Reduce batch size</span> </span></span><span class="line"><span class="cl">geode import csv --batch-size <span class="m">100</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Use streaming mode</span> </span></span><span class="line"><span class="cl">geode import csv --streaming <span class="nb">true</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Increase memory</span> </span></span><span class="line"><span class="cl"><span class="nb">export</span> <span class="nv">GEODE_MAX_MEMORY</span><span class="o">=</span>32GB </span></span></code></pre></div> <h4 id="duplicate-key-errors" class="position-relative d-flex align-items-center group"> <span>Duplicate Key Errors</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="duplicate-key-errors" aria-haspopup="dialog" aria-label="Share link: Duplicate Key Errors"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Skip duplicates</span> </span></span><span class="line"><span class="cl">geode import csv --on-duplicate skip </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Update duplicates</span> </span></span><span class="line"><span class="cl">geode import csv --on-duplicate update </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Fail on duplicates (default)</span> </span></span><span class="line"><span class="cl">geode import csv --on-duplicate fail </span></span></code></pre></div> <h4 id="character-encoding-issues" class="position-relative d-flex align-items-center group"> <span>Character Encoding Issues</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="character-encoding-issues" aria-haspopup="dialog" aria-label="Share link: Character Encoding Issues"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h4><div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Specify encoding</span> </span></span><span class="line"><span class="cl">geode import csv --encoding utf-8 </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Convert file first</span> </span></span><span class="line"><span class="cl">iconv -f ISO-8859-1 -t UTF-8 input.csv &gt; input-utf8.csv </span></span></code></pre></div> <h4 id="slow-import-performance" class="position-relative d-flex align-items-center group"> <span>Slow Import 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="slow-import-performance" aria-haspopup="dialog" aria-label="Share link: Slow Import 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-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Check index status (indexes slow down writes)</span> </span></span><span class="line"><span class="cl">geode admin index-status </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Temporarily drop indexes</span> </span></span><span class="line"><span class="cl">geode query <span class="s2">&#34;DROP INDEX person_email&#34;</span> </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Import data</span> </span></span><span class="line"><span class="cl">geode import csv --file data.csv </span></span><span class="line"><span class="cl"> </span></span><span class="line"><span class="cl"><span class="c1"># Recreate indexes</span> </span></span><span class="line"><span class="cl">geode query <span class="s2">&#34;CREATE INDEX person_email ON Person(email)&#34;</span> </span></span></code></pre></div> <h3 id="related-documentation" class="position-relative d-flex align-items-center group"> <span>Related Documentation</span> <button type="button" class="h-share btn btn-link p-0 text-decoration-none link-secondary opacity-50 hover-opacity-100 transition-all ms-1" data-share-target="related-documentation" aria-haspopup="dialog" aria-label="Share link: Related Documentation"> <i class="fa-sharp-duotone fa-solid fa-share-nodes" aria-hidden="true" style="font-size: 0.8em;"></i> <span class="visually-hidden">Share link</span> </button> </h3><ul> <li><strong><a href="/docs/operations/backup/" >Backup Procedures</a> </strong> - Backup-based migration</li> <li><strong><a href="/docs/operations/upgrades/" >Upgrade Procedures</a> </strong> - Version migration</li> <li><strong><a href="/docs/operations/disaster-recovery/" >Disaster Recovery</a> </strong> - DR migration</li> <li><strong><a href="/docs/guides/schema-design/" >Schema Design</a> </strong> - Schema planning</li> <li><strong><a href="/docs/guides/migration-guide/" >Migration Guide (Detailed)</a> </strong> - Extended migration guide</li> </ul>