在 GenosDB 中引入递归图遍历查询

发布: (2026年2月17日 GMT+8 08:31)
8 分钟阅读
原文: Dev.to

Source: Dev.to

GenosDB 中递归图遍历查询的封面图片

Esteban Fuster Pozzi

介绍

在 GenosDB,我们的使命由一个简单的原则驱动:倾听社区。随着用户群的增长,一条反馈以清晰统一的声音浮现出来:

“能够基于节点之间的关系查询节点……遍历直接和间接的连接……仍然是潜在用户的关键关注点。”

开发者希望超越仅通过属性获取节点的方式。他们需要对数据图提出更深入、有意义的问题,例如 “查找‘Perez’家族的所有后代”“显示此项目文件夹及其所有子文件夹中的每个文件”。 这正是图数据库的本质,也带来了一个引人入胜的挑战。

挑战:真实图查询 vs. P2P 性能

对于 P2P 去中心化数据库,网络上传输的每一个字节都至关重要。实现关系查询的最直观方式本是对我们的边进行 hydrate ——在每个链接中嵌入完整的节点数据。该方案行不通:它会膨胀网络数据包,破坏 GenosDB 核心原则的低延迟性能。

我们的设计理念不可妥协:节点的 edges 数组必须保持为超轻量的 ID 列表

于是挑战被重新定义:

如何在不向网络同步负载中添加任何字节的前提下,提供强大的多层级图探索查询?

答案是让我们的查询引擎变得更智能。

解决方案:$edge 查询运算符

今天我们非常激动地推出全新的 $edge 运算符。它是对我们查询语法的优雅而强大的补充,能够将普通过滤器转化为 深度图探索

当你使用 $edge 时,你告诉查询引擎:

“使用我查询的初始部分来找到起始点,然后从这些起始点开始递归遍历所有相连的节点,返回所有符合我条件的后代的最终列表。”

所有这些都在查询时完成,利用内存中的图结构通过轻量级 ID 引用进行跟踪。其结果是拥有去中心化 P2P 网络性能的真正图查询体验。

Try it live in the GenosDB Ultimate Sandbox

工作原理:首次图探索

假设你想找出 “Perez” 家族的所有成员,包括子女、孙辈等。

// Find all descendants of the "Perez" family who are of type 'Person'
const { results } = await db.map({
  query: {
    // 1️⃣ Find the starting point(s)
    type: 'Family',
    name: 'Perez',

    // 2️⃣ Begin the graph traversal
    "$edge": {
      // 3️⃣ This filter is applied to EVERY descendant found
      type: 'Person'
    }
  }
});

// `results` will contain a flat list of all people in the
// Perez family tree: Juan, Maria, Pedro, etc.

细分说明

  1. 查询首先查找所有匹配 { type: 'Family', name: 'Perez' } 的节点。这些节点是 起始入口
  2. $edge 操作符会激活 图模式。它会从起始入口遍历每一条边,并随后继续遍历后续的每一条边。
  3. 子查询 { type: 'Person' } 充当过滤器。引擎在遍历图时会检查每个遇到的节点;符合条件的节点会被加入最终结果集。

结果不是“验证”,而是一次 咨询——即你所请求的全部数据的完整列表。

更深入:高级过滤与无限深度

$edge 中的子查询可以使用 GenosDB 查询语言的全部功能($and$or$gt 等),以创建高度特定的探索。

示例: 查找 “Projects” 文件夹(及其所有子文件夹)中所有 PDF 文件或大于 2 MB 的图片文件。

// Find all matching files within a directory structure
const { results } = await db.map({
  query: {
    type: 'Folder',
    name: 'Projects'
  },
  "$edge": {
    $or: [
      { type: 'File', extension: 'pdf' },
      { type: 'File', extension: 'jpg', size_mb: { $gt: 2 } }
    ]
  }
});

单个查询即可遍历复杂的目录树,精准提取出所需的文件,无论它们嵌套得多深。

挑战极限:50 层压力测试

我们知道这个功能必须坚如磐石。为此我们设计了一个压力测试:构建一张包含 51 个节点 的线性链图。随后编写查询,让引擎必须遍历全部 50 条链接 才能在最末端找到目标。

结果: 瞬间完成。
查询引擎在毫秒级时间内解析完这条 50 层深的路径,证明递归实现不仅正确,而且高效,且不存在常见的堆栈溢出等问题。

您所期待的力量

通过倾听社区的声音,我们被推动以一种符合我们对性能和极简主义承诺的方式来解决一个棘手的问题。$edge 运算符不仅仅是一个新特性;它是我们构建强大工具、兑现承诺的理念的明证。

它将用户的关键关注点转化为 GenosDB 最强大且最具标志性的特性之一。

我们邀请您探索全新的 … (文本已截断)

递归图遍历能力 – 您可以构建的内容

本文是 GenosDB (GDB) 官方文档的一部分。

GenosDB 是一个分布式、模块化、点对点的图数据库,采用 零信任安全模型 构建,由 Esteban Fuster Pozziestebanrfp)创建。

快速链接

0 浏览
Back to Blog

相关文章

阅读更多 »