<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Himadri</title>
    <description>The latest articles on DEV Community by Himadri (@himadrisur).</description>
    <link>https://dev.to/himadrisur</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4039560%2F50239ecf-fdc2-470f-a763-4950b6351901.png</url>
      <title>DEV Community: Himadri</title>
      <link>https://dev.to/himadrisur</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/himadrisur"/>
    <language>en</language>
    <item>
      <title>We nearly published a 2x regression that didn't exist</title>
      <dc:creator>Himadri</dc:creator>
      <pubDate>Mon, 24 Aug 2026 07:02:47 +0000</pubDate>
      <link>https://dev.to/samyama-ai/we-nearly-published-a-2x-regression-that-didnt-exist-3bii</link>
      <guid>https://dev.to/samyama-ai/we-nearly-published-a-2x-regression-that-didnt-exist-3bii</guid>
      <description>&lt;p&gt;We were about to ship a performance write-up claiming three queries had gotten 2-4x slower. All three numbers were wrong, and the reason is one every benchmark author should worry about: the &lt;em&gt;same binary&lt;/em&gt;, on the &lt;em&gt;same machine&lt;/em&gt;, running the &lt;em&gt;same query&lt;/em&gt;, gave different answers depending on what time of day we ran it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The measurement that didn't add up
&lt;/h2&gt;

&lt;p&gt;While checking a change to &lt;a href="https://github.com/samyama-ai/samyama-graph" rel="noopener noreferrer"&gt;Samyama Graph&lt;/a&gt;, we timed LDBC SNB Interactive query IC9 on one commit, one dataset, one 16-core workstation, four hours apart:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;when&lt;/th&gt;
&lt;th&gt;commit&lt;/th&gt;
&lt;th&gt;IC9 median&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;morning&lt;/td&gt;
&lt;td&gt;&lt;code&gt;b2a3557&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;2,822 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;evening&lt;/td&gt;
&lt;td&gt;&lt;code&gt;b2a3557&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;4,912 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Same binary. &lt;strong&gt;1.74x slower&lt;/strong&gt;, four hours later. &lt;code&gt;ps&lt;/code&gt; showed the benchmark pinned at 100% of one core and nothing else on the box above 9%. No other process explains that gap.&lt;/p&gt;

&lt;p&gt;So we ran it again — same binary, minutes apart this time, nothing changed in between:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;run&lt;/th&gt;
&lt;th&gt;IC9 median&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;2,011 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;2,490 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;24% apart. Back to back.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why we almost missed it
&lt;/h2&gt;

&lt;p&gt;We had a real change on &lt;code&gt;main&lt;/code&gt; to compare against a baseline on an older commit. Baseline was measured in the morning; the new code was measured that evening. Read naively, the evening numbers said IC10 had gotten 2x slower, IC11 4x, IC12 3x.&lt;/p&gt;

&lt;p&gt;None of those regressions existed. The host itself had drifted between the two sittings — thermal throttling, frequency scaling, background load, whatever the cause, the machine at 6pm was not the machine at 9am. We re-ran everything back to back, on one sitting, and the picture reversed:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;query&lt;/th&gt;
&lt;th&gt;before (&lt;code&gt;b2a3557&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;after (&lt;code&gt;main&lt;/code&gt;)&lt;/th&gt;
&lt;th&gt;ratio&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;IC9&lt;/td&gt;
&lt;td&gt;4,912 ms&lt;/td&gt;
&lt;td&gt;2,490 ms&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.97x faster&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IC10&lt;/td&gt;
&lt;td&gt;340 ms&lt;/td&gt;
&lt;td&gt;352 ms&lt;/td&gt;
&lt;td&gt;~1.0x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IC11&lt;/td&gt;
&lt;td&gt;382 ms&lt;/td&gt;
&lt;td&gt;400 ms&lt;/td&gt;
&lt;td&gt;~1.0x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IC12&lt;/td&gt;
&lt;td&gt;428 ms&lt;/td&gt;
&lt;td&gt;483 ms&lt;/td&gt;
&lt;td&gt;~1.1x — inside the 24% band&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The change was a genuine ~2x win on IC9 and a wash everywhere else. The "2-4x regressions" were the host, not the code.&lt;/p&gt;

&lt;p&gt;We only caught it because a 4x regression from a small change looked implausible enough to re-measure. A smaller, real regression sitting inside that same noise band would not have raised anyone's eyebrows, and would have shipped.&lt;/p&gt;

&lt;h2&gt;
  
  
  What this means for anyone reading benchmark numbers
&lt;/h2&gt;

&lt;p&gt;Two things, and they cut in opposite directions:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A regression can hide inside the noise.&lt;/strong&gt; If your benchmark's run-to-run variance is 24%, any real regression under ~25% is statistically invisible next to it. A nightly CI gate set to fire on a 25% threshold would page on noise some nights and miss a real 20% regression every other night.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An improvement can be manufactured by timing alone.&lt;/strong&gt; Measure a baseline in the morning and a new version in the evening on a drifting host, and you can produce whatever ratio you want without touching a line of code. This is true whether the drift is accidental or not — which is exactly why "before" and "after" have to come from one sitting.&lt;/p&gt;

&lt;p&gt;Neither of these is specific to our engine, our benchmark suite, or Rust. It's a property of measuring wall-clock time on a shared physical machine, and it will bite any project that compares two numbers taken hours apart and calls the difference a result.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we changed
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A calibration line in every run.&lt;/strong&gt; Each benchmark now times a short, fixed, CPU-bound operation at the start and the end, and reports it alongside load average and mean core frequency. Two runs whose calibration numbers disagree were taken on hosts running at different speeds, whatever the milliseconds of the actual queries say. If a single run's own opening and closing calibration differ by more than 10%, the run says so — its numbers aren't even internally comparable to each other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A rule for before/after claims.&lt;/strong&gt; A performance comparison needs both numbers from one back-to-back session on one machine — not "the same machine," the same &lt;em&gt;sitting&lt;/em&gt;. Quote the ratio, not the absolute milliseconds, when the point is an improvement: a ratio measured back to back survives a slow host; an absolute number doesn't survive being read next to one taken elsewhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-engine ratios get the same treatment.&lt;/strong&gt; If a "we're 3x faster than X" claim has our number from one session and the competitor's from another, the ratio isn't a ratio — it's two unrelated numbers divided by each other. Same machine, same sitting, or the comparison doesn't get published.&lt;/p&gt;

&lt;p&gt;The full account, including the four numbers that started this, is in the original issue: &lt;a href="https://github.com/samyama-ai/samyama-graph/issues/529" rel="noopener noreferrer"&gt;samyama-ai/samyama-graph#529&lt;/a&gt;. The benchmark suite and the LDBC SNB reproducer that surfaced this are in the &lt;a href="https://github.com/samyama-ai/samyama-graph" rel="noopener noreferrer"&gt;repository&lt;/a&gt; — &lt;code&gt;cargo bench --bench ldbc_benchmark&lt;/code&gt;, documented in &lt;a href="https://github.com/samyama-ai/samyama-graph/blob/main/docs/BENCHMARKS.md" rel="noopener noreferrer"&gt;docs/BENCHMARKS.md&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;We'd rather publish this than the regression that wasn't real.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>database</category>
      <category>performance</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Twelve questions, six knowledge graphs, and not one query written by hand</title>
      <dc:creator>Himadri</dc:creator>
      <pubDate>Thu, 20 Aug 2026 12:27:23 +0000</pubDate>
      <link>https://dev.to/himadrisur/twelve-questions-six-knowledge-graphs-and-not-one-query-written-by-hand-dpo</link>
      <guid>https://dev.to/himadrisur/twelve-questions-six-knowledge-graphs-and-not-one-query-written-by-hand-dpo</guid>
      <description>&lt;p&gt;Stuart Broad has dismissed David Warner 20 times.&lt;/p&gt;

&lt;p&gt;That is not a fact you can retrieve by embedding cricket commentary and searching for something similar. It is a &lt;code&gt;count()&lt;/code&gt; over a typed edge. Ask a vector index and you get paragraphs &lt;em&gt;about&lt;/em&gt; their rivalry — the number is nowhere, because the number was never written down anywhere. It only exists once you model dismissals as relationships and count them.&lt;/p&gt;

&lt;p&gt;I have been trying to work out where that line falls: which questions want a vector index, and which want a graph. The most direct way to find out was to give a model six knowledge graphs and ask it things.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/YQDtzhbR8ns"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup
&lt;/h2&gt;

&lt;p&gt;Six MCP servers, each in front of a different graph: bank model risk, cricket, drug interactions, football, Indian Supreme Court judgments, and biological pathways. Claude Code on the other end.&lt;/p&gt;

&lt;p&gt;Before asking anything, I fixed the rules so I could not quietly help it along:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are running a live, recorded demo with 6 MCP servers connected.
RULES for every question I ask next:

- Call exactly ONE MCP tool on the matching server, then stop.
- Answer in ONE short line per row, top 3 only.
- No preamble, no "let me...", no explanation, no follow-up offers. Just the result.
- Never restart or reconfigure anything. Never ask me to confirm.
Reply "Ready." and nothing else.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One tool call per question. No retries, no second attempts, no picking a better phrasing after seeing a bad answer. Whatever came back is what is in the video.&lt;/p&gt;

&lt;p&gt;I never write a query. Claude picks the server, writes the Cypher, and the engine answers.&lt;/p&gt;

&lt;h2&gt;
  
  
  What came back
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Bank model risk — "what feeds the CCAR stress test?"&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Credit Scorecard · Unsecured Personal #00 (Model) → CCAR PPNR · CRE #15
Credit Scorecard · Unsecured Personal #00 (Model) → CCAR PPNR · CRE #27
CCAR PPNR · Project Finance #01 (Model) → CCAR 2026
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is lineage — a path through models, not a lookup. The interesting part is the &lt;em&gt;shape&lt;/em&gt; of the answer: which upstream models reach a regulatory submission, and by which route. There is no document that states this. It is a traversal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pharmacology — "heaviest side-effect burden"&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pregabalin — 839 side effects
Aripiprazole — 827
Citalopram — 823
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Biology — "most connected protein hubs"&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;TP53 — 739 partners
RPS27A — 717
EGFR — 502
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Degree centrality, in other words. TP53 coming top is exactly what anyone in the field would expect, which is the point — it is a sanity check that the graph is loaded correctly and the question was understood.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Indian Supreme Court — "most productive judges"&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Dipak Misra — 104 cases
T. S. Thakur — 81
Rohinton F. Nariman — 74
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Six domains, one session, one tool call each. The model switches between banking and cricket and pharmacology mid-conversation without being told which server to use — it picks from the tool descriptions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that is actually interesting
&lt;/h2&gt;

&lt;p&gt;Every one of these is a &lt;strong&gt;counting or path question over typed relationships&lt;/strong&gt;. Not one of them is a similarity question.&lt;/p&gt;

&lt;p&gt;That is the split I have landed on, and it is less about which technology is better than about what shape the question has:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"What is this like?"&lt;/strong&gt; — a vector index. Fuzzy, semantic, tolerant of phrasing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"How many, via what route, ranked by what?"&lt;/strong&gt; — a graph. Exact, structural, and gives the same answer twice.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;RAG systems overwhelmingly do the first, then struggle when a user asks the second — because "who has dismissed Warner most" retrieves match reports, and the model counts them badly.&lt;/p&gt;

&lt;p&gt;The honest caveat: &lt;strong&gt;there is no vector search anywhere in this video.&lt;/strong&gt; Samyama Graph has HNSW vector search in the same engine, and none of these twelve questions use it. It is all traversal. The genuinely interesting case is the hybrid — retrieve by embedding, then expand the graph around the hits, or traverse first and embed the neighbourhood — and I have only tried the second.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two things I would not put in a launch post
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A cold query is slow.&lt;/strong&gt; In the standalone cricket case study, the first traversal takes 3.1 seconds and the second takes 0.68. Same shape of query, same data. That is a cold cache, and it is the first number anyone will see.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One answer is a data-modelling trap.&lt;/strong&gt; Asked for World Cup titles, the football graph returns Brazil 5, United States 4, Italy 4. If you know football you have already spotted it — that is men's and women's competitions counted together. The engine answered exactly what was asked; the graph does not distinguish the two tournaments. Which is a decent illustration of the real failure mode of this whole approach: the model will faithfully answer a question your schema quietly misunderstood, and it will sound completely confident doing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reproducing it
&lt;/h2&gt;

&lt;p&gt;All eleven case studies are built from public datasets and run end to end — cricket from Cricsheet (CC BY 4.0), drug interactions, pathways, football, legal judgments, and the rest:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/samyama-ai/samyama-graph/tree/main/case_studies" rel="noopener noreferrer"&gt;https://github.com/samyama-ai/samyama-graph/tree/main/case_studies&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The cricket graph is 36,619 nodes and 1,392,017 edges, which is small enough to load on a laptop and large enough that the traversals are not trivial.&lt;/p&gt;

&lt;h2&gt;
  
  
  Disclosure
&lt;/h2&gt;

&lt;p&gt;I work on Samyama Graph — an open-source graph-vector database written in Rust, with OpenCypher queries and HNSW vector search in one engine, 14 graph algorithms, Apache-2.0. So I am not a neutral party on the engine.&lt;/p&gt;

&lt;p&gt;I am much less certain about the retrieval question, and that is the bit I would like to argue about: &lt;strong&gt;for hybrid graph-plus-vector retrieval feeding an LLM, is it better to traverse first and embed the neighbourhood, or retrieve by embedding and expand the graph around the hits?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I have only tried the first. If you have tried the second, I would like to hear how it went.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/samyama-ai/samyama-graph/tree/main/case_studies" rel="noopener noreferrer"&gt;https://github.com/samyama-ai/samyama-graph/tree/main/case_studies&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>database</category>
      <category>rust</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Your GraphRAG stack is two databases. It should be one.</title>
      <dc:creator>Himadri</dc:creator>
      <pubDate>Tue, 21 Jul 2026 11:00:00 +0000</pubDate>
      <link>https://dev.to/samyama-ai/your-graphrag-stack-is-two-databases-it-should-be-one-31c6</link>
      <guid>https://dev.to/samyama-ai/your-graphrag-stack-is-two-databases-it-should-be-one-31c6</guid>
      <description>&lt;p&gt;Most GraphRAG systems today are built with at least two storage layers.&lt;/p&gt;

&lt;p&gt;One system stores vectors.&lt;br&gt;&lt;br&gt;
Another system stores relationships.&lt;/p&gt;

&lt;p&gt;The vector database answers questions like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which chunks, entities, documents, or concepts are semantically close to this query?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The graph database answers questions like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;How are these entities connected, and what paths explain the relationship?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That architecture works, but it creates an important problem:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The join between semantic retrieval and graph reasoning happens outside the database.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Usually, that join happens in application code, orchestration code, or an agent workflow. The application retrieves vector matches, sends those IDs to a graph database, performs a traversal, gets more nodes, and then asks an LLM to assemble the final answer.&lt;/p&gt;

&lt;p&gt;It works.&lt;/p&gt;

&lt;p&gt;But it is not ideal.&lt;/p&gt;

&lt;p&gt;Because once the join moves outside the database, the query planner loses control.&lt;/p&gt;

&lt;p&gt;The system can no longer optimize vector search, graph traversal, filtering, ranking, and graph algorithms together. Each layer only sees part of the problem.&lt;/p&gt;

&lt;p&gt;That is the architectural problem we are exploring with &lt;strong&gt;Samyama Graph&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Samyama Graph is a Rust-native graph-vector database designed for GraphRAG, knowledge graphs, AI agent memory, and large-scale relationship analytics.&lt;/p&gt;

&lt;p&gt;It brings together:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenCypher-style graph querying&lt;/li&gt;
&lt;li&gt;Vector search&lt;/li&gt;
&lt;li&gt;Graph algorithms&lt;/li&gt;
&lt;li&gt;Redis-compatible access&lt;/li&gt;
&lt;li&gt;A single-binary Rust runtime&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The idea is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Graph traversal and vector search should not always live in separate systems. For many GraphRAG workloads, they belong in the same engine.&lt;/p&gt;
&lt;/blockquote&gt;


&lt;h2&gt;
  
  
  Why GraphRAG needs more than vector search
&lt;/h2&gt;

&lt;p&gt;Vector search is very good at semantic similarity.&lt;/p&gt;

&lt;p&gt;It can find text, entities, or documents that “feel close” to a query. That is extremely useful for RAG.&lt;/p&gt;

&lt;p&gt;But vector search alone does not understand relationships.&lt;/p&gt;

&lt;p&gt;For example, if a user asks:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which clinical trials are connected to a drug, a pathway, and a condition through supporting biomedical literature?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A vector search system may retrieve relevant documents. But it does not naturally answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which drug is connected to which condition?&lt;/li&gt;
&lt;li&gt;Which pathway links them?&lt;/li&gt;
&lt;li&gt;Which paper supports the relationship?&lt;/li&gt;
&lt;li&gt;Which clinical trial is related?&lt;/li&gt;
&lt;li&gt;Which path through the knowledge graph explains the answer?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those are graph questions.&lt;/p&gt;

&lt;p&gt;A graph can represent entities and relationships directly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Drug -&amp;gt; targets -&amp;gt; Protein
Protein -&amp;gt; participates_in -&amp;gt; Pathway
Pathway -&amp;gt; associated_with -&amp;gt; Condition
Condition -&amp;gt; studied_in -&amp;gt; ClinicalTrial
Paper -&amp;gt; supports -&amp;gt; Relationship
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where GraphRAG becomes more powerful than basic RAG.&lt;/p&gt;

&lt;p&gt;Instead of retrieving only similar text, the system can retrieve relevant entities and then reason over relationships.&lt;/p&gt;




&lt;h2&gt;
  
  
  The common GraphRAG architecture
&lt;/h2&gt;

&lt;p&gt;A common GraphRAG architecture looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User query
   ↓
Embedding model
   ↓
Vector database
   ↓
Application code / agent logic
   ↓
Graph database
   ↓
Application code / reranking
   ↓
LLM response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is practical, but it adds complexity.&lt;/p&gt;

&lt;p&gt;The application has to decide:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How many vector results to fetch&lt;/li&gt;
&lt;li&gt;Which IDs to send into the graph&lt;/li&gt;
&lt;li&gt;How far to traverse&lt;/li&gt;
&lt;li&gt;Which paths matter&lt;/li&gt;
&lt;li&gt;How to combine graph scores and vector scores&lt;/li&gt;
&lt;li&gt;How to avoid duplicated, irrelevant, or weakly connected context&lt;/li&gt;
&lt;li&gt;How to explain why the final context was selected&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Over time, the orchestration layer becomes a custom query engine.&lt;/p&gt;

&lt;p&gt;But it is not really a query engine. It usually has no cost model, no unified optimizer, and no deep understanding of the data layout across both retrieval modes.&lt;/p&gt;

&lt;p&gt;That is the design smell.&lt;/p&gt;

&lt;p&gt;If the application is doing the join between vector search and graph traversal, the database is no longer solving the full retrieval problem.&lt;/p&gt;




&lt;h2&gt;
  
  
  A different design bet
&lt;/h2&gt;

&lt;p&gt;Samyama Graph takes a different approach.&lt;/p&gt;

&lt;p&gt;Instead of treating graph and vector as separate stores, it explores what happens when both are part of the same database engine.&lt;/p&gt;

&lt;p&gt;Samyama Graph is open source on GitHub:&lt;br&gt;
&lt;a href="https://github.com/samyama-ai/samyama-graph" rel="noopener noreferrer"&gt;https://github.com/samyama-ai/samyama-graph&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The goal is to support workflows where developers can combine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;semantic retrieval&lt;/li&gt;
&lt;li&gt;graph pattern matching&lt;/li&gt;
&lt;li&gt;relationship traversal&lt;/li&gt;
&lt;li&gt;graph algorithms&lt;/li&gt;
&lt;li&gt;structured filtering&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;inside one system.&lt;/p&gt;

&lt;p&gt;In practice, this matters because GraphRAG is rarely just “find the nearest chunks.”&lt;/p&gt;

&lt;p&gt;A useful GraphRAG query often looks more like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Find semantically relevant concepts, then expand through trusted relationships, filter by entity type, rank by graph structure, and return an explainable path.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is a graph-vector problem.&lt;/p&gt;

&lt;p&gt;Not just a vector problem.&lt;/p&gt;


&lt;h2&gt;
  
  
  Why one engine can be useful
&lt;/h2&gt;

&lt;p&gt;Keeping graph traversal and vector search closer together has several advantages.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Less orchestration code
&lt;/h3&gt;

&lt;p&gt;When vector and graph live separately, a lot of glue code is needed.&lt;/p&gt;

&lt;p&gt;Developers have to write custom logic to move IDs, scores, metadata, and filters between systems.&lt;/p&gt;

&lt;p&gt;A single engine can reduce that surface area.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Better explainability
&lt;/h3&gt;

&lt;p&gt;GraphRAG systems should not only return an answer.&lt;/p&gt;

&lt;p&gt;They should help explain why that answer was retrieved.&lt;/p&gt;

&lt;p&gt;Graphs are naturally explainable because they can show paths:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Question
 -&amp;gt; matched entity
 -&amp;gt; related concept
 -&amp;gt; supporting source
 -&amp;gt; final answer context
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is especially important in domains like healthcare, finance, cybersecurity, compliance, and enterprise knowledge management.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Better fit for relationship-heavy data
&lt;/h3&gt;

&lt;p&gt;Some data is naturally connected:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;biomedical knowledge&lt;/li&gt;
&lt;li&gt;clinical trials&lt;/li&gt;
&lt;li&gt;fraud networks&lt;/li&gt;
&lt;li&gt;infrastructure dependencies&lt;/li&gt;
&lt;li&gt;software architecture&lt;/li&gt;
&lt;li&gt;supply chain relationships&lt;/li&gt;
&lt;li&gt;enterprise knowledge graphs&lt;/li&gt;
&lt;li&gt;agent memory&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For these workloads, relationships are not optional metadata. They are the core of the problem.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Cleaner developer experience
&lt;/h3&gt;

&lt;p&gt;A single graph-vector database can make the stack easier to reason about.&lt;/p&gt;

&lt;p&gt;Instead of asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Which database owns this part of retrieval?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;developers can ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What graph-vector query should I run?&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Why Rust?
&lt;/h2&gt;

&lt;p&gt;Samyama Graph is written in Rust.&lt;/p&gt;

&lt;p&gt;Rust is a good fit for database infrastructure because it gives strong control over memory, performance, and concurrency without requiring a garbage-collected runtime.&lt;/p&gt;

&lt;p&gt;For a graph-vector database, that matters.&lt;/p&gt;

&lt;p&gt;Graph workloads can be memory-intensive. Vector search can be compute-heavy. Combining both in one engine requires careful attention to performance and predictable execution.&lt;/p&gt;

&lt;p&gt;Rust gives us a strong foundation for that direction.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Samyama Graph supports today
&lt;/h2&gt;

&lt;p&gt;Samyama Graph currently focuses on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenCypher-style graph querying&lt;/li&gt;
&lt;li&gt;HNSW-based vector search&lt;/li&gt;
&lt;li&gt;Graph algorithms&lt;/li&gt;
&lt;li&gt;Redis-compatible protocol access&lt;/li&gt;
&lt;li&gt;Single-binary deployment&lt;/li&gt;
&lt;li&gt;Docker-based local setup&lt;/li&gt;
&lt;li&gt;Knowledge graph and GraphRAG-style workloads&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is not trying to be every database at once.&lt;/p&gt;

&lt;p&gt;The goal is to be useful for developers who need connected-data reasoning and semantic retrieval in the same system.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where it falls short today
&lt;/h2&gt;

&lt;p&gt;Samyama Graph is still growing, and we want to be transparent about that.&lt;/p&gt;

&lt;p&gt;A few important limitations today:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenCypher support is not yet complete&lt;/li&gt;
&lt;li&gt;The product and ecosystem are still evolving&lt;/li&gt;
&lt;li&gt;Examples, integrations, and tutorials are being expanded&lt;/li&gt;
&lt;li&gt;Some larger benchmark-style claims need more public reproducibility support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We believe open-source infrastructure earns trust when it is clear about both strengths and current gaps.&lt;/p&gt;




&lt;h2&gt;
  
  
  What can you build with Samyama Graph?
&lt;/h2&gt;

&lt;p&gt;Samyama Graph is useful when your application needs both connected-data reasoning and semantic retrieval.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GraphRAG systems that combine vector search with graph traversal&lt;/li&gt;
&lt;li&gt;Knowledge graph applications for enterprise, research, healthcare, and operations data&lt;/li&gt;
&lt;li&gt;AI agent memory where entities, tools, actions, and context are stored as a graph&lt;/li&gt;
&lt;li&gt;Biomedical and clinical graphs across papers, trials, pathways, drugs, and conditions&lt;/li&gt;
&lt;li&gt;Fraud and investigation graphs for relationship discovery and pattern analysis&lt;/li&gt;
&lt;li&gt;Infrastructure and dependency graphs for impact analysis and root-cause exploration&lt;/li&gt;
&lt;li&gt;Large-scale graph analytics using built-in graph algorithms&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Try it locally
&lt;/h2&gt;

&lt;p&gt;You can run Samyama Graph with Docker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; 6379:6379 &lt;span class="nt"&gt;-p&lt;/span&gt; 8080:8080 ghcr.io/samyama-ai/samyama-graph:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then connect with a Redis client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;redis-cli &lt;span class="nt"&gt;-p&lt;/span&gt; 6379
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a simple graph:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;GRAPH.QUERY mydb &lt;span class="s2"&gt;"CREATE (a:Person {name: 'Alice'})-[:KNOWS]-&amp;gt;(b:Person {name: 'Bob'})"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Query it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;GRAPH.QUERY mydb &lt;span class="s2"&gt;"MATCH (a)-[:KNOWS]-&amp;gt;(b) RETURN a.name, b.name"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Why we are building this
&lt;/h2&gt;

&lt;p&gt;We believe the next generation of AI applications will need more than text retrieval.&lt;/p&gt;

&lt;p&gt;They will need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;semantic search&lt;/li&gt;
&lt;li&gt;structured relationships&lt;/li&gt;
&lt;li&gt;graph traversal&lt;/li&gt;
&lt;li&gt;explainable paths&lt;/li&gt;
&lt;li&gt;memory over entities and events&lt;/li&gt;
&lt;li&gt;ranking across both similarity and structure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is why we are building Samyama Graph.&lt;/p&gt;

&lt;p&gt;Not as “just another vector database.”&lt;/p&gt;

&lt;p&gt;Not as “just another graph database.”&lt;/p&gt;

&lt;p&gt;But as a graph-vector database for developers building GraphRAG, knowledge graph, and AI infrastructure systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Open source
&lt;/h2&gt;

&lt;p&gt;Samyama Graph is open source on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/samyama-ai/samyama-graph" rel="noopener noreferrer"&gt;https://github.com/samyama-ai/samyama-graph&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If this project is useful to your GraphRAG, knowledge graph, or AI infrastructure work, a GitHub star helps more developers discover it.&lt;/p&gt;

&lt;p&gt;We would also welcome feedback, issues, examples, and contributions from developers working on graph databases, vector search, Rust infrastructure, RAG, and AI agents.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>database</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
