<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>ArcEHR Blog Blog</title>
        <link>https://arcehr.com/blog/</link>
        <description>ArcEHR Blog Blog</description>
        <lastBuildDate>Mon, 24 Aug 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[My openEHR CDR was 15x slower than the competition... or so I thought]]></title>
            <link>https://arcehr.com/blog/my-openehr-cdr-was-15x-slower</link>
            <guid>https://arcehr.com/blog/my-openehr-cdr-was-15x-slower</guid>
            <pubDate>Mon, 24 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[A week ago I noticed my openEHR Clinical Data Repository (CDR) felt a bit sluggish. Naturally, I benchmarked it against EHRbase.]]></description>
            <content:encoded><![CDATA[<p>A week ago I noticed my openEHR Clinical Data Repository (CDR) felt a bit sluggish. Naturally, I benchmarked it against EHRbase.</p>
<p>The results were brutal:</p>
<p>❌ My CDR: 15 ms to commit a composition</p>
<p>⚡ EHRbase: 1 ms</p>
<p>Humble pie served. I immediately went down the profiling rabbit hole to figure out where my architecture was bleeding performance. After two days of profiling, I accepted that the best I could do with my CDR was 6 times slower than EHRbase.</p>
<p>Fast forward to today: I started benchmarking read performance. To do that, I needed the UIDs of the inserted EHRs and compositions. But EHRbase wasn't returning them in the response body.</p>
<p>That’s when the dominoes started falling:</p>
<ul>
<li class="">I was expecting openEHR REST API 1.1.0 responses, but EHRbase follows 1.0.2 (which returns UIDs in the ETag response header).</li>
<li class="">While investigating responses, I noticed something strange: EHRbase was also returning errors on every single EHR creation.</li>
<li class="">The issue? EHRbase expects an EHR_STATUS with PERSON, whereas the latest spec example uses PARTY_SELF.</li>
</ul>
<p><strong>The plot twist</strong>: That 1 ms benchmark wasn't committing compositions at lightning speed. It was just reporting creation errors in record time. The contributions were never actually processed. 😂</p>
<p>Once I fixed the payload and reran the benchmarks properly:</p>
<p>🐢 EHRbase real speed: 9.62 ms</p>
<p>⚡ My optimized CDR: 4.43 ms</p>
<p>The first test involves creating 100 EHRs, each with 1000 compositions. I’m using an 885-line Vital signs composition to make the test realistic:</p>
<table><thead><tr><th></th><th style="text-align:right">Total mm<!-- -->:ss</th><th style="text-align:right">per composition</th></tr></thead><tbody><tr><td>EHRbase</td><td style="text-align:right">16:02</td><td style="text-align:right">9,62 ms</td></tr><tr><td>ArcEHR</td><td style="text-align:right">7:22</td><td style="text-align:right">4,43 ms</td></tr></tbody></table>
<p>The second test is querying the compositions using all seven different ways to use the GET COMPOSITION endpoints (700k queries):</p>
<table><thead><tr><th></th><th style="text-align:right">Total mm<!-- -->:ss</th><th style="text-align:right">per composition</th></tr></thead><tbody><tr><td>EHRbase</td><td style="text-align:right">30:55</td><td style="text-align:right">18,56 ms</td></tr><tr><td>ArcEHR</td><td style="text-align:right">4:31</td><td style="text-align:right">2,72 ms</td></tr></tbody></table>
<p>I’m running this on my 5-year-old Apple M1 Pro with 16 GB RAM, while simultaneously running 3 IDEs and Docker.</p>
<p>Moral of the story: Always check your HTTP status codes before you start questioning your entire architecture.</p>]]></content:encoded>
            <category>openEHR</category>
            <category>CDR</category>
            <category>Performance</category>
        </item>
        <item>
            <title><![CDATA[How Source Code Access Cut openEHR CDR Query Times to O(1)]]></title>
            <link>https://arcehr.com/blog/how-source-code-access-cut-openehr-cdr-query-times-to-o1</link>
            <guid>https://arcehr.com/blog/how-source-code-access-cut-openehr-cdr-query-times-to-o1</guid>
            <pubDate>Fri, 21 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Judging openEHR CDR performance is tough. You can stress-test by inserting millions of compositions and benchmarking queries. But even if it feels fast, how do you know it can’t be faster?]]></description>
            <content:encoded><![CDATA[<p>Judging openEHR CDR performance is tough. You can stress-test by inserting millions of compositions and benchmarking queries. But even if it feels fast, how do you know it can’t be faster?</p>
<p>When I finished my openEHR CDR, it was hitting 15ms per committed composition. Humanly fast—but I wanted to test the limits.</p>
<p>Because ArcEHR gives customers full source code access—and uses an open-source database written in the same language—I ran the IntelliJ IDEA profiler across the entire stack.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-profilers-trail">The Profiler's Trail<a href="https://arcehr.com/blog/how-source-code-access-cut-openehr-cdr-query-times-to-o1#the-profilers-trail" class="hash-link" aria-label="Direct link to The Profiler's Trail" title="Direct link to The Profiler's Trail" translate="no">​</a></h2>
<ol>
<li class="">The flame graph pointed to high execution time inside CreateCompositionHandler:</li>
</ol>
<p><img decoding="async" loading="lazy" alt="Check for duplicate UID" src="https://arcehr.com/blog/assets/images/profiler-3-check-version-fec83bcc32e75ff94681b984069d8391.png" width="2878" height="1404" class="img_ev3q"></p>
<ol start="2">
<li class="">Drill-down revealed the culprit: lookupByUid(), an innocent check to see if a UID already exists.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="lookupByUID method" src="https://arcehr.com/blog/assets/images/profiler-4-lookup-176a1e3f96e524644e468937b396b2f5.png" width="2884" height="1406" class="img_ev3q"></p>
<ol start="3">
<li class="">Following the query into the database engine exposed why the SQL query was lagging.</li>
</ol>
<p><img decoding="async" loading="lazy" alt="Database engine SQL equals condition evaluator" src="https://arcehr.com/blog/assets/images/profiler-5-db-equals-361d8f30dc5e48f99dd3d8863890ae87.png" width="2884" height="1408" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-fix">The Fix<a href="https://arcehr.com/blog/how-source-code-access-cut-openehr-cdr-query-times-to-o1#the-fix" class="hash-link" aria-label="Direct link to The Fix" title="Direct link to The Fix" translate="no">​</a></h2>
<p>The UID lookup index was using an LSM Tree. Switching to a Hash Index brought lookup time down to O(1)—ensuring lookups stay instant no matter how large the CDR grows.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://arcehr.com/blog/how-source-code-access-cut-openehr-cdr-query-times-to-o1#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p><strong>Why source code matters</strong>: Without visibility into the full stack, a bottleneck like this remains invisible. Source code access turns black-box performance limits into solvable engineering problems.</p>
<p>Have you encountered performance bottlenecks or scaling issues with your openEHR CDR? How are you profiling your health data architecture?</p>]]></content:encoded>
            <category>openEHR</category>
            <category>CDR</category>
            <category>Performance</category>
        </item>
        <item>
            <title><![CDATA[Tired of AQL to fetch openEHR data?]]></title>
            <link>https://arcehr.com/blog/tired-of-aql-to-fetch-openehr-data</link>
            <guid>https://arcehr.com/blog/tired-of-aql-to-fetch-openehr-data</guid>
            <pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Traditionally, querying hierarchical and deeply nested openEHR Reference Model (RM) data requires using AQL (Archetype Query Language).]]></description>
            <content:encoded><![CDATA[<p>Traditionally, querying hierarchical and deeply nested openEHR Reference Model (RM) data requires using AQL (Archetype Query Language).</p>
<p>In ArcEHR, we map the openEHR Reference Model directly to a graph database using ArcadeDB. It also comes with a free and open-source data browser <a href="https://www.arcadedb.com/#gs-tab-docker" target="_blank" rel="noopener noreferrer" class="">ArcadeDB Studio</a>.</p>
<p><img decoding="async" loading="lazy" alt="ArcadeDB Studio" src="https://arcehr.com/blog/assets/images/studio-e96a6770f6f93f968e0f0e61a154dc64.png" width="1778" height="1934" class="img_ev3q"></p>
<p>Best of all? You can still query and manipulate this graph data using standard SQL through any PostgreSQL GUI client or library.</p>
<p>Here is a quick look at how INSERT and SELECT work under the hood.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>You can use your preferred PostgreSQL client to work with the ArcEHR database.</p><p>Developers can use their preferred PostgreSQL library to work with the ArcEHR database.</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="inserting-openehr-data">Inserting openEHR Data<a href="https://arcehr.com/blog/tired-of-aql-to-fetch-openehr-data#inserting-openehr-data" class="hash-link" aria-label="Direct link to Inserting openEHR Data" title="Direct link to Inserting openEHR Data" translate="no">​</a></h2>
<p>To insert openEHR data, we use a simple SQL INSERT statement targeting the <code>create_composition</code> table. Behind the scenes, a database trigger automatically processes this payload, shredding the JSON and storing the composition directly into RM Document nodes and relationship edges.</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">INSERT</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">INTO</span><span class="token plain"> create_composition </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">ehr_id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> content</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">VALUES</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"ehr-1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"archetype_node_id"</span><span class="token plain">: </span><span class="token string" style="color:#e3116c">"openEHR-EHR-COMPOSITION.encounter.v1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"name"</span><span class="token plain">: {</span><span class="token string" style="color:#e3116c">"value"</span><span class="token plain">: </span><span class="token string" style="color:#e3116c">"Vital Signs"</span><span class="token plain">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"uid"</span><span class="token plain">: {</span><span class="token string" style="color:#e3116c">"_type"</span><span class="token plain">: </span><span class="token string" style="color:#e3116c">"OBJECT_VERSION_ID"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"value"</span><span class="token plain">: </span><span class="token string" style="color:#e3116c">"8849182c::openEHRSys.example.com::1"</span><span class="token plain">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"archetype_details"</span><span class="token plain">: {</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"archetype_id"</span><span class="token plain">: {</span><span class="token string" style="color:#e3116c">"value"</span><span class="token plain">: </span><span class="token string" style="color:#e3116c">"openEHR-EHR-COMPOSITION.encounter.v1"</span><span class="token plain">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"template_id"</span><span class="token plain">: {</span><span class="token string" style="color:#e3116c">"value"</span><span class="token plain">: </span><span class="token string" style="color:#e3116c">"Example.v1::c7ec861c-c413-39ff-9965-a198ebf44747"</span><span class="token plain">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">"rm_version"</span><span class="token plain">: </span><span class="token string" style="color:#e3116c">"1.0.2"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    }</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"language"</span><span class="token plain">: {</span><span class="token string" style="color:#e3116c">"terminology_id"</span><span class="token plain">: {</span><span class="token string" style="color:#e3116c">"value"</span><span class="token plain">: </span><span class="token string" style="color:#e3116c">"ISO_639-1"</span><span class="token plain">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"code_string"</span><span class="token plain">: </span><span class="token string" style="color:#e3116c">"en"</span><span class="token plain">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token string" style="color:#e3116c">"content"</span><span class="token plain">: </span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">{</span><span class="token string" style="color:#e3116c">"_type"</span><span class="token plain">: </span><span class="token string" style="color:#e3116c">"COMPOSITION"</span><span class="token plain">}</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">}</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>The schema of our create_composition table strictly mirrors the <a href="https://specifications.openehr.org/releases/ITS-REST/development/ehr.html#tag/COMPOSITION" target="_blank" rel="noopener noreferrer" class="">openEHR REST API</a>, keeping integration painless.</p>
<table><thead><tr><th>Field</th><th>Type</th><th>Required</th><th>Default</th><th>Allowed values</th></tr></thead><tbody><tr><td><code>ehr_id</code></td><td><code>STRING</code></td><td>Mandatory</td><td>—</td><td>—</td></tr><tr><td><code>prefer</code></td><td><code>STRING</code></td><td>Optional</td><td><code>return=minimal</code></td><td><code>return=(representation|minimal|identifier)</code></td></tr><tr><td><code>accept</code></td><td><code>STRING</code></td><td>Optional</td><td><code>application/json</code></td><td><code>application/(json|xml)</code></td></tr><tr><td><code>content_type</code></td><td><code>STRING</code></td><td>Optional</td><td><code>application/json</code></td><td><code>application/(json|xml)</code></td></tr><tr><td><code>openehr_item_tag</code></td><td><code>ARRAY</code></td><td>Optional</td><td>-</td><td>—</td></tr><tr><td><code>openehr_version_item_tag</code></td><td><code>ARRAY</code></td><td>Optional</td><td>-</td><td>—</td></tr><tr><td><code>content</code></td><td><code>STRING</code></td><td>Mandatory</td><td>—</td><td>—</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="querying-openehr-data-zero-joins-needed">Querying openEHR Data (Zero Joins Needed)<a href="https://arcehr.com/blog/tired-of-aql-to-fetch-openehr-data#querying-openehr-data-zero-joins-needed" class="hash-link" aria-label="Direct link to Querying openEHR Data (Zero Joins Needed)" title="Direct link to Querying openEHR Data (Zero Joins Needed)" translate="no">​</a></h2>
<p>Because this is a graph database, we use the database's native <code>out()</code> function to traverse edges. To find all blood pressure records for an EHR or Composition, we simply traverse the corresponding edge. No JOINs, no performance degradation as your dataset grows.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="scenario-a-simple-select-with-one-archetype">Scenario A: Simple SELECT with One Archetype<a href="https://arcehr.com/blog/tired-of-aql-to-fetch-openehr-data#scenario-a-simple-select-with-one-archetype" class="hash-link" aria-label="Direct link to Scenario A: Simple SELECT with One Archetype" title="Direct link to Scenario A: Simple SELECT with One Archetype" translate="no">​</a></h3>
<p>Let’s fetch the blood pressure data for a specific EHR:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> $blood_pressure</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">$event </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> blood_pressure</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">FROM</span><span class="token plain">   EHR</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">LET    $blood_pressure </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">out</span><span class="token punctuation" style="color:#393A34">(</span><span class="token identifier punctuation" style="color:#393A34">`</span><span class="token identifier">openEHR-EHR-OBSERVATION.blood_pressure.v2</span><span class="token identifier punctuation" style="color:#393A34">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">WHERE</span><span class="token plain">  $ehr </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ehr-1"</span><br></div></code></pre></div></div>
<p>Result:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"blood_pressure"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ELEMENT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"archetype_node_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"at0004"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DV_TEXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Systolic"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DV_QUANTITY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"magnitude"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">140.5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"units"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"mm[Hg]"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ELEMENT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"archetype_node_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"at0005"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DV_TEXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Diastolic"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DV_QUANTITY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"magnitude"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80.1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"units"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"mm[Hg]"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="scenario-b-querying-multiple-archetypes-with-filters">Scenario B: Querying Multiple Archetypes with Filters<a href="https://arcehr.com/blog/tired-of-aql-to-fetch-openehr-data#scenario-b-querying-multiple-archetypes-with-filters" class="hash-link" aria-label="Direct link to Scenario B: Querying Multiple Archetypes with Filters" title="Direct link to Scenario B: Querying Multiple Archetypes with Filters" translate="no">​</a></h3>
<p>What if we want both blood pressure and pulse for a patient, filtered by specific clinical thresholds?</p>
<p>We can leverage the CONTAINS operator to traverse and filter nested collections in a single, readable query:</p>
<div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">SELECT</span><span class="token plain"> $blood_pressure</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">$event </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> blood_pressure</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> $pulse</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">$event </span><span class="token keyword" style="color:#00009f">AS</span><span class="token plain"> pulse</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">FROM</span><span class="token plain">   EHR</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">LET    $blood_pressure </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">out</span><span class="token punctuation" style="color:#393A34">(</span><span class="token identifier punctuation" style="color:#393A34">`</span><span class="token identifier">openEHR-EHR-OBSERVATION.blood_pressure.v2</span><span class="token identifier punctuation" style="color:#393A34">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">       $pulse </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">out</span><span class="token punctuation" style="color:#393A34">(</span><span class="token identifier punctuation" style="color:#393A34">`</span><span class="token identifier">openEHR-EHR-OBSERVATION.pulse.v2</span><span class="token identifier punctuation" style="color:#393A34">`</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">WHERE</span><span class="token plain">  $ehr </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ehr-1"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token operator" style="color:#393A34">AND</span><span class="token plain">  $blood_pressure</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">$event </span><span class="token keyword" style="color:#00009f">CONTAINS</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          archetype_node_id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"at0004"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">AND</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">-- Systolic</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token keyword" style="color:#00009f">value</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">magnitude </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">140</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">AND</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">value</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">units </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"mm[Hg]"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token operator" style="color:#393A34">AND</span><span class="token plain">  $pulse</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">$event </span><span class="token keyword" style="color:#00009f">CONTAINS</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          archetype_node_id </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"at0004"</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">AND</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic">-- Rate</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">          </span><span class="token keyword" style="color:#00009f">value</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">magnitude </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">AND</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">value</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">units </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/min"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>This returns a clean, structured JSON object containing both clinical data points simultaneously—without a single SQL JOIN:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"blood_pressure"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ELEMENT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"archetype_node_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"at0004"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DV_TEXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Systolic"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DV_QUANTITY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"magnitude"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">140.5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"units"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"mm[Hg]"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ELEMENT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"archetype_node_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"at0005"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DV_TEXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Diastolic"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DV_QUANTITY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"magnitude"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">80.1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"units"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"mm[Hg]"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token property" style="color:#36acaa">"pulse"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"ELEMENT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"archetype_node_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"at0004"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DV_TEXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Rate"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"DV_QUANTITY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"magnitude"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">83.7</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token property" style="color:#36acaa">"units"</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"/min"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">      </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="developer-tooling">Developer Tooling<a href="https://arcehr.com/blog/tired-of-aql-to-fetch-openehr-data#developer-tooling" class="hash-link" aria-label="Direct link to Developer Tooling" title="Direct link to Developer Tooling" translate="no">​</a></h2>
<p>If you want to visualize your graph traversals, you can use the open-source <a href="https://www.arcadedb.com/#gs-tab-docker" target="_blank" rel="noopener noreferrer" class="">ArcadeDB Studio</a> browser to run and analyze your queries visually. Or, simply stick to your favorite PostgreSQL client and libraries — ArcEHR speaks PostgreSQL natively.</p>]]></content:encoded>
            <category>openEHR</category>
            <category>SQL</category>
            <category>PostgreSQL</category>
        </item>
        <item>
            <title><![CDATA[TypeScript PostgreSQL for openEHR data]]></title>
            <link>https://arcehr.com/blog/typescript-pg-for-openEHR-data</link>
            <guid>https://arcehr.com/blog/typescript-pg-for-openEHR-data</guid>
            <pubDate>Thu, 16 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[One of the biggest hurdles in healthtech development is the sheer complexity of querying hierarchical clinical schemas. Usually, this means learning complex, niche query languages.]]></description>
            <content:encoded><![CDATA[<p>One of the biggest hurdles in healthtech development is the sheer complexity of querying hierarchical clinical schemas. Usually, this means learning complex, niche query languages.</p>
<p>If you are using ArcEHR, you don't need any of that. You can query and insert graph-mapped openEHR data using the standard, vanilla <code>pg</code> library in TypeScript.</p>
<p>Because ArcEHR presents a PostgreSQL-compatible interface over ArcadeDB, your existing database drivers, parameterized queries, and connection pools work out of the box.</p>
<p>Here is how easily you can handle openEHR CRUD operations in TypeScript:</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-the-setup">1. The Setup<a href="https://arcehr.com/blog/typescript-pg-for-openEHR-data#1-the-setup" class="hash-link" aria-label="Direct link to 1. The Setup" title="Direct link to 1. The Setup" translate="no">​</a></h2>
<p>No custom database clients required. Just import the standard <code>pg</code> driver, initialize your client, and connect.</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> Client </span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'pg'</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> client </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">new</span><span class="token plain"> </span><span class="token class-name">Client</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    database</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'arcehr'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    port</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5432</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    user</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'root'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    password</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'arcadedb'</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">connect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-inserting-openehr-data-with-type-safety">2. Inserting openEHR Data with Type Safety<a href="https://arcehr.com/blog/typescript-pg-for-openEHR-data#2-inserting-openehr-data-with-type-safety" class="hash-link" aria-label="Direct link to 2. Inserting openEHR Data with Type Safety" title="Direct link to 2. Inserting openEHR Data with Type Safety" translate="no">​</a></h2>
<p>When inserting openEHR data, you pass your structured JSON payload directly as a parameterized query. A trigger on the create_composition table handles the heavy lifting, automatically shredding the JSON into RM Document types and graph edges.</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic">// Insert a new composition</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> content </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  archetype_node_id</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'openEHR-EHR-COMPOSITION.encounter.v1'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  name</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">value</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Vital Signs'</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  uid</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">_type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'OBJECT_VERSION_ID'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> value</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'8849182c::openEHRSys.example.com::1'</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  archetype_details</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    archetype_id</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">value</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'openEHR-EHR-COMPOSITION.encounter.v1'</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    template_id</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">value</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Example.v1::c7ec861c-c413-39ff-9965-a198ebf44747'</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    rm_version</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'1.0.2'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  language</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain">terminology_id</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> value</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'ISO_639-1'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> code_string</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'en'</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  content</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"> _type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'OBSERVATION'</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> insert </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">INSERT INTO create_composition (ehr_id, content) VALUES ($1, $2)</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">query</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">insert</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'ehr-1'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> content</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p><strong>The Response</strong>: You receive a clean response back, confirming the target EHR and returning the database record ID (<code>@rid</code>):</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  ehr_id</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> 'ehr</span><span class="token number" style="color:#36acaa">-1</span><span class="token plain">'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  content</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> '</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"archetype_node_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"openEHR-EHR-COMPOSITION.encounter.v1"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"Vital Signs"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"uid"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"OBJECT_VERSION_ID"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"8849182c::openEHRSys.example.com::1"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"archetype_details"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"archetype_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"openEHR-EHR-COMPOSITION.encounter.v1"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"template_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"Example.v1::c7ec861c-c413-39ff-9965-a198ebf44747"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"rm_version"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"1.0.2"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"language"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"terminology_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"ISO_639-1"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"code_string"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"en"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"content"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"COMPOSITION"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain">'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  prefer</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> 'return=minimal'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  content_type</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token null keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  accept</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token null keyword" style="color:#00009f">null</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  '@rid'</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> '#</span><span class="token number" style="color:#36acaa">72</span><span class="token operator" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">1</span><span class="token plain">'</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-querying-openehr-data-zero-join-graph-traversal">3. Querying openEHR Data (Zero-Join Graph Traversal)<a href="https://arcehr.com/blog/typescript-pg-for-openEHR-data#3-querying-openehr-data-zero-join-graph-traversal" class="hash-link" aria-label="Direct link to 3. Querying openEHR Data (Zero-Join Graph Traversal)" title="Direct link to 3. Querying openEHR Data (Zero-Join Graph Traversal)" translate="no">​</a></h2>
<p>Because ArcEHR stores this data as a graph under the hood, we can traverse nested clinical paths in a single query without performance-killing relational JOINs.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="scenario-a-fetching-blood-pressure">Scenario A: Fetching Blood Pressure<a href="https://arcehr.com/blog/typescript-pg-for-openEHR-data#scenario-a-fetching-blood-pressure" class="hash-link" aria-label="Direct link to Scenario A: Fetching Blood Pressure" title="Direct link to Scenario A: Fetching Blood Pressure" translate="no">​</a></h3>
<p>Lets pull all blood pressure records for a specific EHR. Note how we use standard $1 placeholders to prevent SQL injection:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> select </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">SELECT $blood_pressure.$event AS blood_pressure</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">                FROM   EHR</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">                LET    $blood_pressure = out("openEHR-EHR-OBSERVATION.blood_pressure.v2")</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">                WHERE  $ehr = $1</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">query</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">select</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'ehr-1'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p><strong>Resulting JSON</strong>: You get back clean, structured openEHR Reference Model JSON elements directly in your application:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  blood_pressure</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"ELEMENT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"ELEMENT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"archetype_node_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"at0004"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_TEXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_TEXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"Systolic"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_QUANTITY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_QUANTITY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"magnitude"</span><span class="token operator" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">746.5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"units"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"mm[Hg]"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"ELEMENT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"ELEMENT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"archetype_node_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"at0005"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_TEXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_TEXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"Diastolic"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_QUANTITY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_QUANTITY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"magnitude"</span><span class="token operator" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">526.1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"units"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"mm[Hg]"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"ELEMENT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"ELEMENT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"archetype_node_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"at0004"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_TEXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_TEXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"Systolic"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_QUANTITY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_QUANTITY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"magnitude"</span><span class="token operator" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">746.5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"units"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"mm[Hg]"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"ELEMENT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"ELEMENT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"archetype_node_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"at0005"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_TEXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_TEXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"Diastolic"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_QUANTITY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_QUANTITY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"magnitude"</span><span class="token operator" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">526.1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"units"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"mm[Hg]"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="scenario-b-multi-archetype-queries-with-path-filtering">Scenario B: Multi-Archetype Queries with Path Filtering<a href="https://arcehr.com/blog/typescript-pg-for-openEHR-data#scenario-b-multi-archetype-queries-with-path-filtering" class="hash-link" aria-label="Direct link to Scenario B: Multi-Archetype Queries with Path Filtering" title="Direct link to Scenario B: Multi-Archetype Queries with Path Filtering" translate="no">​</a></h3>
<p>What if you need to fetch both blood pressure and pulse, but only return records where the patient's vitals exceed specific safety thresholds?</p>
<p>We use the <code>CONTAINS</code> operator to query inside the nested clinical arrays:</p>
<div class="language-typescript codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-typescript codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">const</span><span class="token plain"> select </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token template-string string" style="color:#e3116c">SELECT $blood_pressure.$event AS blood_pressure, $pulse.$event AS pulse</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">                FROM   EHR</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">                LET    $blood_pressure = out("openEHR-EHR-OBSERVATION.blood_pressure.v2"),</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">                       $pulse = out("openEHR-EHR-OBSERVATION.pulse.v2")</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">                WHERE  $ehr = $1</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">                  AND  $blood_pressure.$event CONTAINS (</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">                           archetype_node_id = "at0004" AND -- Systolic</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">                           value.magnitude &gt; 140 AND value.units = "mm[Hg]")</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">                  AND  $pulse.$event CONTAINS (</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">                           archetype_node_id = "at0004" AND -- Rate</span><br></div><div class="token-line" style="color:#393A34"><span class="token template-string string" style="color:#e3116c">                           value.magnitude &gt; 80 AND value.units = "/min")</span><span class="token template-string template-punctuation string" style="color:#e3116c">`</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">await</span><span class="token plain"> client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token function" style="color:#d73a49">query</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">select</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'ehr-1'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><br></div></code></pre></div></div>
<p>Result:</p>
<div class="language-json codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-json codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  blood_pressure</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"ELEMENT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"ELEMENT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"archetype_node_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"at0004"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_TEXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_TEXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"Systolic"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_QUANTITY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_QUANTITY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"magnitude"</span><span class="token operator" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">746.5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"units"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"mm[Hg]"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"ELEMENT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"ELEMENT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"archetype_node_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"at0005"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_TEXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_TEXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"Diastolic"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_QUANTITY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_QUANTITY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"magnitude"</span><span class="token operator" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">526.1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"units"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"mm[Hg]"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"ELEMENT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"ELEMENT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"archetype_node_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"at0004"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_TEXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_TEXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"Systolic"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_QUANTITY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_QUANTITY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"magnitude"</span><span class="token operator" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">746.5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"units"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"mm[Hg]"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"ELEMENT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"ELEMENT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"archetype_node_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"at0005"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_TEXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_TEXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"Diastolic"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_QUANTITY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_QUANTITY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"magnitude"</span><span class="token operator" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">526.1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"units"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"mm[Hg]"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  pulse</span><span class="token operator" style="color:#393A34">:</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"ELEMENT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"ELEMENT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"archetype_node_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"at0004"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_TEXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_TEXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"Rate"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_QUANTITY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_QUANTITY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"magnitude"</span><span class="token operator" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">636.7</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"units"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"/min"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token punctuation" style="color:#393A34">[</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"ELEMENT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"ELEMENT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"archetype_node_id"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"at0004"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"name"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_TEXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_TEXT"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"Rate"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"value"</span><span class="token operator" style="color:#393A34">:</span><span class="token punctuation" style="color:#393A34">{</span><span class="token property" style="color:#36acaa">"@type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_QUANTITY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"_type"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"DV_QUANTITY"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"magnitude"</span><span class="token operator" style="color:#393A34">:</span><span class="token number" style="color:#36acaa">636.7</span><span class="token punctuation" style="color:#393A34">,</span><span class="token property" style="color:#36acaa">"units"</span><span class="token operator" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"/min"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">  </span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">}</span><br></div></code></pre></div></div>
<p>No database schema migrations, no nested relational mapping code, and no performance loss. Just standard PostgreSQL queries executing lightning-fast graph traversals in Node.js.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-takeaway">The Takeaway<a href="https://arcehr.com/blog/typescript-pg-for-openEHR-data#the-takeaway" class="hash-link" aria-label="Direct link to The Takeaway" title="Direct link to The Takeaway" translate="no">​</a></h2>
<p>When building modern clinical applications, you shouldn't have to compromise between the rich standards of openEHR and developer-friendly tooling. ArcEHR lets you use the standard Node/TypeScript ecosystem you already know and love to query complex health data seamlessly.</p>]]></content:encoded>
            <category>openEHR</category>
            <category>SQL</category>
            <category>PostgreSQL</category>
            <category>TypeScript</category>
        </item>
        <item>
            <title><![CDATA[How should we query openEHR data?]]></title>
            <link>https://arcehr.com/blog/how-should-we-query-openEHR-data</link>
            <guid>https://arcehr.com/blog/how-should-we-query-openEHR-data</guid>
            <pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Pablo and Sidharth recently kicked off a great debate: Should we write queries using AQL/SQL, or is a visual query builder the way to go?]]></description>
            <content:encoded><![CDATA[<p>Pablo and Sidharth recently kicked off a great <a href="https://discourse.openehr.org/t/querying-an-openehr-cdr-with-sql-cypher-and-graphql-yes-it-s-possible/17088/11" target="_blank" rel="noopener noreferrer" class="">debate</a>: Should we write queries using AQL/SQL, or is a visual query builder the way to go?</p>
<p>I think there’s a third option that is changing the game: Natural Language via AI.</p>
<p>Instead of wrestling with syntax, you type:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Get EHR data where systolic blood pressure &gt; 140 mm[Hg] and pulse &gt; 80/min</span><br></div></code></pre></div></div>
<p>In ArcEHR, I use SQL as the main querying language, allowing developers to either write queries by hand or let the integrated AI assistant do the heavy lifting.</p>
<p>Modern LLMs excel at translating intent to precise database queries. If they can navigate complex codebases, a few lines of SQL is a breeze.</p>
<p>What’s your preferred approach for openEHR?</p>
<ol>
<li class="">By hand (SQL/AQL) – Complete control and precision.</li>
<li class="">Visual Builder – Drag-and-drop, low-code, accessible.</li>
<li class="">AI/Natural Language – Fast, intuitive, zero syntax overhead.</li>
</ol>
<p>ArcEHR Studio is a great example of the first and third approach in action:</p>
<p><img decoding="async" loading="lazy" alt="ArcEHR Studio" src="https://arcehr.com/blog/assets/images/ai-assistant-8a7efdae2a97332403815f8ba4b689a6.png" width="2649" height="1584" class="img_ev3q"></p>]]></content:encoded>
            <category>openEHR</category>
            <category>SQL</category>
            <category>AQL</category>
            <category>Studio</category>
        </item>
        <item>
            <title><![CDATA[openEHR with SQL and graph traversal]]></title>
            <link>https://arcehr.com/blog/openehr-sql-graph-traversal</link>
            <guid>https://arcehr.com/blog/openehr-sql-graph-traversal</guid>
            <pubDate>Fri, 10 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[I made some progress with SQL queries using graph traversal over openEHR data:]]></description>
            <content:encoded><![CDATA[<p>I made some progress with SQL queries using graph traversal over openEHR data:</p>
<p><code>COMPOSITION.encounter.v1</code> <strong>has</strong> <code>OBSERVATION.blood_pressure.v2</code></p>
<p>Since ArcEHR maps openEHR Reference Model (RM) to the graph database, we can use graph traversal to query the openEHR data. The data stored in the graph database is much more efficient than the relational database. No joins are needed to retrieve the data. We use <code>out('has_openEHR-EHR-OBSERVATION.blood_pressure.v2')</code> to get all the blood pressure records for a given COMPOSITION or EHR.</p>
<!-- -->
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="simple-select-with-one-archetype">Simple SELECT with one archetype<a href="https://arcehr.com/blog/openehr-sql-graph-traversal#simple-select-with-one-archetype" class="hash-link" aria-label="Direct link to Simple SELECT with one archetype" title="Direct link to Simple SELECT with one archetype" translate="no">​</a></h3>
<p>Let's say we want to get the blood pressure data for a given encounter.</p>
<p>We can use the <code>out()</code> function to get all the blood pressure records for a given encounter.
The <code>out()</code> function takes an edge type name as an argument.
The <code>out()</code> function returns a list of all the records that have the specified edge type.
The <code>out()</code> function can be used to traverse the graph database to get the data.</p>
<p><img decoding="async" loading="lazy" alt="SQL Query" src="https://arcehr.com/blog/assets/images/sql-single-223de3a4afaa91b1ecb28f5670e4860c.png" width="1472" height="192" class="img_ev3q"></p>
<p>Result:</p>
<p><img decoding="async" loading="lazy" alt="Result of the SQL Query" src="https://arcehr.com/blog/assets/images/sql-single-result-a799685f45a837b5ad13c8808146cab7.png" width="1468" height="846" class="img_ev3q"></p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="select-with-multiple-archetypes">SELECT with multiple archetypes<a href="https://arcehr.com/blog/openehr-sql-graph-traversal#select-with-multiple-archetypes" class="hash-link" aria-label="Direct link to SELECT with multiple archetypes" title="Direct link to SELECT with multiple archetypes" translate="no">​</a></h3>
<p>Let's say we want to get the blood pressure and pulse data for a given encounter.
We can use the <code>out()</code> function to get all the blood pressure and pulse records for a given encounter.
We can use the <code>CONTAINS</code> operator to filter the records.
The <code>CONTAINS</code> operator takes a sub-query as an argument.
The <code>CONTAINS</code> operator returns a list of all the records that satisfy the sub-query.</p>
<p>Result:</p>
<p><img decoding="async" loading="lazy" alt="SQL Query" src="https://arcehr.com/blog/assets/images/sql-multi-03a3893eafcbc7a0fa11927c7e451a92.png" width="1466" height="542" class="img_ev3q"></p>
<p>Result:</p>
<p><img decoding="async" loading="lazy" alt="Result of the SQL Query" src="https://arcehr.com/blog/assets/images/sql-multi-result-e94dccb69e05ec27aa46d18907e75ae1.png" width="1462" height="1240" class="img_ev3q"></p>]]></content:encoded>
            <category>openEHR</category>
            <category>SQL</category>
            <category>Graph</category>
            <category>ArcadeDB</category>
        </item>
        <item>
            <title><![CDATA[Querying an openEHR CDR with SQL, Cypher, and GraphQL? Yes, it’s possible.]]></title>
            <link>https://arcehr.com/blog/querying-openehr-cdr-with-sql-cypher-graphql</link>
            <guid>https://arcehr.com/blog/querying-openehr-cdr-with-sql-cypher-graphql</guid>
            <pubDate>Tue, 07 Jul 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[If you work with openEHR, you already know Archetype Query Language (AQL). It’s a brilliant technical achievement designed specifically for hierarchical health data.]]></description>
            <content:encoded><![CDATA[<p>If you work with openEHR, you already know Archetype Query Language (AQL). It’s a brilliant technical achievement designed specifically for hierarchical health data.</p>
<p>But let’s be honest: most developers and analysts outside the openEHR ecosystem have never heard of it. When onboarding new engineers to a health tech project, teaching them AQL from scratch is a massive bottleneck. Usually, they have to write or look at something like this just to get blood pressure data:</p>
<p><img decoding="async" loading="lazy" alt="AQL Query" src="https://arcehr.com/blog/assets/images/aql-f749e13b3815d6b2c0c853dfe3f35f78.png" width="1446" height="394" class="img_ev3q"></p>
<p>What if you could build an openEHR Clinical Data Repository (CDR) but let your team use the technologies they already know? You can even treat the CDR as a PostgreSQL database.</p>
<p>By leveraging ArcadeDB, we can enable polyglot querying over openEHR data structures. Your developers and analysts can pick the exact query language that fits their background:</p>
<!-- -->
<ul>
<li class="">SQL: Extended with graph traversal, full-text search, vector, and time-series functions.</li>
<li class="">Cypher (openCypher): A drop-in replacement for Neo4j Cypher.</li>
<li class="">Gremlin: Apache TinkerPop graph traversal.</li>
<li class="">GraphQL: Schema-driven queries natively over HTTP.</li>
<li class="">MongoDB QL: Document-oriented queries via the MongoDB protocol.</li>
<li class="">GQL: Native Graph Query Language support coming soon.</li>
</ul>
<p>The best part? Because ArcadeDB supports the PostgreSQL wire protocol, your team can use standard Postgres tools and drivers to connect to the server and run these queries. For advanced use cases, even more power can be unlocked directly via the Java API.</p>
<p>SQL and Cypher are particularly powerful for handling the deeply nested, interconnected nature of clinical models.</p>
<p>Here is how that exact same blood pressure AQL query looks when translated into SQL and Cypher, along with the clean JSON output you get back.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-sql-approach-using-arcadedbs-extended-sql">The SQL Approach (Using ArcadeDB's Extended SQL)<a href="https://arcehr.com/blog/querying-openehr-cdr-with-sql-cypher-graphql#the-sql-approach-using-arcadedbs-extended-sql" class="hash-link" aria-label="Direct link to The SQL Approach (Using ArcadeDB's Extended SQL)" title="Direct link to The SQL Approach (Using ArcadeDB's Extended SQL)" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="SQL Query" src="https://arcehr.com/blog/assets/images/sql-ce27babae3e47b43a9136e301fdf4409.png" width="994" height="422" class="img_ev3q"></p>
<p>Resulting JSON:</p>
<p><img decoding="async" loading="lazy" alt="Result of the SQL Query" src="https://arcehr.com/blog/assets/images/sql-result-d70a2a3d8ce2c4f0cddbd988ed4465b6.png" width="936" height="720" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-cypher-approach-graph--list-comprehension">The Cypher Approach (Graph &amp; List Comprehension)<a href="https://arcehr.com/blog/querying-openehr-cdr-with-sql-cypher-graphql#the-cypher-approach-graph--list-comprehension" class="hash-link" aria-label="Direct link to The Cypher Approach (Graph &amp; List Comprehension)" title="Direct link to The Cypher Approach (Graph &amp; List Comprehension)" translate="no">​</a></h2>
<p>If your team comes from a Neo4j or graph background, they can use Cypher's native pattern matching and projections to extract the exact schema they want:</p>
<p><img decoding="async" loading="lazy" alt="Cypher Query" src="https://arcehr.com/blog/assets/images/cypher-e7de20f8ec06431ad38361d1abec2fba.png" width="964" height="802" class="img_ev3q"></p>
<p>You don't have to rewrite your architecture or force your team to learn a niche query language just to use openEHR.</p>
<p>Moving from a working multi-model query proof-of-concept to building the official openEHR REST API layer is where this transforms from a cool database experiment into a production-ready, interoperable Clinical Data Repository (CDR).</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="where-the-project-stands-today-and-whats-next">Where the Project Stands Today (and What's Next)<a href="https://arcehr.com/blog/querying-openehr-cdr-with-sql-cypher-graphql#where-the-project-stands-today-and-whats-next" class="hash-link" aria-label="Direct link to Where the Project Stands Today (and What's Next)" title="Direct link to Where the Project Stands Today (and What's Next)" translate="no">​</a></h2>
<p>I have built a working proof of concept of an openEHR CDR using the Apache 2.0 licensed ArcadeDB. Currently, it can successfully load any openEHR COMPOSITION and make the data immediately available for multi-model querying.</p>
<p>Next up on the roadmap: Adding the official openEHR REST API layer on top of this engine to handle standardized EHR management and composition ingestion compliance.</p>
<p>Since ArcadeDB is already handling the heavy lifting of storing and querying the raw COMPOSITIONs via its multi-model engine, the REST API layer will essentially act as the compliance and translation gateway.</p>
<p>What do you think? Would giving your dev team SQL or Cypher access accelerate your openEHR adoption, or do you prefer sticking strictly to native AQL? Let me know in the comments! 👇</p>]]></content:encoded>
            <category>openEHR</category>
            <category>SQL</category>
            <category>Cypher</category>
            <category>ArcadeDB</category>
        </item>
        <item>
            <title><![CDATA[openEHR full-stack platform]]></title>
            <link>https://arcehr.com/blog/openehr-full-stack-platform</link>
            <guid>https://arcehr.com/blog/openehr-full-stack-platform</guid>
            <pubDate>Mon, 29 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Is an openEHR CDR without integrated forms a developer’s nightmare? Anyone who has worked with openEHR knows the power of its two-level data model. But they also know the friction: forcing developers to abandon their familiar daily tools, reinvent the wheel for UIs, and grapple with complex data storage.]]></description>
            <content:encoded><![CDATA[<p>Is an openEHR CDR without integrated forms a developer’s nightmare? Anyone who has worked with openEHR knows the power of its two-level data model. But they also know the friction: forcing developers to abandon their familiar daily tools, reinvent the wheel for UIs, and grapple with complex data storage.</p>
<p>How can we bridge the gap between openEHR’s complexity and standard rapid application development?</p>
<p>What if we could use:</p>
<ul>
<li class="">the tools most developers are already familiar with and use daily</li>
<li class="">existing development approaches</li>
<li class="">existing tools and frameworks for UI</li>
</ul>
<p>What if we didn't have to reinvent the wheel for openEHR projects?</p>
<!-- -->
<p>openEHR uses a two-level data model. Does a two-level openEHR data model require a two-level storage model? Can we save openEHR data using a standard relational model?</p>
<p>I remember Thomas' remark that we would need 10000+ tables. I agreed. But what if tables are generated and migration is handled using tools like Liquibase?</p>
<ul>
<li class="">Standard SQL tools and frameworks could be used.</li>
<li class="">Use SQL for stored data.</li>
<li class="">Having a 100% relational schema.</li>
</ul>
<p>However a pure SQL approach lacks constructs like inheritance, logic in triggers, and events (it has them, but they are not powerful enough). In short, it lacks the object-oriented constructs that make complex development manageable. Forcing SQL to do too much wasn't productive.</p>
<p>Instead of treating archetypes as SQL, I tried treating archetypes as code.</p>
<p>My first pick was <a href="https://www.jmix.io/" target="_blank" rel="noopener noreferrer" class="">Jmix.io</a>. It is a rapid application development platform with everything included. It includes Jmix Studio to customize the UI.</p>
<p>I also tried:</p>
<ul>
<li class=""><a href="https://www.odoo.com/" target="_blank" rel="noopener noreferrer" class="">https://www.odoo.com/</a></li>
<li class=""><a href="https://orm.drizzle.team/" target="_blank" rel="noopener noreferrer" class="">https://orm.drizzle.team/</a></li>
<li class=""><a href="https://typeorm.io/" target="_blank" rel="noopener noreferrer" class="">https://typeorm.io/</a></li>
<li class=""><a href="https://formkit.com/" target="_blank" rel="noopener noreferrer" class="">https://formkit.com/</a></li>
<li class=""><a href="https://frappe.io/framework" target="_blank" rel="noopener noreferrer" class="">https://frappe.io/framework</a></li>
</ul>
<p>So far, Jmix is the best suited full-stack platform for the complexity we are dealing with in openEHR.</p>
<p>I'm currently researching graph databases for storing openEHR data. I'm making great progress with <a href="https://arcadedb.com/" target="_blank" rel="noopener noreferrer" class="">ArcadeDB</a>.</p>
<p>A few screenshots of the code (all the code is generated, not handwritten):</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="jmix">Jmix<a href="https://arcehr.com/blog/openehr-full-stack-platform#jmix" class="hash-link" aria-label="Direct link to Jmix" title="Direct link to Jmix" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Jmix" src="https://arcehr.com/blog/assets/images/jmix-6467a0ea032667a534436616f3f19073.png" width="2002" height="1652" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="Jmix DV_TEXT" src="https://arcehr.com/blog/assets/images/jmix-dvtext-16f14dabe2b800330c0815daa7f99fad.png" width="1484" height="1462" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="drizzle">Drizzle<a href="https://arcehr.com/blog/openehr-full-stack-platform#drizzle" class="hash-link" aria-label="Direct link to Drizzle" title="Direct link to Drizzle" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Drizzle CLUSTER" src="https://arcehr.com/blog/assets/images/drizzle-cluster-100dbf46cfdb02848ca60d0df9bc314e.png" width="1586" height="898" class="img_ev3q"></p>
<p><img decoding="async" loading="lazy" alt="Drizzle DV_TEXT" src="https://arcehr.com/blog/assets/images/drizzle-dvtext-8ea1c576176c57dd7ae101b4113db8e7.png" width="1824" height="1092" class="img_ev3q"></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="arcadedb">ArcadeDB<a href="https://arcehr.com/blog/openehr-full-stack-platform#arcadedb" class="hash-link" aria-label="Direct link to ArcadeDB" title="Direct link to ArcadeDB" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Archetype Definition" src="https://arcehr.com/blog/assets/images/arcadedb-archetype-definition-d542d8a0e6f25bb56f048bfef0c6f121.png" width="1816" height="1504" class="img_ev3q"></p>
<p>This can be queried using the following SQL:</p>
<p><img decoding="async" loading="lazy" alt="SQL Query" src="https://arcehr.com/blog/assets/images/arcadedb-sql-97de00c66e9fe7a1206ae7a822a17ab8.jpeg" width="1456" height="300" class="img_ev3q"></p>]]></content:encoded>
            <category>openEHR</category>
            <category>ArcadeDB</category>
        </item>
        <item>
            <title><![CDATA[openEHR archetypes as SQL tables]]></title>
            <link>https://arcehr.com/blog/openehr-archetypes-as-sql-tables</link>
            <guid>https://arcehr.com/blog/openehr-archetypes-as-sql-tables</guid>
            <pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Sidharth Ramesh proposes openEHR archetypes as SQL tables and I'm one of the few sympathizers of that approach 😊]]></description>
            <content:encoded><![CDATA[<p><a href="https://www.linkedin.com/posts/sidharthramesh1_last-week-i-argued-that-a-shared-clinical-share-7475213215476502528-ytj8/" target="_blank" rel="noopener noreferrer" class="">Sidharth Ramesh</a> proposes <strong>openEHR archetypes as SQL tables</strong> and I'm one of the few sympathizers of that approach 😊</p>
<p>I tried it with 4 different SQL/ORM libraries, but those pure SQL approaches aren't a good match for openEHR highly hierarchical data.</p>
<p>My current attempt involves implementing the openEHR Reference Model (RM) on <a href="https://arcadedb.com/" target="_blank" rel="noopener noreferrer" class="">ArcadeDB</a>. The POC works well. Users can query using the standard ArcadeDB flavor of SQL in their browsers (all Apache 2.0 licensed).</p>
<!-- -->
<p>I see ArcadeDB as a candidate for both transactional and analytical openEHR CDR. It would avoid the "black box" nature of existing CDRs which force users to use a niche querying language (AQL) to get any data out of the CDR.</p>
<p>Another "feature" is skipping at-codes for querying, substituting them with readable property names familiar to experts who query traditional relational databases:</p>
<p><img decoding="async" loading="lazy" alt="Archetype Definition" src="https://arcehr.com/blog/assets/images/archetype-definition-d542d8a0e6f25bb56f048bfef0c6f121.png" width="1816" height="1504" class="img_ev3q"></p>
<p>This can be queried using the following SQL:</p>
<p><img decoding="async" loading="lazy" alt="SQL Query" src="https://arcehr.com/blog/assets/images/sql-97de00c66e9fe7a1206ae7a822a17ab8.jpeg" width="1456" height="300" class="img_ev3q"></p>]]></content:encoded>
            <category>openEHR</category>
            <category>SQL</category>
            <category>ArcadeDB</category>
        </item>
    </channel>
</rss>