<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://hugegraph.apache.org/blog/</id>
    <title>Apache HugeGraph Blog</title>
    <updated>2025-10-29T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://hugegraph.apache.org/blog/"/>
    <subtitle>Apache HugeGraph Blog</subtitle>
    <icon>https://hugegraph.apache.org/img/hugegraph-logo.svg</icon>
    <entry>
        <title type="html"><![CDATA[Agentic GraphRAG]]></title>
        <id>https://hugegraph.apache.org/blog/2025/10/29/agentic-graphrag/</id>
        <link href="https://hugegraph.apache.org/blog/2025/10/29/agentic-graphrag/"/>
        <updated>2025-10-29T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[To address the problem of temporal discrepancies between model training data and real-world data, Retrieval-Augmented Generation (RAG) technology has emerged. RAG, as the name suggests, is a technique that retrieves relevant data from external data sources (Retrieval) to augment (Argument) the quality of the answers generated (Generation) by large language models.]]></summary>
        <content type="html"><![CDATA[<p>To address the problem of temporal discrepancies between model training data and real-world data, Retrieval-Augmented Generation (RAG) technology has emerged. RAG, as the name suggests, is a technique that retrieves relevant data from external data sources (Retrieval) to augment (Argument) the quality of the answers generated (Generation) by large language models.</p>
<p>The earliest RAG employed a simple Retrieval-Generation architecture. We take the user's question, perform some pre-processing (keyword extraction, etc.), obtain the pre-processed question, and then use an Embedding Model to grab relevant information from a vast amount of data as a Prompt, which is then fed to the large language model to enhance the quality of its responses.</p>
<p>However, relying solely on semantic similarity matching to retrieve relevant information may not handle all situations, as the information that can enhance answer quality may not always be semantically similar to the question itself. A common example is: "Tell me the ontological view of the disciple of the philosopher who proposed that water is the origin of all things." Our data may not directly contain the answer to this question. The knowledge base might contain:</p>
<ol>
<li class="">Thales proposed that water is the origin of all things.</li>
<li class="">Anaximander was a disciple of Thales.</li>
<li class="">Anaximander identified the Apeiron, which has no formal definition, as the origin of all things.</li>
</ol>
<p>If we rely solely on semantic similarity matching, we are likely to only retrieve the first sentence to augment the large language model's answer. However, without information from sentences 2 and 3, and if the large language model lacks philosophy-related knowledge in its training data, it will be unable to correctly answer the question and might even "hallucinate."</p>
<p>Therefore, GraphRAG technology was developed. A typical GraphRAG involves two steps:</p>
<ol>
<li class="">Offline: We need to build a graph index for the knowledge base offline (converting unstructured data into structured data and storing it in a graph database).</li>
<li class="">Online: When the GraphRAG system receives a user question, it can capture the relationships between different entities in the knowledge base using the graph database. Consequently, we can retrieve the three sentences above (the specific graph database index might look like the following example).</li>
</ol>
<div style="text-align:center">
  <img decoding="async" loading="lazy" src="https://hugegraph.apache.org/blog/images/images-server/agentic-background.png" alt="image" width="400" class="img_ev3q">
</div>
<p>However, GraphRAG itself also presents several challenges:</p>
<ol>
<li class="">How to construct the Graph Index is a complex task, and the quality of the Graph Index impacts the quality of the model's answers.</li>
<li class="">The GraphRAG index construction process consumes a significant number of tokens.</li>
<li class="">GraphRAG involves a variety of graph algorithms. How can we achieve the best Retrieval performance? (The configuration space is too large).</li>
</ol>
<p>This project primarily focuses on the third issue. We aim to leverage the generalization capabilities of large language models to automatically identify the user's intent within the question and then select the appropriate configuration (such as choosing the most suitable graph algorithm) to retrieve the corresponding data from the graph database to enhance the quality of the large language model's answer. This is the objective of Agentic GraphRAG.</p>
<h1>Existing Workflow: Elegant Decoupling, Unfinished Parallelism</h1>
<p>The current HugeGraph-AI project has two core abstractions:</p>
<ol>
<li class="">Operator: Represents an "atomic operation unit" responsible for completing a specific subtask, such as vector index construction, vector similarity search, graph data related operations, and so on.</li>
<li class="">Workflow: An execution flow composed of Operators as nodes in a <strong>chain-like</strong> structure. The pre-defined Workflows in the project correspond one-to-one with the project's demo use cases (e.g., GraphRAG, Vector-Similarity-Based RAG).</li>
</ol>
<p>The implementation of an Operator needs to adhere to the following interface:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">Operator</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token decorator annotation punctuation" style="color:rgb(199, 146, 234)">@abstractmethod</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">run</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">dict</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token builtin" style="color:rgb(130, 170, 255)">str</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> Any</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">dict</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token builtin" style="color:rgb(130, 170, 255)">str</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain">Any</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">		</span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<p>During actual runtime, an Operator accepts a dictionary-type context object as input, and the returned object is also a dictionary, which can be used as input for the next Operator. This design has one very clever aspect: it decouples the dependencies between different Operators from the specific implementation of the Operator itself. Each Operator is a relatively independent entity. If Operator A needs to rely on the output of Operator B, it only needs to check if the context object contains the output of Operator B. This is a loosely coupled design. The advantage is that we can easily combine different Operators freely. Assembling (configuring) a suitable Workflow to serve user requests based on different user inputs - isn't that precisely the goal of Agentic GraphRAG mentioned in the project background?</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">👉🏼 Theoretically, the existing design can already transition smoothly to Agentic GraphRAG. However, the current design has several outstanding issues:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    1. The existing scheduler only supports chain-like Workflows, missing potential parallelism.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    2. The existing scheduler cannot reuse Workflows that are repeatedly used.</span><br></div></code></pre></div></div>
<h1>Breaking Free from Chains: Embracing a New Architecture</h1>
<p>The previous scheduler inspired us with the idea that decoupling at the Operator level is a good design principle. However, the limited capabilities of the scheduler itself restrict the potential of the Workflow. Therefore, we plan to replace the scheduler in the project! After a brief survey of several different Workflow orchestration frameworks, we believe the following features are the criteria for selecting a scheduler (hereinafter, we uniformly refer to the framework's orchestration object as <strong>Workflow</strong>, and Workflow consists of a series of <strong>Task</strong>s):</p>
<ol>
<li class="">Parallelism: Can different Tasks in a Workflow without data dependencies be automatically executed in parallel?</li>
<li class="">Low Coupling: The specific implementation of a Task should be decoupled from the Workflow itself (in layman's terms: can a Task be a node in several different Workflows, and does the implementation of a Task need to include constraints related to dependencies on other Tasks?)</li>
<li class="">Data Sharing: Since we want to decouple the dependencies between different Tasks, we need a Workflow-level data sharing mechanism to share data (for parameter passing) between different Tasks.</li>
<li class="">Provides a Python Interface.</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai-framework-rumble">AI Framework Rumble<a href="https://hugegraph.apache.org/blog/2025/10/29/agentic-graphrag/#ai-framework-rumble" class="hash-link" aria-label="Direct link to AI Framework Rumble" title="Direct link to AI Framework Rumble" translate="no">​</a></h2>
<p>We first turned our attention to the currently popular AI Workflow scheduling frameworks. Around the aforementioned dimensions, we investigated several different Workflow orchestration frameworks - LlamaIndex, Agno, Pydantic-Ai, and LangGraph.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="llamaindex">LlamaIndex<a href="https://hugegraph.apache.org/blog/2025/10/29/agentic-graphrag/#llamaindex" class="hash-link" aria-label="Direct link to LlamaIndex" title="Direct link to LlamaIndex" translate="no">​</a></h3>
<p>Regarding LlamaIndex, we will use a common example to illustrate the design philosophy of this framework.</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">from</span><span class="token plain"> workflows </span><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> Workflow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> Context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> step</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">from</span><span class="token plain"> workflows</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">events </span><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> StartEvent</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> StopEvent</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> Event</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">StepEvent</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">Event</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    message</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">str</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">MyWorkflow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">Workflow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token decorator annotation punctuation" style="color:rgb(199, 146, 234)">@step</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">step_one</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> ev</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> StartEvent</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"> StepEvent</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">       current_count </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">await</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">store</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"count"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> default</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">       current_count </span><span class="token operator" style="color:rgb(137, 221, 255)">+=</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">       </span><span class="token keyword" style="font-style:italic">await</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">store</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token builtin" style="color:rgb(130, 170, 255)">set</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"count"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> current_count</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">       </span><span class="token keyword" style="font-style:italic">print</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"step one called once"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">       </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> StepEvent</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"launch step two"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">       </span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token decorator annotation punctuation" style="color:rgb(199, 146, 234)">@step</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">async</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">step_two</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> ctx</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> ev</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> StepEvent</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"> StopEvent</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">       </span><span class="token keyword" style="font-style:italic">print</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"step two called once"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">       </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> StopEvent</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><br></div></code></pre></div></div>
<p>From the above simple example, we can see many problems. First, let's clarify a concept: a Workflow consists of two elements: Tasks and the dependencies between Tasks. Once these two elements are determined, a Workflow is established. We can see that in LlamaIndex, the implementation of each Task (corresponding to the function annotated with @step in the code) has a dependency on the Workflow. This is because the implementation of each Task needs to pass the Event object as a parameter, but the Event parameter is actually a constraint on the dependencies between Tasks. Therefore, LlamaIndex does not have the characteristic of low coupling. At the same time, we also found that the Task being a member function of the Workflow class itself violates our earlier requirement that Tasks should be able to be used in multiple different Workflows. However, after investigation, LlamaIndex's data sharing and parallel features are reasonably good. It's just that the programming interface built on the event-driven model sacrifices programming flexibility while ensuring ease of use.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="agno">Agno<a href="https://hugegraph.apache.org/blog/2025/10/29/agentic-graphrag/#agno" class="hash-link" aria-label="Direct link to Agno" title="Direct link to Agno" translate="no">​</a></h3>
<p>Still starting with the example:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">from</span><span class="token plain"> agno</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">workflow </span><span class="token keyword" style="font-style:italic">import</span><span class="token plain"> Router</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> Step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> Workflow</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">route_by_topic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">step_input</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"> List</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">Step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    topic </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> step_input</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token builtin" style="color:rgb(130, 170, 255)">input</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">lower</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"tech"</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">in</span><span class="token plain"> topic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">Step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">name</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">"Tech Research"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> agent</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">tech_expert</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">elif</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"business"</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">in</span><span class="token plain"> topic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">Step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">name</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">"Business Research"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> agent</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">biz_expert</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">else</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">Step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">name</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">"General Research"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> agent</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">generalist</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">workflow </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> Workflow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    name</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">"Expert Routing"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    steps</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        Router</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            name</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">"Topic Router"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            selector</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">route_by_topic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            choices</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">tech_step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> business_step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> general_step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        Step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">name</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">"Synthesis"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> agent</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">synthesizer</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">workflow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">print_response</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"Latest developments in artificial intelligence and machine learning"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> markdown</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token boolean" style="color:rgb(255, 88, 116)">True</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><br></div></code></pre></div></div>
<p>From this example, we can see that the binding relationship between the Workflow itself and the Task is determined by specifying the <strong>steps</strong> parameter. Theoretically, after defining a Task, we can use it in different Workflows. Agno's design meets our low-coupling standard.</p>
<p>However, there are certain limitations in terms of data sharing and task parallelism.</p>
<p>First, let's look at task parallelism, with the following example:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">workflow </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> Workflow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    name</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">"Parallel Research Pipeline"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    steps</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        Parallel</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            Step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">name</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">"HackerNews Research"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> agent</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">hn_researcher</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            Step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">name</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">"Web Research"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> agent</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">web_researcher</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            Step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">name</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">"Academic Research"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> agent</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">academic_researcher</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            name</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">"Research Step"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        Step</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">name</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token string" style="color:rgb(195, 232, 141)">"Synthesis"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> agent</span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain">synthesizer</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Combines the results and produces a report</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><br></div></code></pre></div></div>
<p>Agno specifically designed a parallel interface, requiring us to explicitly define which tasks can be executed in parallel during static compilation (although Python doesn't really have a compilation time; it should be called "when writing code" haha 😀). However, the Workflow ultimately constructed by Agentic GraphRAG might be planned by the model at runtime, determined dynamically. Considering this, we believe Agno's parallelism feature does not meet our requirements.</p>
<p>Next is data sharing. The Agno framework supports three different types of Tasks:</p>
<ol>
<li class="">Agent</li>
<li class="">Team (composed of multiple Agents)</li>
<li class="">Pure Function</li>
</ol>
<p>We inspected the latest version of the Agno source code at the time of our research and found that Agno supports state sharing only between Agents and Teams. Therefore, for those Tasks that are suitable for implementation with Pure Functions, we need to support an additional data-sharing mechanism. Consequently, Agno's data-sharing mechanism also does not meet our requirements.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="pydantic-ai">Pydantic-Ai<a href="https://hugegraph.apache.org/blog/2025/10/29/agentic-graphrag/#pydantic-ai" class="hash-link" aria-label="Direct link to Pydantic-Ai" title="Direct link to Pydantic-Ai" translate="no">​</a></h3>
<p>We saw from the official documentation</p>
<div style="text-align:center">
  <img decoding="async" loading="lazy" src="https://hugegraph.apache.org/blog/images/images-server/agentic-pydantic.png" alt="image" width="800" class="img_ev3q">
</div>
<p>Surprisingly, the Pydantic-Ai framework doesn't support automatic parallelism at the Task level.</p>
<p>Similar to the LlamaIndex framework, it adopts an event-driven programming model. Therefore, the Workflow and Task are not completely decoupled. However, it's worth noting that a Pydantic-Ai Task can be used in multiple different Workflows.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="langgraph">LangGraph<a href="https://hugegraph.apache.org/blog/2025/10/29/agentic-graphrag/#langgraph" class="hash-link" aria-label="Direct link to LangGraph" title="Direct link to LangGraph" translate="no">​</a></h3>
<p>Finally, we've arrived at LangGraph. The reason we hadn't researched LangGraph before was because a teammate believed LangGraph itself was too heavy. In the previous version, even when using only a part of LangGraph's functionality (scheduling), it was necessary to import LangGraph's full dependencies. Importing LangGraph might make the project "heavy." Seeing phrases like "xxx is xxx times faster than LangGraph" in other open-source projects also influenced our decision-making. So, it's only now that we're putting it on the research agenda.</p>
<p>Let's take a look at a LangGraph example.</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">State</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">TypedDict</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    topic</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">str</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    joke</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">str</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    improved_joke</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">str</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Nodes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">generate_joke</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">state</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> State</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">"""First LLM call to generate initial joke"""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    msg </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> llm</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">invoke</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string-interpolation string" style="color:rgb(195, 232, 141)">f"Write a short joke about </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token string-interpolation interpolation">state</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string-interpolation interpolation string" style="color:rgb(195, 232, 141)">'topic'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token string-interpolation string" style="color:rgb(195, 232, 141)">"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token string" style="color:rgb(195, 232, 141)">"joke"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> msg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">content</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">check_punchline</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">state</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> State</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">"""Gate function to check if the joke has a punchline"""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Simple check - does the joke contain "?" or "!"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"?"</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">in</span><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(195, 232, 141)">"joke"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">or</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"!"</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">in</span><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string" style="color:rgb(195, 232, 141)">"joke"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"Pass"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"Fail"</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">improve_joke</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">state</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> State</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">"""Second LLM call to improve the joke"""</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    msg </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> llm</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">invoke</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string-interpolation string" style="color:rgb(195, 232, 141)">f"Make this joke funnier by adding wordplay: </span><span class="token string-interpolation interpolation punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token string-interpolation interpolation">state</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token string-interpolation interpolation string" style="color:rgb(195, 232, 141)">'joke'</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token string-interpolation string" style="color:rgb(195, 232, 141)">"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token string" style="color:rgb(195, 232, 141)">"improved_joke"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> msg</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">content</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Build workflow</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">workflow </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> StateGraph</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">State</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Add nodes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">workflow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">add_node</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"generate_joke"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> generate_joke</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">workflow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">add_node</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"improve_joke"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> improve_joke</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Add edges to connect nodes</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">workflow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">add_edge</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">START</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"generate_joke"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">workflow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">add_conditional_edges</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token string" style="color:rgb(195, 232, 141)">"generate_joke"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> check_punchline</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token string" style="color:rgb(195, 232, 141)">"Fail"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"improve_joke"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"Pass"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> END</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">workflow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">add_edge</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"improve_joke"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> END</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Compile</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">chain </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> workflow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token builtin" style="color:rgb(130, 170, 255)">compile</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Invoke</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">state </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> chain</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">invoke</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">{</span><span class="token string" style="color:rgb(195, 232, 141)">"topic"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"cats"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">}</span><br></div></code></pre></div></div>
<p>This is a simplified example from the official documentation. We can see that LangGraph, based on the Graph API, decouples the Workflow and Task by calling workflow.add_edge to specify the Workflow's dependencies. It also supports a global State as the Workflow's state for data sharing between Tasks. According to the official documentation, LangGraph supports automatic parallel execution of Tasks. We've finally found a Workflow orchestration framework that meets all of our requirements!</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="总结">总结<a href="https://hugegraph.apache.org/blog/2025/10/29/agentic-graphrag/#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="Direct link to 总结" title="Direct link to 总结" translate="no">​</a></h3>








































<table><thead><tr><th></th><th>Parallelism</th><th>Low Coupling</th><th>Data Sharing</th><th>Python Interface</th></tr></thead><tbody><tr><td>LlamaIndex</td><td>Supported</td><td>Not Supported</td><td>Supported</td><td>Supported</td></tr><tr><td>Agno</td><td>Supported but doesn't meet requirements</td><td>Supported</td><td>Supported but doesn't meet requirements</td><td>Supported</td></tr><tr><td>Pydantic-Ai</td><td>Not Supported</td><td>Not Supported</td><td>Supported</td><td>Supported</td></tr><tr><td>LangGraph</td><td>Supported</td><td>Supported</td><td>Supported</td><td>Supported</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cgraph--graph-with-python-interaface-implement-in-c">CGraph —— Graph with Python Interaface Implement in C++<a href="https://hugegraph.apache.org/blog/2025/10/29/agentic-graphrag/#cgraph--graph-with-python-interaface-implement-in-c" class="hash-link" aria-label="Direct link to CGraph —— Graph with Python Interaface Implement in C++" title="Direct link to CGraph —— Graph with Python Interaface Implement in C++" translate="no">​</a></h2>
<p>Just as we were focusing on LangGraph, a teammate mentioned a new solution - CGraph. This is a graph scheduling framework developed by open-source creator Chunel using C++, and it aims to compete with the state-of-the-art task scheduling framework, Taskflow. CGraph, formally known as Color Graph, is a C++ project, but it thoughtfully provides a Python interface. After delving deeper, we discovered that CGraph's design philosophy aligns perfectly with ours: Like LangGraph, CGraph is based on a graph-based declarative API, perfectly supporting the parallelization, low coupling, and data sharing requirements we need.</p>
<p>If the statement "C++ stands at the top of the programming language contempt chain" is a funny joke, it actually reflects programmers' ultimate pursuit of underlying performance. Apart from this "inherent" advantage, the biggest difference between CGraph and LangGraph is its <strong>purity</strong> - it doesn't build a huge ecosystem, but focuses solely on making "task scheduling" as good as possible.</p>
<p>However, what truly made us decide was the project's "heartbeat". We contacted the author, Chunel, and felt the vigorous vitality of CGraph. In the open-source world, <strong>vitality is the future</strong>. A constantly evolving, actively responsive community is far more trustworthy than a frozen, behemoth feature-set.</p>
<p>We believe that an excellent technology selection is not only about matching functionality but also about recognizing the project's future potential. (Welcome to witness its growth together: <a href="https://github.com/ChunelFeng/CGraph" target="_blank" rel="noopener noreferrer" class="">https://github.com/ChunelFeng/CGraph</a>)</p>
<div style="text-align:center">
  <img decoding="async" loading="lazy" src="https://hugegraph.apache.org/blog/images/images-server/agentic-frame.png" alt="image" width="800" class="img_ev3q">
</div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="architectural-design">Architectural Design<a href="https://hugegraph.apache.org/blog/2025/10/29/agentic-graphrag/#architectural-design" class="hash-link" aria-label="Direct link to Architectural Design" title="Direct link to Architectural Design" translate="no">​</a></h2>
<p>Initially, our goal was very simple: to build our own scheduler based on CGraph. However, after deeper reflection, we realized that a good scheduler stems from <strong>a profound understanding of the scheduling target</strong> (time for some self-reflection 🤣). Just like CPU schedulers and GPU schedulers adopt different scheduling strategies due to the differences in their scheduling targets and ecosystem positioning.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="is-the-abstraction-design-reasonable">Is the Abstraction Design Reasonable?<a href="https://hugegraph.apache.org/blog/2025/10/29/agentic-graphrag/#is-the-abstraction-design-reasonable" class="hash-link" aria-label="Direct link to Is the Abstraction Design Reasonable?" title="Direct link to Is the Abstraction Design Reasonable?" translate="no">​</a></h3>
<p>So, we began to examine the abstraction we call Workflow. In the previous design, it was a linked list of Operators. Such a design negated the possibility of parallelism. So, is it reasonable to say that a Workflow is a DAG graph composed of a series of Operators?</p>
<p>Intuitively, this definition is reasonable. However, in practice, we found that it's not a good design for each node in the Workflow (which we'll call a Node from now on) to correspond one-to-one with an Operator. This is because we need to reuse Workflows between different requests (this can save on the inevitable resource creation during Workflow construction and the performance overhead brought about by DAG graph validation).</p>
<p>For example, vector similarity search is a very common RAG process. However, depending on the interfaces exposed by different underlying vector databases, we may need to provide FaissVectorSearch, VectraVectorSearch, and other Operators with the same purpose but different specific implementations. If we equate Operators with Nodes in the Workflow, our chances of reusing Workflows will be greatly reduced because the Workflow for searching using Faiss and the Workflow for searching using Vectra will be different Workflows. But if we encapsulate similar vector index Operators into a VectorSearchNode, will we be able to have more Workflow reuse opportunities? In the specific implementation of VectorSearchNode, we only need to call the corresponding Operator as needed. Adding a layer in between Workflow and Operator has the following three benefits:</p>
<ol>
<li class="">When adding a new Operator, we only need to modify the specific implementation of the corresponding Node, without modifying the logic of the upper-level Workflow. The Operator is responsible for the Node, and the Node is responsible for the Workflow, which achieves a good separation of duties.</li>
<li class="">We have more opportunities for Workflow reuse.</li>
<li class="">By introducing a new Node abstraction, we don't need to modify the implementation of the underlying Operator during the refactoring process, which reduces the mental burden during refactoring.</li>
</ol>
<div style="text-align:center">
  <img decoding="async" loading="lazy" src="https://hugegraph.apache.org/blog/images/images-server/agentic-abstract.png" alt="image" width="800" class="img_ev3q">
</div>
<p>Since we want to reuse the same type of Workflow across requests, we need to ensure that the Workflow itself is stateless. Because if the reused Workflow still carries the state of the previous request, users may get unexpected results. The state of the Workflow can be divided into two types:</p>
<ol>
<li class="">User input state (which we call WorkflowInput): This part is constituted by the user's request.</li>
<li class="">Workflow intermediate state (which we call WorkflowState): This is the temporary data, calculation results, etc., generated by each Node in the Workflow during execution.</li>
</ol>
<p>We need to ensure that both of these states are clean during Workflow execution. However, these two different states are used at different times, which also determines their completely different lifecycles:</p>
<ul>
<li class="">WorkflowInput is constructed and injected <strong>before</strong> Workflow execution, and its mission is completed <strong>after Workflow execution</strong>, and it should be destroyed.</li>
<li class="">WorkflowState must be empty or in an initial (pristine) state <strong>before</strong> Workflow execution, and is dynamically read and written <strong>during</strong> the execution process.</li>
</ul>
<p>We use the <code>GParam</code> (global parameter) abstraction provided by the CGraph framework to achieve fine-grained state isolation:</p>
<ol>
<li class=""><strong>Separate Contexts</strong>: We define two independent <code>GParam</code> contexts for WorkflowInput and WorkflowState.</li>
<li class=""><strong>Inject Lifecycle Hooks</strong>: We encapsulate the execution logic of the workflow to implement the following automated cleanup mechanisms:
<ul>
<li class=""><strong>Pre-execution Hook</strong>: Automatically resets the WorkflowState context, ensuring that each execution starts on a "clean canvas."</li>
<li class=""><strong>Post-execution Hook</strong>: Automatically clears the WorkflowInput context, preventing its data from leaking to the next call.</li>
</ul>
</li>
</ol>
<p>This way we can ensure that each time the Workflow is executed, these two states only contain the state of the current request. Since the WorkflowInput state is reset after Workflow execution, we can only selectively choose some data from the WorkflowState to return to the user. Therefore, we get the interface that a Flow abstraction should implement.</p>
<div style="text-align:center">
  <img decoding="async" loading="lazy" src="https://hugegraph.apache.org/blog/images/images-server/agentic-lifeline.svg" alt="image" width="1000" class="img_ev3q">
</div>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">BaseFlow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">ABC</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">"""</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">    Base class for flows, defines three interface methods: prepare, build_flow, and post_deal.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">    """</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token decorator annotation punctuation" style="color:rgb(199, 146, 234)">@abstractmethod</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">prepare</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> prepared_input</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> WkFlowInput</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">**</span><span class="token plain">kwargs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">"""</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        Initalize the WkFlowInput according to the user request</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        """</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token decorator annotation punctuation" style="color:rgb(199, 146, 234)">@abstractmethod</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">build_flow</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">**</span><span class="token plain">kwargs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"> GPipeline</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">"""</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        Used to construct Workflow objects that can be run on top of CGraph.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        """</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token decorator annotation punctuation" style="color:rgb(199, 146, 234)">@abstractmethod</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">post_deal</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">**</span><span class="token plain">kwargs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">"""</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        Assemble the response to be returned to the user from the WorkflowState</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        """</span><br></div></code></pre></div></div>
<p>Okay, returning to the Node abstraction itself, the Node is an abstraction of a certain functionality, and its underlying implementation may correspond to multiple different abstractions. We need to consider the following questions:</p>
<ol>
<li class="">How to decouple the Node layer and the Operator layer as much as possible.</li>
<li class="">Nodes can be parallel, but there is shared data within the Workflow. How do we solve potential concurrency problem?</li>
</ol>
<p>We know that the input and output of the Operator's run method are dictionaries (see the introduction to the existing Workflow architecture above). To decouple the Node layer and the Operator layer as much as possible, we want the Node layer to also call Operators in the same way. Therefore, we need to implement a JSON serialization method for the WorkflowState. Before calling the Operator, we convert the WorkflowState into a dictionary format and pass it to the Operator. Then, we deserialize the Operator's execution result back into WorkflowState.</p>
<p>To solve the data race problem caused by concurrent access, we can use MVCC (Multi-Version Concurrency Control) to ensure that the Operator operates on multiple different copies. After obtaining the Operator's return result, we synchronize the result to the WorkflowState under the protection of a concurrency-safe lock. Therefore, we can obtain the following Node abstraction:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token keyword" style="font-style:italic">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">BaseNode</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">GNode</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	</span><span class="token operator" style="color:rgb(137, 221, 255)">//</span><span class="token plain"> WorkflowState</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Optional</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">WkFlowState</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">None</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token operator" style="color:rgb(137, 221, 255)">//</span><span class="token plain"> WorkflowInput</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    wk_input</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> Optional</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">WkFlowInput</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">None</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">init</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token operator" style="color:rgb(137, 221, 255)">//</span><span class="token plain"> initalize the WorkflowState </span><span class="token operator" style="color:rgb(137, 221, 255)">&amp;</span><span class="token plain"> WorkflowInput </span><span class="token keyword" style="font-style:italic">from</span><span class="token plain"> pipeline</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> init_context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">node_init</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">"""</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        Overload this method to customize the node initalization logic</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        """</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> CStatus</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">run</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">"""</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        Main logic for node execution, can be overridden by subclasses.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        Returns a CStatus object indicating whether execution succeeded.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        """</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        sts </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">node_init</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> sts</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">isErr</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> sts</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">context </span><span class="token keyword" style="font-style:italic">is</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">None</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> CStatus</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"Context not initialized"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            </span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">	      </span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">lock</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">try</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            data_json </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">to_json</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">finally</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">unlock</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        res </span><span class="token operator" style="color:rgb(137, 221, 255)">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">operator_schedule</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">data_json</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">       </span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">lock</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">try</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            </span><span class="token keyword" style="font-style:italic">if</span><span class="token plain"> res </span><span class="token keyword" style="font-style:italic">is</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">not</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">None</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">and</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">isinstance</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">res</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">dict</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">                self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">assign_from_json</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">res</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            </span><span class="token keyword" style="font-style:italic">elif</span><span class="token plain"> res </span><span class="token keyword" style="font-style:italic">is</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">not</span><span class="token plain"> </span><span class="token boolean" style="color:rgb(255, 88, 116)">None</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">                log</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">warning</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"operator_schedule returned non-dict type: %s"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(130, 170, 255)">type</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">res</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">finally</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">            self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">context</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">unlock</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">return</span><span class="token plain"> CStatus</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token keyword" style="font-style:italic">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">operator_schedule</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> data_json</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token operator" style="color:rgb(137, 221, 255)">&gt;</span><span class="token plain"> Optional</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">Dict</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">"""</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        Decide how to call Operators accroding to user request or WorkflowState</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token triple-quoted-string string" style="color:rgb(195, 232, 141)">        """</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token keyword" style="font-style:italic">raise</span><span class="token plain"> NotImplementedError</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token string" style="color:rgb(195, 232, 141)">"Subclasses must implement operator_schedule"</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div>
<p>Okay, we have now completed the abstract design of the scheduling object, Workflow.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="scheduler-design">Scheduler Design<a href="https://hugegraph.apache.org/blog/2025/10/29/agentic-graphrag/#scheduler-design" class="hash-link" aria-label="Direct link to Scheduler Design" title="Direct link to Scheduler Design" translate="no">​</a></h3>
<p>In the new scheduler system, the instantiation and destruction of Workflow objects are non-negligible resource overheads. To minimize latency and reduce memory churn, we introduced a Workflow Pool mechanism to achieve efficient reuse of Workflow instances.
We fully leverage the Pool abstraction provided by the underlying CGraph framework and apply it to the lifecycle management of Workflows. Its core mechanism is as follows:</p>
<ul>
<li class=""><strong>Categorized Pooling</strong>: The system maintains a dedicated and independent Workflow Pool for <strong>each type</strong> of Workflow. This ensures that requests are only distributed to Workflow instances with identical structures.</li>
<li class=""><strong>On-Demand Acquisition and Dynamic Expansion</strong>: When a new request arrives, the scheduler's execution logic follows the following strategy:
<ol>
<li class=""><strong>Query (Pool Hit)</strong>: First, the scheduler attempts to obtain an idle Workflow instance from the corresponding Workflow Pool. If successful, it immediately uses the instance to process the request, achieving zero-overhead reuse.</li>
<li class=""><strong>Creation (Pool Miss)</strong>: If there are no available instances in the pool, the scheduler dynamically creates a new Workflow. This new instance is immediately used to serve the current request. This strategy ensures that the system maintains good elasticity under high load.</li>
</ol>
</li>
<li class=""><strong>Automatic Return</strong>: Whether it is an instance obtained from the pool or a newly created instance, after completing the request processing, it will be <strong>automatically returned</strong> to its Workflow Pool, waiting for the next schedule.</li>
</ul>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">🤔 The current version of the Scheduler implements its core responsibility, providing a stable and efficient scheduling base for the entire system. Its main features include:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    1. Ability to accurately schedule corresponding Workflow instances for processing based on request type.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    2. Built-in pooling mechanism based on Workflow type, which significantly reduces the cost of object creation and destruction in high-concurrency scenarios by reusing existing instances.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    However, there are many areas where the Scheduler deserves optimization in the future, such as:</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    1. Workload-aware resource isolation: Not all Workflows consume resources equally. We will leverage the thread pool binding feature provided by CGraph to allocate dedicated computing resources to different types of Workflow Pools.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    2. Production-grade capacity management and stability: Introduce configurable capacity limits for each Workflow Pool. In a production environment, unlimited resource pools are a potential risk. By setting a limit on the pool size, we can prevent the system from exhausting memory under extreme load, ensure the stability of the service.</span><br></div></code></pre></div></div>
<p>Now we can get the overall architecture diagram of the entire project.</p>
<div style="text-align:center">
  <img decoding="async" loading="lazy" src="https://hugegraph.apache.org/blog/images/images-server/agentic-scheduler.png" alt="image" width="600" class="img_ev3q">
</div>
<ol>
<li class="">After receiving a request, the Scheduler first queries the PipelinePool to check if there is a idle Pipeline of the corresponding type.
<ol>
<li class="">When a user request arrives, the Http Router delegates the task to the core Scheduler based on the request type, requesting a Pipeline instance capable of handling that type of task.
<ul>
<li class="">If there is a idle Pipeline in the PipelinePool, the Scheduler directly returns that Pipeline.</li>
<li class="">If there is no idle Pipeline in the PipelinePool, it calls the corresponding type of WorkflowBuilder to construct a Pipeline of that type and returns it.</li>
</ul>
</li>
</ol>
</li>
<li class="">Whether the Pipeline is obtained from the pool or newly created, it immediately executes request processing and returns the Response to the user. After processing is complete, the Pipeline instance is <strong>not destroyed</strong>. Instead, it is <strong>automatically released</strong> and returned to the PipelinePool, and waits to be scheduled again after resetting its state.</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="agentic-graphrag-the-collision-of-ideal-and-reality">Agentic GraphRAG: The Collision of Ideal and Reality<a href="https://hugegraph.apache.org/blog/2025/10/29/agentic-graphrag/#agentic-graphrag-the-collision-of-ideal-and-reality" class="hash-link" aria-label="Direct link to Agentic GraphRAG: The Collision of Ideal and Reality" title="Direct link to Agentic GraphRAG: The Collision of Ideal and Reality" translate="no">​</a></h3>
<p>At the beginning of the project, we envisioned a fully "Agentic" GraphRAG. You would simply tell it your problem, and a powerful LLM, like a seasoned architect, would tailor the most efficient execution process (Workflow) for you from a collection of tools (Nodes/Operators).</p>
<p>However, there is always a gap between ideal and reality. We conducted in-depth research into similar projects such as chat2graph and verified the results through hands-on testing. The results showed that letting LLMs "create" a perfect and flawless execution plan out of thin air is much more difficult than we imagined. Even when using models like Gemini 2.5 Flash, it often struggles to understand complex instructions and accurately map them to a series of operations. On one hand, because the call chain of chat2graph can be very long, even if the single-step inference accuracy of large language models reaches as high as 95%, errors will accumulate progressively as the call chain extends, causing the overall task success rate to drop sharply. On the other hand, even without the call chain issue, the accuracy of having models automatically plan through prompting is still unsatisfactory at present. The era of relying entirely on large models for zero-shot workflow planning may not have fully arrived yet.</p>
<p>"Rome wasn't built in a day." So, we made a crucial decision: letting a large model build a workflow from scratch is challenging, but allowing a large model to "instantiate" a specific Workflow based on a Workflow template might be a feasible solution. We built a powerful, highly modular GraphRAG workflow, and the LLM's task is to select the optimal configuration for the Workflow based on the characteristics of the audience's user requests. This is the balance we found between Agentic GraphRAG and GraphRAG.</p>
<p>This shifts our core problem from "how to build from scratch" to:</p>
<blockquote>
<p>How can we make the large model understand the optimal configuration of GraphRAG from a few words from the user?</p>
</blockquote>
<p>For a concrete example:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">👉🏼 Given a user request, how do we infer the optimal configuration from the user's request?</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    Specific example: The user's request is: Tell me the ontological views of the disciple of the philosopher who proposed "water is the origin of all things." So, what graph algorithm should be used for knowledge graph retrieval to make the results more accurate?</span><br></div></code></pre></div></div>
<p>In summary, the LLM needs to stand on the two great mountains of natural language processing and graph databases to truly see the whole picture, but it is currently still at the foot of the mountain🤣. And this is the next high mountain we urgently need to cross.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="reflection">Reflection<a href="https://hugegraph.apache.org/blog/2025/10/29/agentic-graphrag/#reflection" class="hash-link" aria-label="Direct link to Reflection" title="Direct link to Reflection" translate="no">​</a></h2>
<p>In this project, we used CGraph as the underlying graph scheduling framework. Its Graph API-based design successfully decoupled the definition of the Workflow from the specific implementation of each Node, giving the system good scalability.</p>
<p>However, we also noticed that this declarative API, while bringing flexibility, also introduces new programming complexity. As we use more and more of CGraph's advanced features such as Condition and Region, the readability and maintainability of the code used to build Workflows begin to face challenges. This raises a core question for us: <strong>Is there a more intuitive and user-friendly interface that can both maintain the flexibility of the framework and reduce the cognitive burden when defining complex processes?</strong></p>
<p>For a concrete example: when we need to define a main Workflow and a sub-Workflow as a subset of it, the current implementation tends to encapsulate the sub-Workflow as a GRegion and use Condition nodes to control its execution. This "merged" definition method is functionally feasible, but it undoubtedly increases the internal complexity and difficulty of understanding the Workflow. We envision that if the CGraph framework could natively provide <strong>Subgraph Composition</strong> capabilities, allowing developers to explicitly declare one Workflow as part of another Workflow, it might fundamentally simplify the implementation of such scenarios.</p>
<p>Despite the above challenges, the CGraph framework still played an important role in the project, significantly improving our engineering efficiency:</p>
<ol>
<li class=""><strong>Simplified Performance Diagnosis</strong>: The framework's built-in Perf tool makes performance bottleneck localization easier, even if most of the time is ultimately focused on LLM calls, the tool still provides us with a clear performance view.</li>
<li class=""><strong>Scheduling Logic Sink</strong>: The underlying Pooling abstraction mechanism enables us to seamlessly sink some scheduling logic to the C++ side, while the upper-layer business code does not need to care about its specific implementation.</li>
</ol>
<p>Finally, I want to say that technical exploration is important, but the most valuable asset in this journey is the experience of working with excellent colleagues and the growth and insights gained from it. This is the real motivation that drives us forward.</p>
<h1>Conclusion</h1>
<p>In the reconstruction and innovation process of HugeGraph-AI, the introduction of AI tools has greatly improved development efficiency, but the final decisions and trade-offs still require rigorous thinking. Talk is not cheap, thinking is necessary. Whenever we encounter new technical problems, we can always propose multiple solutions, and the real test lies in how to weigh them (trade-off). The technical world is not black and white. Different architectural choices and program trade-offs often correspond to different target users and application scenarios. Our choice of CGraph is the best practice of this philosophy. It is not the first graph scheduling framework in the industry, but in the consideration of performance, flexibility and development costs, it provides us with the most balanced point that meets our current needs - on this road full of trade-offs, it is closest to us.</p>
<p>This also makes us more convinced that a product or technology is ultimately chosen, often not only because of the advanced nature of its philosophy, but also because it can provide the most pragmatic solution to a specific problem under complex real-world constraints.</p>
<p>The project has come to an end for now, and I sincerely thank every partner who fought alongside me! This experience is wonderful because of you.</p>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[ToplingDB Quick Start]]></title>
        <id>https://hugegraph.apache.org/blog/2025/10/09/toplingdb-quick-start/</id>
        <link href="https://hugegraph.apache.org/blog/2025/10/09/toplingdb-quick-start/"/>
        <updated>2025-10-09T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[ToplingDB is a configurable and observable extension of RocksDB. It supports dynamic tuning via YAML files and enables real-time monitoring through a built-in Web Server.]]></summary>
        <content type="html"><![CDATA[<blockquote>
<p><a href="https://github.com/topling/toplingdb" target="_blank" rel="noopener noreferrer" class="">ToplingDB</a> is a configurable and observable extension of RocksDB. It supports dynamic tuning via YAML files and enables real-time monitoring through a built-in Web Server.</p>
</blockquote>
<p>Update hugegraph.properties</p>
<div class="language-properties codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-properties codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">backend=rocksdb</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">serializer=binary</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">rocksdb.data_path=.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">rocksdb.wal_path=.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Path to YAML configuration file</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">#  For security reasons, HG only allows YAML files to be located under the `conf/graphs` directory</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">rocksdb.option_path=./conf/graphs/rocksdb_plus.yaml</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Enable Web Server</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">rocksdb.open_http=true</span><br></div></code></pre></div></div>
<p>Initialize the database (required on the first startup, or a new configuration was manually added under 'conf/graphs/')</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token builtin class-name" style="color:rgb(255, 203, 107)">cd</span><span class="token plain"> *hugegraph-</span><span class="token variable" style="color:rgb(191, 199, 213)">${version}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">bin/init-store.sh</span><br></div></code></pre></div></div>
<p>Start server</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain">bin/start-hugegraph.sh</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Starting HugeGraphServer</span><span class="token punctuation" style="color:rgb(199, 146, 234)">..</span><span class="token plain">.</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">Connecting to HugeGraphServer </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token plain">http://127.0.0.1:8080/graphs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token punctuation" style="color:rgb(199, 146, 234)">..</span><span class="token punctuation" style="color:rgb(199, 146, 234)">..</span><span class="token plain">OK</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="verify-toplingdb-is-working-properly">Verify ToplingDB Is Working Properly<a href="https://hugegraph.apache.org/blog/2025/10/09/toplingdb-quick-start/#verify-toplingdb-is-working-properly" class="hash-link" aria-label="Direct link to Verify ToplingDB Is Working Properly" title="Direct link to Verify ToplingDB Is Working Properly" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="prerequisite-ensure-core-parameters-are-correctly-configured">Prerequisite: Ensure Core Parameters Are Correctly Configured<a href="https://hugegraph.apache.org/blog/2025/10/09/toplingdb-quick-start/#prerequisite-ensure-core-parameters-are-correctly-configured" class="hash-link" aria-label="Direct link to Prerequisite: Ensure Core Parameters Are Correctly Configured" title="Direct link to Prerequisite: Ensure Core Parameters Are Correctly Configured" translate="no">​</a></h3>
<p>Check that <code>hugegraph.properties</code> includes:</p>
<div class="language-properties codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-properties codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Configuration file path</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">rocksdb.option_path=./conf/graphs/rocksdb_plus.yaml</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"># Enable Web Server</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">rocksdb.open_http=true</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-1-access-the-web-monitoring-interface">Method 1: Access the Web Monitoring Interface<a href="https://hugegraph.apache.org/blog/2025/10/09/toplingdb-quick-start/#method-1-access-the-web-monitoring-interface" class="hash-link" aria-label="Direct link to Method 1: Access the Web Monitoring Interface" title="Direct link to Method 1: Access the Web Monitoring Interface" translate="no">​</a></h3>
<p>Visualize the Web monitoring page. Example screenshot:</p>
<div style="text-align:center">
  <img decoding="async" loading="lazy" src="https://hugegraph.apache.org/blog/images/images-server/toplingdb-web-server.png" alt="image" width="400" class="img_ev3q">
</div>
<p>Verify via terminal:</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Access http://localhost:2011 (port depends on listening_ports in YAML config)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token function" style="color:rgb(130, 170, 255)">curl</span><span class="token plain"> http://localhost:2011 </span><span class="token operator" style="color:rgb(137, 221, 255)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">grep</span><span class="token plain"> topling</span><br></div></code></pre></div></div>
<p>The following output indicates the page is working:</p>
<div class="language-html codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-html codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;</span><span class="token tag" style="color:rgb(255, 85, 114)">p</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;</span><span class="token tag" style="color:rgb(255, 85, 114)">a</span><span class="token tag" style="color:rgb(255, 85, 114)"> </span><span class="token tag attr-name" style="color:rgb(255, 203, 107)">href</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(199, 146, 234)">=</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">"</span><span class="token tag attr-value" style="color:rgb(255, 85, 114)">https://topling.cn</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">"</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain">Topling Inc.</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;/</span><span class="token tag" style="color:rgb(255, 85, 114)">a</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain">This is </span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;</span><span class="token tag" style="color:rgb(255, 85, 114)">strong</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain">Engine Inspector</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;/</span><span class="token tag" style="color:rgb(255, 85, 114)">strong</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain">, for metrics, see </span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;</span><span class="token tag" style="color:rgb(255, 85, 114)">a</span><span class="token tag" style="color:rgb(255, 85, 114)"> </span><span class="token tag attr-name" style="color:rgb(255, 203, 107)">href</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(199, 146, 234)">=</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">'</span><span class="token tag attr-value" style="color:rgb(255, 85, 114)">javascript:grafana()</span><span class="token tag attr-value punctuation" style="color:rgb(199, 146, 234)">'</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain">Grafana</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;/</span><span class="token tag" style="color:rgb(255, 85, 114)">a</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><span class="token plain">!</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&lt;/</span><span class="token tag" style="color:rgb(255, 85, 114)">p</span><span class="token tag punctuation" style="color:rgb(199, 146, 234)">&gt;</span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="method-2-check-toplingdb-initialization-info-in-logs">Method 2: Check ToplingDB Initialization Info in Logs<a href="https://hugegraph.apache.org/blog/2025/10/09/toplingdb-quick-start/#method-2-check-toplingdb-initialization-info-in-logs" class="hash-link" aria-label="Direct link to Method 2: Check ToplingDB Initialization Info in Logs" title="Direct link to Method 2: Check ToplingDB Initialization Info in Logs" translate="no">​</a></h3>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token function" style="color:rgb(130, 170, 255)">tail</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-f</span><span class="token plain"> logs/hugegraph-server.log </span><span class="token operator" style="color:rgb(137, 221, 255)">|</span><span class="token plain"> </span><span class="token function" style="color:rgb(130, 170, 255)">grep</span><span class="token plain"> </span><span class="token parameter variable" style="color:rgb(191, 199, 213)">-i</span><span class="token plain"> topling</span><br></div></code></pre></div></div>
<p>Similar output indicates ToplingDB is the storage engine:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token number" style="color:rgb(247, 140, 108)">2025</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">14</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">08</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">56</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">25</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">db</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token keyword" style="font-style:italic">open</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token constant" style="color:rgb(130, 170, 255)">INFO</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">o</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">a</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">h</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">b</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">s</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">r</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)">RocksDBStdSessions</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">SidePluginRepo</span><span class="token plain"> </span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">found</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)"> Will</span><span class="token plain"> attempt </span><span class="token keyword" style="font-style:italic">to</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">open</span><span class="token plain"> </span><span class="token namespace" style="color:rgb(178, 204, 214)">multi</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">CFs</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">RocksDB</span><span class="token plain"> using </span><span class="token class-name" style="color:rgb(255, 203, 107)">Topling</span><span class="token plain"> plugin</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token number" style="color:rgb(247, 140, 108)">2025</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">14</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">08</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">56</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">25</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">db</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token keyword" style="font-style:italic">open</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token constant" style="color:rgb(130, 170, 255)">INFO</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">o</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">a</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">h</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">b</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">s</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">r</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)">RocksDBStdSessions</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">Topling</span><span class="token plain"> </span><span class="token constant" style="color:rgb(130, 170, 255)">HTTP</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">Server</span><span class="token plain"> has been started according </span><span class="token keyword" style="font-style:italic">to</span><span class="token plain"> </span><span class="token namespace" style="color:rgb(178, 204, 214)">the</span><span class="token plain"> listening_ports specified in </span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">/conf</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">graphs</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">rocksdb_plus</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">yaml</span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="common-troubleshooting">Common Troubleshooting<a href="https://hugegraph.apache.org/blog/2025/10/09/toplingdb-quick-start/#common-troubleshooting" class="hash-link" aria-label="Direct link to Common Troubleshooting" title="Direct link to Common Troubleshooting" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="issue-1-startup-failure-due-to-yaml-format-error">Issue 1: Startup Failure Due to YAML Format Error<a href="https://hugegraph.apache.org/blog/2025/10/09/toplingdb-quick-start/#issue-1-startup-failure-due-to-yaml-format-error" class="hash-link" aria-label="Direct link to Issue 1: Startup Failure Due to YAML Format Error" title="Direct link to Issue 1: Startup Failure Due to YAML Format Error" translate="no">​</a></h3>
<p>Sample log during startup:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token number" style="color:rgb(247, 140, 108)">2025</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">15</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">01</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">55</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">50</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">db</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token keyword" style="font-style:italic">open</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token constant" style="color:rgb(130, 170, 255)">INFO</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">o</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">a</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">h</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">b</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">s</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">r</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)">RocksDBStdSessions</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">SidePluginRepo</span><span class="token plain"> </span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">found</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)"> Will</span><span class="token plain"> attempt </span><span class="token keyword" style="font-style:italic">to</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">open</span><span class="token plain"> </span><span class="token namespace" style="color:rgb(178, 204, 214)">multi</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">CFs</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">RocksDB</span><span class="token plain"> using </span><span class="token class-name" style="color:rgb(255, 203, 107)">Topling</span><span class="token plain"> plugin</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token number" style="color:rgb(247, 140, 108)">21</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token number" style="color:rgb(247, 140, 108)">891</span><span class="token plain">B</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token constant" style="color:rgb(130, 170, 255)">ERROR</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">sideplugin</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">rockside</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token number" style="color:rgb(247, 140, 108)">3</span><span class="token plain">rdparty</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">rapidyaml</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">src</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">c4</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">yml</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">parse</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">cpp</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">3310</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token constant" style="color:rgb(130, 170, 255)">ERROR</span><span class="token plain"> parsing yml</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> parse error</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> incorrect indentation</span><span class="token operator" style="color:rgb(137, 221, 255)">?</span><br></div></code></pre></div></div>
<p><strong>Solutions</strong>:</p>
<ol>
<li class="">Check YAML indentation (must use spaces, not tabs)</li>
<li class="">Validate YAML syntax: <code>python -c "import yaml; yaml.safe_load(open('conf/graphs/rocksdb_plus.yaml'))"</code></li>
<li class="">Review specific error messages in logs</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="issue-2-web-server-port-conflict">Issue 2: Web Server Port Conflict<a href="https://hugegraph.apache.org/blog/2025/10/09/toplingdb-quick-start/#issue-2-web-server-port-conflict" class="hash-link" aria-label="Direct link to Issue 2: Web Server Port Conflict" title="Direct link to Issue 2: Web Server Port Conflict" translate="no">​</a></h3>
<p>Sample log during startup:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token number" style="color:rgb(247, 140, 108)">2025</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">15</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">01</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">57</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">34</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">db</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token keyword" style="font-style:italic">open</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token constant" style="color:rgb(130, 170, 255)">INFO</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">o</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">a</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">h</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">b</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">s</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">r</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)">RocksDBStdSessions</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">SidePluginRepo</span><span class="token plain"> </span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">found</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)"> Will</span><span class="token plain"> attempt </span><span class="token keyword" style="font-style:italic">to</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">open</span><span class="token plain"> </span><span class="token namespace" style="color:rgb(178, 204, 214)">multi</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">CFs</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">RocksDB</span><span class="token plain"> using </span><span class="token class-name" style="color:rgb(255, 203, 107)">Topling</span><span class="token plain"> plugin</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token number" style="color:rgb(247, 140, 108)">2025</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">15</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">01</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">57</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">34</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">db</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token keyword" style="font-style:italic">open</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token constant" style="color:rgb(130, 170, 255)">ERROR</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">o</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">a</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">h</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">b</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">s</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">r</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)">RocksDBStore</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">Failed</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">to</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">open</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">RocksDB</span><span class="token plain"> 'rocksdb</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token plain">data</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">data</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">g'</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">org</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">rocksdb</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)">RocksDBException</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> rocksdb</span><span class="token operator" style="color:rgb(137, 221, 255)">::</span><span class="token class-name" style="color:rgb(255, 203, 107)">Status</span><span class="token plain"> rocksdb</span><span class="token operator" style="color:rgb(137, 221, 255)">::</span><span class="token class-name" style="color:rgb(255, 203, 107)">SidePluginRepo</span><span class="token operator" style="color:rgb(137, 221, 255)">::</span><span class="token class-name" style="color:rgb(255, 203, 107)">StartHttpServer</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token keyword" style="font-style:italic">null</span><span class="token plain"> context when constructing </span><span class="token class-name" style="color:rgb(255, 203, 107)">CivetServer</span><span class="token class-name punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)"> Possible</span><span class="token plain"> problem binding </span><span class="token keyword" style="font-style:italic">to</span><span class="token plain"> </span><span class="token namespace" style="color:rgb(178, 204, 214)">port</span><span class="token namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    at </span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">org</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">rocksdb</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)">SidePluginRepo</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">startHttpServer</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token class-name" style="color:rgb(255, 203, 107)">Native</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">Method</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(137, 221, 255)">~</span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain">rocksdbjni</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">8.10</span><span class="token number" style="color:rgb(247, 140, 108)">.2</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">20250804.074027</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token number" style="color:rgb(247, 140, 108)">4.</span><span class="token plain">jar</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token operator" style="color:rgb(137, 221, 255)">?</span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><br></div></code></pre></div></div>
<p><strong>Solutions</strong>:</p>
<ol>
<li class="">Check if the port is occupied: <code>lsof -i :2011</code></li>
<li class="">Modify <code>listening_ports</code> in the YAML file</li>
<li class="">Restart HugeGraph Server</li>
</ol>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="issue-3-database-initialization-failure">Issue 3: Database Initialization Failure<a href="https://hugegraph.apache.org/blog/2025/10/09/toplingdb-quick-start/#issue-3-database-initialization-failure" class="hash-link" aria-label="Direct link to Issue 3: Database Initialization Failure" title="Direct link to Issue 3: Database Initialization Failure" translate="no">​</a></h3>
<p>Sample output indicating lock acquisition failure, possibly due to write permission issues or another process locking the DB:</p>
<div class="language-java codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-java codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token class-name" style="color:rgb(255, 203, 107)">Caused</span><span class="token plain"> by</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">org</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">rocksdb</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)">RocksDBException</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">While</span><span class="token plain"> lock file</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> rocksdb</span><span class="token operator" style="color:rgb(137, 221, 255)">-</span><span class="token plain">data</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">data</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token plain">m</span><span class="token operator" style="color:rgb(137, 221, 255)">/</span><span class="token constant" style="color:rgb(130, 170, 255)">LOCK</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">Resource</span><span class="token plain"> temporarily unavailable</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        at </span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">org</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">rocksdb</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)">SidePluginRepo</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">nativeOpenDBMultiCF</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token class-name" style="color:rgb(255, 203, 107)">Native</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(255, 203, 107)">Method</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        at </span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">org</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name namespace" style="color:rgb(178, 204, 214)">rocksdb</span><span class="token class-name namespace punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token class-name" style="color:rgb(255, 203, 107)">SidePluginRepo</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token function" style="color:rgb(130, 170, 255)">openDB</span><span class="token punctuation" style="color:rgb(199, 146, 234)">(</span><span class="token class-name" style="color:rgb(255, 203, 107)">SidePluginRepo</span><span class="token punctuation" style="color:rgb(199, 146, 234)">.</span><span class="token plain">java</span><span class="token operator" style="color:rgb(137, 221, 255)">:</span><span class="token number" style="color:rgb(247, 140, 108)">22</span><span class="token punctuation" style="color:rgb(199, 146, 234)">)</span><br></div></code></pre></div></div>
<p><strong>Solutions</strong>:</p>
<ol>
<li class="">Confirm correct config path: <code>rocksdb.option_path=./conf/graphs/rocksdb_plus.yaml</code></li>
<li class="">Check data directory permissions: ensure read/write access for the running user</li>
<li class="">Review detailed logs: <code>bin/init-store.sh 2&gt;&amp;1 | tee init.log</code></li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="related-documentation">Related Documentation<a href="https://hugegraph.apache.org/blog/2025/10/09/toplingdb-quick-start/#related-documentation" class="hash-link" aria-label="Direct link to Related Documentation" title="Direct link to Related Documentation" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://hugegraph.apache.org/blog/2025/09/30/toplingdb-yaml-configuration-file/">ToplingDB YAML Configuration Explained</a> – Understand each parameter in the config file</li>
<li class=""><a class="" href="https://hugegraph.apache.org/docs/config/config-option/">HugeGraph Configuration Guide</a> – Reference for core HugeGraph settings</li>
<li class=""><a href="https://github.com/topling/toplingdb" target="_blank" rel="noopener noreferrer" class="">ToplingDB GitHub Repository</a> – Official docs and latest updates</li>
</ul>]]></content>
    </entry>
    <entry>
        <title type="html"><![CDATA[ToplingDB YAML configuration file]]></title>
        <id>https://hugegraph.apache.org/blog/2025/09/30/toplingdb-yaml-configuration-file/</id>
        <link href="https://hugegraph.apache.org/blog/2025/09/30/toplingdb-yaml-configuration-file/"/>
        <updated>2025-09-30T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[RocksDB provides a rich set of configuration parameters, but most of them typically require hardcoded setup.]]></summary>
        <content type="html"><![CDATA[<p>RocksDB provides a rich set of configuration parameters, but most of them typically require hardcoded setup.</p>
<p><a href="https://github.com/topling/toplingdb" target="_blank" rel="noopener noreferrer" class="">ToplingDB</a> introduces a <strong>SidePlugin + YAML</strong> mechanism, making configuration more modular and composable.</p>
<p>This document focuses on the <strong>extended parameters of ToplingDB</strong>, helping readers understand their purpose and usage.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="0-rocksdb_plusyaml-used-in-hugegraph">0. rocksdb_plus.yaml used in HugeGraph<a href="https://hugegraph.apache.org/blog/2025/09/30/toplingdb-yaml-configuration-file/#0-rocksdb_plusyaml-used-in-hugegraph" class="hash-link" aria-label="Direct link to 0. rocksdb_plus.yaml used in HugeGraph" title="Direct link to 0. rocksdb_plus.yaml used in HugeGraph" translate="no">​</a></h2>
<p>The following includes only the configuration parameters used in HugeGraph. For the full configuration supported by ToplingDB, refer to the <a href="https://github.com/topling/sideplugin-wiki-en/wiki" target="_blank" rel="noopener noreferrer" class="">SidePlugin Wiki</a>:</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#bfc7d5;--prism-background-color:#292d3e"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#bfc7d5;background-color:#292d3e"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#bfc7d5"><span class="token key atrule">http</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Web Server related configuration</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># normally parent path of db path</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">document_root</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> /dev/shm/rocksdb_resource </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Static resource directory, extracted by `preload_topling.sh` in HugeGraph</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">listening_ports</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">'127.0.0.1:2011'</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Web Server listening port for management/monitoring</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">setenv</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Environment variable settings</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">StrSimpleEnvNameNotOverwrite</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> StringValue</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">IntSimpleEnvNameNotOverwrite</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">16384</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">OverwriteThisEnv</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">#comment: overwrite is default to false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">overwrite</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">value</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> force overwrite this env by overwrite true</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">Cache</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Cache configuration</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">lru_cache</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Define an LRU cache instance</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">class</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> LRUCache</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">params</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">capacity</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 8G </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Cache capacity: 8GB</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">num_shard_bits</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">-1</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Number of shards, -1 means auto</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">strict_capacity_limit</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">high_pri_pool_ratio</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0.5</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">use_adaptive_mutex</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">metadata_charge_policy</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> kFullChargeCacheMetadata </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Metadata also counts toward cache capacity</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">Statistics</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Sampling configuration</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">stat</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">class</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> default</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">params</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">discard_tickers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Discarded tickers to reduce overhead</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.block.cache</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.block.cachecompressed</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.block</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.memtable.payload.bytes.at.flush</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.memtable.garbage.bytes.at.flush</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.txn</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.blobdb</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.row.cache</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.number.block</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.bloom.filter</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.persistent</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.sim.block.cache</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">discard_histograms</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Discarded histogram metrics</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># comment: ....</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.blobdb</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.bytes.compressed</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.bytes.decompressed</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.num.index.and.filter.blocks.read.per.level</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.num.data.blocks.read.per.level</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.compression.times.nanos</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.decompression.times.nanos</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.read.block.get.micros</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> rocksdb.write.raw.block.micros</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># comment end of array</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic">#stats_level: kAll</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">stats_level</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> kDisableAll  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Disable all statistics</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">MemTableRepFactory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># MemTable implementation in memory</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">cspp</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># ToplingDB-specific high-concurrency memory structure</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">class</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> cspp</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">params</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">mem_cap</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 16G </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Preallocate sufficient virtual memory space; may reserve address space without actual allocation</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">use_vm</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">token_use_idle</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">chunk_size</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 16K </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Internal allocation granularity</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">convert_to_sst</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> kFileMmap </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Convert MemTable directly to SST, skipping flush; options: {kDontConvert, kDumpMem, kFileMmap}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">sync_sst_file</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">false</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Whether to fsync after SST conversion when using kFileMmap</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">skiplist</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Default skiplist structure in RocksDB</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">class</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> SkipList</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">params</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">lookahead</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">TableFactory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">cspp_memtab_sst</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">class</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> CSPPMemTabTable </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># TableFactory paired with cspp</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">params</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># empty params</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">bb</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">class</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> BlockBasedTable </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Default block-based table in RocksDB</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">params</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">checksum</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> kCRC32c</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">block_size</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 4K</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">block_restart_interval</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">16</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">index_block_restart_interval</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">metadata_block_size</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 4K</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">enable_index_compression</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">block_cache</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"${lru_cache}"</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Use the LRU cache defined above</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">block_cache_compressed</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">persistent_cache</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">filter_policy</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">dispatch</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">class</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> DispatcherTable</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">params</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">default</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> bb </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Default to BlockBasedTable</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">readers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">BlockBasedTable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> bb</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">        </span><span class="token key atrule">CSPPMemTabTable</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> cspp_memtab_sst</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token key atrule">level_writers</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(199, 146, 234)">[</span><span class="token plain"> bb</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> bb</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> bb</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> bb</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> bb</span><span class="token punctuation" style="color:rgb(199, 146, 234)">,</span><span class="token plain"> bb </span><span class="token punctuation" style="color:rgb(199, 146, 234)">]</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Custom write strategy per level</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">CFOptions</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">default</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">max_write_buffer_number</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">6</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">memtable_factory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"${cspp}"</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Reference cspp defined above</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">write_buffer_size</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 128M</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># set target_file_size_base as small as 512K is to make many SST files,</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># thus key prefix cache can present efficiency</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">target_file_size_base</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 64M</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">target_file_size_multiplier</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">table_factory</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> dispatch </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Reference dispatch defined above</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">max_bytes_for_level_base</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 512M</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">max_bytes_for_level_multiplier</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">10</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">level_compaction_dynamic_level_bytes</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">level0_slowdown_writes_trigger</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">20</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">level0_stop_writes_trigger</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">36</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">level0_file_num_compaction_trigger</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">merge_operator</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> uint64add </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># support merge</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">level_compaction_dynamic_file_size</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">optimize_filters_for_hits</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">allow_merge_memtables</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">min_write_buffer_number_to_merge</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">compression_per_level</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> kNoCompression</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> kNoCompression</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> kSnappyCompression</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> kSnappyCompression</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> kSnappyCompression</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> kSnappyCompression</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(199, 146, 234)">-</span><span class="token plain"> kSnappyCompression</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain"></span><span class="token key atrule">DBOptions</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">  </span><span class="token key atrule">dbo</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">create_if_missing</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">create_missing_column_families</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">false</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># this is important, must be false to hugegraph</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">max_background_compactions</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">-1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">max_subcompactions</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">4</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">max_level1_subcompactions</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">inplace_update_support</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">false</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">WAL_size_limit_MB</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">statistics</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(195, 232, 141)">"${stat}"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Use the statistics config defined above</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">max_manifest_file_size</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> 100M</span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">max_background_jobs</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">8</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">compaction_readahead_size</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(247, 140, 108)">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#bfc7d5"><span class="token plain">    </span><span class="token key atrule">memtable_as_log_index</span><span class="token punctuation" style="color:rgb(199, 146, 234)">:</span><span class="token plain"> </span><span class="token boolean important" style="color:rgb(255, 88, 116)">true</span><span class="token plain"> </span><span class="token comment" style="color:rgb(105, 112, 152);font-style:italic"># Combined with convert_to_sst: kFileMmap to enable [omit L0 Flush](https://github.com/topling/toplingdb/wiki/Omit-L0-Flush)</span><br></div></code></pre></div></div>
<p><strong>Key points</strong>:</p>
<ul>
<li class=""><code>listening_ports: '127.0.0.1:2011'</code> sets the Web Server listening port to 2011 and restricts access to localhost.</li>
<li class=""><code>memtable_as_log_index: true</code> combined with <code>convert_to_sst: kFileMmap</code> enables <a href="https://github.com/topling/toplingdb/wiki/Omit-L0-Flush" target="_blank" rel="noopener noreferrer" class="">omit L0 Flush</a>.</li>
<li class=""><code>memtable_factory: "${cspp}"</code> specifies the memory structure as <code>CSPP Memtable</code>.</li>
<li class=""><code>table_factory: dispatch</code> sets the TableFactory to the custom <code>DispatcherTable</code> defined in YAML.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="1-plugin-based-configuration-and-reference-mechanism">1. Plugin-based configuration and reference mechanism<a href="https://hugegraph.apache.org/blog/2025/09/30/toplingdb-yaml-configuration-file/#1-plugin-based-configuration-and-reference-mechanism" class="hash-link" aria-label="Direct link to 1. Plugin-based configuration and reference mechanism" title="Direct link to 1. Plugin-based configuration and reference mechanism" translate="no">​</a></h2>
<ul>
<li class=""><strong>YAML modularization</strong>: The configuration file is organized as objects; each object can be defined independently and referenced elsewhere.</li>
<li class=""><strong>Reference syntax</strong>: Objects can be reused across sections via <code>${lru_cache}</code>, <code>${cspp}</code>, etc.</li>
<li class=""><strong>DispatcherTable</strong>: Allows selecting different TableFactories at different levels or scenarios. RocksDB natively supports only a single TableFactory.</li>
</ul>
<p>ToplingDB YAML Reference and Reuse Diagram:</p>
<div style="text-align:center">
  <img decoding="async" loading="lazy" src="https://hugegraph.apache.org/blog/images/images-server/toplingdb-yaml-ref.png" alt="ToplingDB YAML Reference Diagram" width="800" class="img_ev3q">
</div>
<p>This mechanism makes configuration more flexible and easier to compose in complex scenarios.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="2-new-memtable-implementation-cspp">2. New MemTable implementation: CSPP<a href="https://hugegraph.apache.org/blog/2025/09/30/toplingdb-yaml-configuration-file/#2-new-memtable-implementation-cspp" class="hash-link" aria-label="Direct link to 2. New MemTable implementation: CSPP" title="Direct link to 2. New MemTable implementation: CSPP" translate="no">​</a></h2>
<p>ToplingDB provides a MemTable type that RocksDB does not natively have, configured with the following parameters:</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="mem_cap">mem_cap<a href="https://hugegraph.apache.org/blog/2025/09/30/toplingdb-yaml-configuration-file/#mem_cap" class="hash-link" aria-label="Direct link to mem_cap" title="Direct link to mem_cap" translate="no">​</a></h3>
<p><code>mem_cap</code> is the size of the virtual address space reserved for CSPP. This may be just reserved address space without actual physical allocation.
The actual memory usage of <code>mem_cap</code> is approximately equal to <code>write_buffer_size</code>.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="background-of-mem_cap-design">Background of mem_cap Design<a href="https://hugegraph.apache.org/blog/2025/09/30/toplingdb-yaml-configuration-file/#background-of-mem_cap-design" class="hash-link" aria-label="Direct link to Background of mem_cap Design" title="Direct link to Background of mem_cap Design" translate="no">​</a></h4>
<p>The underlying algorithm of CSPP adopts a pre-allocation strategy to support high-concurrency writes.
Once the pre-allocated memory is filled, no further writes can proceed.
However, RocksDB itself lacks a mechanism that allows a memtable to actively report
"the pre-allocated memory is full, a new memtable is required".
Due to the complexity of its call chain, it is impractical to refactor RocksDB to add this capability.
Therefore, CSPP adapts to RocksDB’s behavior through parameter design.</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="core-idea-of-mem_cap">Core Idea of mem_cap<a href="https://hugegraph.apache.org/blog/2025/09/30/toplingdb-yaml-configuration-file/#core-idea-of-mem_cap" class="hash-link" aria-label="Direct link to Core Idea of mem_cap" title="Direct link to Core Idea of mem_cap" translate="no">​</a></h4>
<p>ToplingDB sets <code>mem_cap</code> to be much larger than <code>write_buffer_size</code>,
so that RocksDB will not prematurely trigger an "out of memory" error when writing to a memtable.
During CSPP initialization (<code>New</code>), the system rechecks the setting.
If <code>mem_cap</code> is found to be too small, it will be automatically adjusted to <code>2 * write_buffer_size</code> to ensure stability during the write process.</p>
<p>The default value is 2G, and the effective maximum is 16G.</p>
<ul>
<li class="">Small deployments (&lt;16GB RAM): set to 20–30% of system memory</li>
<li class="">Medium deployments (16–64GB RAM): set to 8–16G</li>
<li class="">Large deployments (&gt;64GB RAM): set to 16G</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="use_vm">use_vm<a href="https://hugegraph.apache.org/blog/2025/09/30/toplingdb-yaml-configuration-file/#use_vm" class="hash-link" aria-label="Direct link to use_vm" title="Direct link to use_vm" translate="no">​</a></h3>
<p>When allocating memory via <code>malloc/posix_memalign</code>, the address space may already be physically allocated (heap space with mapped pages), while CSPP only needs reserved virtual address space.<br>
When <code>use_vm</code> is <code>true</code>, allocation is forced to use <code>mmap</code>, ensuring reserved address space without occupying physical pages.<br>
The default is <code>true</code>. If physical memory is sufficient, it is recommended to disable this option—establishing mappings from <code>mmap</code>’s virtual memory to physical pages can trigger many minor page faults and may affect performance.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="convert_to_sst">convert_to_sst<a href="https://hugegraph.apache.org/blog/2025/09/30/toplingdb-yaml-configuration-file/#convert_to_sst" class="hash-link" aria-label="Direct link to convert_to_sst" title="Direct link to convert_to_sst" translate="no">​</a></h3>
<p><code>convert_to_sst</code> supports three enum values:</p>
<ul>
<li class=""><code>kDontConvert</code>: Disables the feature (default). Uses the traditional Flush process, offering the best compatibility for stability-focused scenarios.</li>
<li class=""><code>kDumpMem</code>: During conversion, dumps the entire MemTable memory to an SST file, reducing CPU consumption but not memory usage.</li>
<li class=""><code>kFileMmap</code>: <code>mmap</code>s MemTable content into a file—the key feature—reduces both CPU and memory usage. You can also set <code>DBOptions.memtable_as_log_index = true</code> to essentially eliminate MemTable Flush.</li>
</ul>
<p>These parameters offer more tunable options for the write path, allowing users to choose as needed.</p>
<p>For more design details, see: <a href="https://github.com/topling/cspp-memtable/blob/memtable_as_log_index/README_EN.md" target="_blank" rel="noopener noreferrer" class="">cspp-memtable</a>, <a href="https://zhuanlan.zhihu.com/p/649435555" target="_blank" rel="noopener noreferrer" class="">ToplingDB CSPP MemTable Design Essentials</a>, <a href="https://zhuanlan.zhihu.com/p/499138254" target="_blank" rel="noopener noreferrer" class="">CSPP Trie Design Analysis</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3-tablefactory-extensions">3. TableFactory extensions<a href="https://hugegraph.apache.org/blog/2025/09/30/toplingdb-yaml-configuration-file/#3-tablefactory-extensions" class="hash-link" aria-label="Direct link to 3. TableFactory extensions" title="Direct link to 3. TableFactory extensions" translate="no">​</a></h2>
<ul>
<li class=""><strong>CSPPMemTabTable</strong>: The TableFactory paired with the <code>cspp</code> MemTable.</li>
<li class=""><strong>DispatcherTable</strong>: Supports specifying different TableFactories per level, for example:
<ul>
<li class="">Use BlockBasedTable by default.</li>
<li class="">Use CSPPMemTabTable for specific levels.</li>
</ul>
</li>
</ul>
<p>This level of flexibility is not available in native RocksDB configuration.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="4-statistics-and-observability-controls">4. Statistics and observability controls<a href="https://hugegraph.apache.org/blog/2025/09/30/toplingdb-yaml-configuration-file/#4-statistics-and-observability-controls" class="hash-link" aria-label="Direct link to 4. Statistics and observability controls" title="Direct link to 4. Statistics and observability controls" translate="no">​</a></h2>
<ul>
<li class=""><strong>discard_tickers / discard_histograms</strong>: Precisely specify which statistics to discard.</li>
<li class=""><strong>stats_level: kDisableAll</strong>: Combined with the above, flexibly control the overhead of statistics.</li>
</ul>
<p>Compared to RocksDB’s coarse-grained controls, ToplingDB offers finer tuning.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="5-new-dboptions-parameter">5. New DBOptions parameter<a href="https://hugegraph.apache.org/blog/2025/09/30/toplingdb-yaml-configuration-file/#5-new-dboptions-parameter" class="hash-link" aria-label="Direct link to 5. New DBOptions parameter" title="Direct link to 5. New DBOptions parameter" translate="no">​</a></h2>
<ul>
<li class=""><strong>memtable_as_log_index: true</strong>: Allows using the MemTable as a log index to speed up recovery.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="6-security-considerations">6. Security considerations<a href="https://hugegraph.apache.org/blog/2025/09/30/toplingdb-yaml-configuration-file/#6-security-considerations" class="hash-link" aria-label="Direct link to 6. Security considerations" title="Direct link to 6. Security considerations" translate="no">​</a></h2>
<p><strong>Web Server security</strong>:</p>
<ul>
<li class="">The Web Server pages are provided by ToplingDB and do not include authentication.</li>
<li class="">By default, <code>listening_ports: '127.0.0.1:2011'</code> restricts access to local requests.</li>
<li class="">In production, configure firewall rules to allow only intranet access.</li>
<li class="">To disable the Web Server, set <code>rocksdb.open_http=false</code> in <code>hugegraph.properties</code>.</li>
</ul>
<p><strong>Shared memory safety</strong>:</p>
<ul>
<li class=""><code>document_root: /dev/shm/rocksdb_resource</code> uses a shared memory directory.</li>
<li class="">In multi-user environments, ensure proper file permissions to avoid unauthorized access.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="7-summary">7. Summary<a href="https://hugegraph.apache.org/blog/2025/09/30/toplingdb-yaml-configuration-file/#7-summary" class="hash-link" aria-label="Direct link to 7. Summary" title="Direct link to 7. Summary" translate="no">​</a></h2>
<p>ToplingDB adds the following capabilities on top of RocksDB:</p>
<ul>
<li class="">Plugin-based configuration and object reuse</li>
<li class="">A new MemTable type (cspp) with a paired TableFactory</li>
<li class="">DispatcherTable for multi-factory scheduling</li>
<li class="">Built-in Web Server</li>
<li class="">More flexible statistics and observability controls</li>
<li class="">Special DBOptions (such as <code>memtable_as_log_index</code>)</li>
</ul>
<p>These extensions give users more tuning space, particularly suited for scenarios requiring high write performance and flexible operations.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="related-documentation">Related Documentation<a href="https://hugegraph.apache.org/blog/2025/09/30/toplingdb-yaml-configuration-file/#related-documentation" class="hash-link" aria-label="Direct link to Related Documentation" title="Direct link to Related Documentation" translate="no">​</a></h2>
<ul>
<li class=""><a class="" href="https://hugegraph.apache.org/blog/2025/10/09/toplingdb-quick-start/">ToplingDB Quick Start</a> – How to enable ToplingDB in HugeGraph</li>
<li class=""><a href="https://github.com/facebook/rocksdb/wiki/Setup-Options-and-Basic-Tuning" target="_blank" rel="noopener noreferrer" class="">RocksDB Official Configuration Guide</a> – Learn the basic configuration options</li>
<li class=""><a href="https://github.com/topling/sideplugin-wiki-en/wiki" target="_blank" rel="noopener noreferrer" class="">SidePlugin Wiki</a> – Complete configuration reference for ToplingDB</li>
</ul>]]></content>
    </entry>
</feed>