<!-- 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…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">"MATCH (n) RETURN n.id, labels(n)[0] AS label, properties(n) AS props"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"nodes.csv"</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">"MATCH (a)-[r]->(b) RETURN id(a) AS source, id(b) AS target, type(r) AS type, properties(r) AS props"</span><span class="p">,</span>
</span></span><span class="line"><span class="cl"> <span class="s2">"relationships.csv"</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">"export.json"</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">"export.cypher"</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">"cypher-shell"</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">"UNWIND_BATCH"</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">'{"id": "id", "label": "_label", "props": "_properties"}'</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">'{"source": "_source", "target": "_target", "type": "_type", "props": "_properties"}'</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: '[email protected]'})
</span></span><span class="line"><span class="cl">ON CREATE SET p.name = 'Alice', 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: '[email protected]', name: 'Alice', 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]->(: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]->(: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">-></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">-></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">&&</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">-></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">-></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]->(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]->(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"><< 'EOF'
</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('vertices.json') 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('edges.json') 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('import.gql', 'w') 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 = ', '.join(f"{k}: {json.dumps(v['properties'].get(k, [None])[0])}"
</span></span></span><span class="line"><span class="cl"><span class="s"> for k in v['properties'] if v['properties'][k])
</span></span></span><span class="line"><span class="cl"><span class="s"> out.write(f"CREATE (:{v['label']} {{{props}}});\n")
</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 = ', '.join(f"{k}: {json.dumps(v)}"
</span></span></span><span class="line"><span class="cl"><span class="s"> for k, v in e.get('properties', {}).items())
</span></span></span><span class="line"><span class="cl"><span class="s"> out.write(f"MATCH (a), (b) WHERE id(a) = {e['source']} AND id(b) = {e['target']} "
</span></span></span><span class="line"><span class="cl"><span class="s"> f"CREATE (a)-[:{e['label']} {{{props}}}]->(b);\n")
</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 -> Geode Node Label
</span></span><span class="line"><span class="cl">PostgreSQL Row -> Geode Node
</span></span><span class="line"><span class="cl">PostgreSQL Column -> Geode Property
</span></span><span class="line"><span class="cl">PostgreSQL Foreign Key -> Geode Relationship
</span></span><span class="line"><span class="cl">PostgreSQL Join Table -> 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">'/tmp/users.csv'</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">'/tmp/friendships.csv'</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">"
</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">"</span> <span class="p">|</span> tail -n +2 > 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">'\t'</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">','</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --quote <span class="s1">'"'</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --escape <span class="s1">'\\'</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --null-value <span class="s1">'NULL'</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">"geode-dev.internal"</span>
</span></span><span class="line"><span class="cl"><span class="nv">PROD_HOST</span><span class="o">=</span><span class="s2">"geode-prod.internal"</span>
</span></span><span class="line"><span class="cl"><span class="nv">BACKUP_BUCKET</span><span class="o">=</span><span class="s2">"s3://geode-backups"</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">"=== Migrating Dev to Prod ==="</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">"Creating backup from dev..."</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">"</span><span class="nv">$DEV_HOST</span><span class="s2">"</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --dest <span class="s2">"</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">"</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">"Sanitizing data..."</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">"Restoring to prod..."</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">"</span><span class="nv">$PROD_HOST</span><span class="s2">"</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --source <span class="s2">"</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">"</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">"=== Migration Complete ==="</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">"us-east-1"</span>
</span></span><span class="line"><span class="cl"><span class="nv">TARGET_REGION</span><span class="o">=</span><span class="s2">"eu-west-1"</span>
</span></span><span class="line"><span class="cl"><span class="nv">SOURCE_HOST</span><span class="o">=</span><span class="s2">"geode.us-east.example.com"</span>
</span></span><span class="line"><span class="cl"><span class="nv">TARGET_HOST</span><span class="o">=</span><span class="s2">"geode.eu-west.example.com"</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">"=== Cross-Region Migration ==="</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">"Setting up replication..."</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">"</span><span class="nv">$SOURCE_HOST</span><span class="s2">"</span> <span class="se">\
</span></span></span><span class="line"><span class="cl"><span class="se"></span> --target <span class="s2">"</span><span class="nv">$TARGET_HOST</span><span class="s2">"</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">"Waiting for initial sync..."</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">"</span><span class="nv">$TARGET_HOST</span><span class="s2">"</span><span class="k">)</span>
</span></span><span class="line"><span class="cl"> <span class="nb">echo</span> <span class="s2">"Replication lag: </span><span class="nv">$LAG</span><span class="s2"> bytes"</span>
</span></span><span class="line"><span class="cl"> <span class="o">[</span> <span class="s2">"</span><span class="nv">$LAG</span><span class="s2">"</span> -lt <span class="m">1000</span> <span class="o">]</span> <span class="o">&&</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">"Stopping writes to source..."</span>
</span></span><span class="line"><span class="cl">geode admin read-only --host <span class="s2">"</span><span class="nv">$SOURCE_HOST</span><span class="s2">"</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">"Final synchronization..."</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">"Promoting target..."</span>
</span></span><span class="line"><span class="cl">geode admin promote --host <span class="s2">"</span><span class="nv">$TARGET_HOST</span><span class="s2">"</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">"Update DNS to point to </span><span class="nv">$TARGET_HOST</span><span class="s2">"</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">"=== Migration Complete ==="</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">-></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">-></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">></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">"</span><span class="nv">$1</span><span class="s2">"</span>
</span></span><span class="line"><span class="cl"><span class="nv">TARGET_HOST</span><span class="o">=</span><span class="s2">"</span><span class="nv">$2</span><span class="s2">"</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">"=== Migration Validation ==="</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">"Comparing node counts..."</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">"MATCH (n) RETURN count(n)"</span> --host <span class="s2">"</span><span class="nv">$SOURCE_HOST</span><span class="s2">"</span> --format json <span class="p">|</span> jq -r <span class="s1">'.rows[0]["count(n)"]'</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">"MATCH (n) RETURN count(n)"</span> --host <span class="s2">"</span><span class="nv">$TARGET_HOST</span><span class="s2">"</span> --format json <span class="p">|</span> jq -r <span class="s1">'.rows[0]["count(n)"]'</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">"Source nodes: </span><span class="nv">$SOURCE_NODES</span><span class="s2">"</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">"Target nodes: </span><span class="nv">$TARGET_NODES</span><span class="s2">"</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">"</span><span class="nv">$SOURCE_NODES</span><span class="s2">"</span> !<span class="o">=</span> <span class="s2">"</span><span class="nv">$TARGET_NODES</span><span class="s2">"</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">"WARNING: Node count mismatch!"</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">"Comparing relationship counts..."</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">"MATCH ()-[r]->() RETURN count(r)"</span> --host <span class="s2">"</span><span class="nv">$SOURCE_HOST</span><span class="s2">"</span> --format json <span class="p">|</span> jq -r <span class="s1">'.rows[0]["count(r)"]'</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">"MATCH ()-[r]->() RETURN count(r)"</span> --host <span class="s2">"</span><span class="nv">$TARGET_HOST</span><span class="s2">"</span> --format json <span class="p">|</span> jq -r <span class="s1">'.rows[0]["count(r)"]'</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">"Source relationships: </span><span class="nv">$SOURCE_RELS</span><span class="s2">"</span>
</span></span><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">"Target relationships: </span><span class="nv">$TARGET_RELS</span><span class="s2">"</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">"</span><span class="nv">$SOURCE_RELS</span><span class="s2">"</span> !<span class="o">=</span> <span class="s2">"</span><span class="nv">$TARGET_RELS</span><span class="s2">"</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">"WARNING: Relationship count mismatch!"</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">"Spot checking records..."</span>
</span></span><span class="line"><span class="cl">geode query <span class="s2">"MATCH (p:Person {email: '[email protected]'}) RETURN p"</span> --host <span class="s2">"</span><span class="nv">$TARGET_HOST</span><span class="s2">"</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">"=== Validation Complete ==="</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">'</span><span class="nc">Alice</span><span class="err">'</span><span class="p">})</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="py">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">'</span><span class="nc">Bob</span><span class="err">'</span><span class="p">})</span><span class="err">;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w"></span><span class="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">'geode import csv --file {}'</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 > 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">"DROP INDEX person_email"</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">"CREATE INDEX person_email ON Person(email)"</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>
Migration Guide
Comprehensive migration guide for moving data to Geode from other databases, between environments, and across versions