news 2026/7/31 16:54:17

在duckdb 递归CTE中实现深度优先搜索DFS

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
在duckdb 递归CTE中实现深度优先搜索DFS

原帖地址 https://github.com/duckdb/duckdb/discussions/15386

通常的递归CTE都是广度优先搜索(BFS)

WITHRECURSIVE edges(a,b)as(VALUES(1,2),(1,3),(2,4),(4,5),(4,6)),bfs(node,path)AS(SELECT1ASnode,[]:: STRUCT("from"INT,"to"INT)[]ASpath-- Start with node 1 (root)UNIONALLSELECTe.b,bft.path||[{'from': bft.node,'to': e.b}]FROMbfsASbft,edgesASeWHEREbft.node=e.a)SELECT*FROMbfs;┌───────┬────────────────────────────────────────────────────────────────────┐ │ node │ path │ │ int32 │ struct("from"integer,"to"integer)[]│ ├───────┼────────────────────────────────────────────────────────────────────┤ │1[]│ │2[{'from':1,'to':2}]│ │3[{'from':1,'to':3}]│ │4[{'from':1,'to':2},{'from':2,'to':4}]│ │5[{'from':1,'to':2},{'from':2,'to':4},{'from':4,'to':5}]│ │6[{'from':1,'to':2},{'from':2,'to':4},{'from':4,'to':6}]│ └───────┴────────────────────────────────────────────────────────────────────┘

DuckDB CTE模块的设计者kryonix提供了如下技巧提供DFS,但是还有问题,没有求出全部路径。

WITHRECURSIVE edges(a,b)as(VALUES(1,2),(1,3),(2,4),(4,5),(4,6)),dfs(stack,path)AS(SELECT[1]ASstack,[]:: STRUCT("from"INT,"to"INT)[]ASpath-- Start with node 1 (root)UNIONALL(WITHsiblingsAS(SELECTARRAY_AGG(e.bORDERBYe.bASC)ASsiblings-- ^^^-- This determines the order of traversal of the siblingsFROMdfsASdft,edgesASeWHEREdft.stack[1]=e.a)SELECTx.*FROMsiblingsAS_(s),LATERAL(SELECTs||dft.stack[2:]ASstack,-- Push the stackdft.path||[{'from': dft.stack[1],'to': s[1]}]ASpath-- Add the edge to the pathFROMdfsASdftWHEREarray_length(s)>0-- There are more siblings to traverseUNIONALLSELECTdft.stack[2:],-- Pop the stack[]:: STRUCT("from"INT,"to"INT)[]ASpath-- Reset the pathFROMdfsASdftWHEREarray_length(s)ISNULLANDdft.stack<>[]-- No more siblings to traverse)ASx))SELECT*FROMdfs;┌───────────┬────────────────────────────────────────────────────────────────────┐ │ stack │ path │ │ int32[]│ struct("from"integer,"to"integer)[]│ ├───────────┼────────────────────────────────────────────────────────────────────┤ │[1][]│ │[2,3][{'from':1,'to':2}]│ │[4,3][{'from':1,'to':2},{'from':2,'to':4}]│ │[5,6,3][{'from':1,'to':2},{'from':2,'to':4},{'from':4,'to':5}]│ │[6,3][]│ │[3][]│ │[][]│ └───────────┴────────────────────────────────────────────────────────────────────┘
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/31 7:11:23

好友圈模块 Cordova 与 OpenHarmony 混合开发实战

欢迎大家加入开源鸿蒙跨平台开发者社区&#xff0c;一起共建开源鸿蒙跨平台生态。 &#x1f4cc; 概述 好友圈模块是福报养成计应用中的一个社交功能&#xff0c;它允许用户分享自己的福报成就和心得&#xff0c;查看好友的福报动态&#xff0c;互相鼓励和支持。通过好友圈&am…

作者头像 李华
网站建设 2026/7/31 5:43:15

Type-C领夹麦:重塑移动收音新体验

在短视频创作、直播带货、在线教育等场景井喷的当下&#xff0c;移动收音设备正经历从“可用”到“专业”的质变。Type-C接口LDR6500领夹麦克风凭借即插即用的便捷性、媲美录音棚的音质表现&#xff0c;以及与现代智能设备的无缝兼容性&#xff0c;迅速成为创作者、教育者、主播…

作者头像 李华
网站建设 2026/7/30 22:36:57

AI Agent与MCP协议:重构企业协作生态的实战指南

文章探讨了AI Agent的"超级工具箱"——MCP协议如何重构企业协作生态。介绍了工具三大属性&#xff08;契约化设计、权限最小化、可观测性&#xff09;和MCP四大核心原则&#xff08;标准化身份、任务驱动通信、能力发现、流式状态更新&#xff09;。通过商业案例展示…

作者头像 李华
网站建设 2026/7/30 16:52:58

左手职场右手AI:2025年最值得学习的10大国产大模型全解析

本文详细介绍了2025年中国市场十大主流AI大模型&#xff0c;包括DeepSeek、Kimi、元宝等&#xff0c;分析了各自专注领域、差异化优势及适用场景。文章指出国内大模型已从"比谁更大"进入"比谁更准、更合规"阶段&#xff0c;开源模型参数量激增&#xff0c;…

作者头像 李华
网站建设 2026/7/28 14:11:45

提升论文效率:10个AI工具搞定数学建模复现与LaTeX排版

还在为论文写作头痛&#xff1f;特别是数学建模的优秀论文复现与排版&#xff0c;时间紧、任务重&#xff0c;AI工具能帮上大忙吗&#xff1f;今天&#xff0c;我们评测10款热门AI论文写作工具&#xff0c;帮你精准筛选最适合的助手。aibiye&#xff1a;专注于语法润色与结构优…

作者头像 李华
网站建设 2026/7/31 2:02:47

19、AdobeAcrobatProDC

详情介绍 Adobe Acrobat Pro DC是由Adobe公司开发的一款PDF文档创作、编辑和管理软件&#xff0c;可为个人、教育者等提供高效、便捷、安全的文档处理体验。软件具有强大的PDF处理能力&#xff0c;支持将多个PDF导出为不同的文件格式&#xff0c;如Word、Excel或PowerPoint&am…

作者头像 李华