用递归CTE模拟Cypher图查询语言:实现最短路径与模式匹配
不依赖扩展,纯SQL实现类似Neo4j的图遍历能力,支持节点标签、关系方向过滤和路径聚合。 · 难度:入门 · +10XP
图查询:递归CTE的复仇
本教程构建graph_query函数,接受类似Cypher的DSL字符串(:Person)-[:KNOWS]->(:City),解析后生成递归CTE。关键技术:使用string_to_array解析关系模式,利用LATERAL子查询实现双向遍历。实现shortest_path变体,通过breadth_first搜索树结构。最后演示RETURN子句支持聚合路径长度。
WITH RECURSIVE path AS (
SELECT node_id, ARRAY[node_id] AS path, 0 AS depth
FROM nodes WHERE label = 'Person'
UNION ALL
SELECT e.target_id, p.path || e.target_id, p.depth + 1
FROM path p
JOIN edges e ON e.source_id = p.node_id
WHERE e.label = 'KNOWS' AND NOT e.target_id = ANY(p.path)
)
SELECT * FROM path WHERE (SELECT label FROM nodes WHERE node_id = path.node_id) = 'City';