#1272·graphiti

[BUG] [PERF] FalkorDB: edge_fulltext_search 由于重新匹配模式而导致全图扫描,而不是使用 startNode/endNode

作者: cm2d创建于 2026年2月25日更新于 2026年9月10日
标签bug

说明

FalkorSearch Operations中的边缘 fultext 搜索方法使用MATCH(n:n:nentity)-[e:RELATES TO {uuid:rel.uuid}]-(m:nentity)模式,在关系全文本搜索后检索源和目标节点. 这导致FalkorDB对每个全文结果的所有 RELATES TO 边缘进行全面扫描,导致O(n×m)复杂度和中度大小的图上查询超时.

全文程序已经返回关系对象——启动Node(rel)和endNode(rel)可以用来直接访问连接的节点,而无需额外的扫描.

环境 Graphiti 版本:最新版本(主要分支) 数据库: FalkordB v4.x (Docker) 图大小:~5,169 RELATES TO边缘,~1,500 实体节点 复制 在任何图上以 > 1 000 RELATES TO 边缘进行全文边缘搜索:

ZZ2ZZ 从正数导入 Graphiti results = 等待 phariti.search ("API测试系统", group ids = ["my group"]) 生成的 Cypher 是 :

密码 呼叫 db.idx.fulltext.query 关系 ('RELATES TO', “@ group id: “我的集团” ) (API QQ测试QQQ系统)) YIELD关系 AS rel,分数 MATCH(n:实体) - [e:RELATES TO {uuid:rel.uuid}] - (m:实体) -- -- 此处进行全扫描 [“我的集团”] e,分数,n,m 归来. 按得分排列 DESC LIMIT 20 GRAPH.EXPLAIN确认扫描:

结果 合计 过滤器 边由索引扫描 [e:RELATES TO] 扫描所有边缘 由标签扫描的节点 (n: entity) 扫描所有节点 程序呼吁 基准结果 查询内部模式时间行 仅全文(数) 全文 + MATCH {uuid:rel.uuid} (412 FT结果) 26.7s 412. 全面查询(1 492 FT 结果+ MATCH + Where + 订单) 根原因 在[ 平面图 正中/干流/falkordb/操作/search ops.py (https://GitHub.com/getzep/graphiti/blob/main/graphiti core/driver/falkordb/opers/search ops.py), (中文(简体) ). 边缘( F) 方法(和边缘 bfs 搜索) 重用 UUID 来重用 MATCH 关系, 而不是使用通过全文程序直接返回的关系对象 :

ZZ(ZZTERM3) 当前( 缓慢) - 行~ 306 MATCH(n:实体)-[e:RELATES TO {uuid:rel.uuid}}-(m:实体) 建议的修复 用直接端点访问替换重置MATCH:

微调

  • YIELD关系 AS rel,分数
  • MATCH(n:实体) - [e:RELATES TO {uuid:rel.uuid}] - (m:实体)
  • YIELD 关系 AS e,分数
  • 有 e, 分数, 起始点 (e) AS n, 端点 (e) AS m 这将查询从 O(n×m) 转换为 O(n) , 完全取消全图扫描 。

同样的模式也出现在

边距 bfs 搜索 (行~418线).

影响 用 ~5,000+ 查询图表上的超时 边缘 默认 FalkorDB 超时( 120s) 被全部查询所超越 在 REATES TO.uuid 上添加范围索引没有帮助 —— FalkordB 的查询计划器不用于此连接模式

内容来源: getzep/graphiti