【发布时间】:2015-10-19 02:35:48
【问题描述】:
我不太擅长在 Postgres 中使用 CTE,但我认为这是解决我遇到的图形问题的正确方向。我想要做的是使用我的边表和最短路径数组生成一个 SQL 语句。我有两个图表:数据和模式。数据图包含所有数据(显然),模式图描述了不同节点类型如何组合在一起。
我没有递归遍历已经很大且不断增长的数据图,而是创建了一个模式图,并认为我使用它来生成对数据图的查询。我们的想法是,如果可能的话,它会明显更快。
假设我有以下表格:
节点类型(架构图)
- 患者 (node_type_id = 1)
- 准入(node_type_id = 12)
- 访问(node_type_id = 15)
节点类型边缘(架构图)
- 来源
- 目标
节点(数据图)
- node_id
- node_type_id
- 有效载荷
边(数据图)
- 来源
- 目标
我还有一个最短路径函数,它将路径作为模式的整数数组返回。例如:{15,12,1} 将翻译为等同于 Visit JOINS Admission JOIN Patient
我想要做的是生成一个动态选择语句来查询节点。因此,鉴于 {15,12,1} 上面的数组,我希望输出类似于:
SELECT n.node_id, n.payload
FROM nodes n
JOIN node_type_edges a
ON n.node_type_id = a.source
JOIN node_type_edges b
ON a.target = b."source"
WHERE a.source = 15
AND b.source = 12
AND b.target = 1;
这只是一个例子。现实是数据以不同的深度连接,由客户在创建架构时定义。
我认为某种递归 CTE 语句可以做到这一点,但我完全卡住了。
pass 1 -> SELECT n.node_id, n.payload
pass 1 -> FROM nodes n
pass 1 -> JOIN node_type_edges a
pass 1 -> ON n.node_type_id = a.source
pass 2 -> JOIN node_type_edges b
pass 2 -> ON a.target = b."source"
pass 1 -> WHERE a.source = 15
pass 2 -> AND b.source = 12
pass 3 -> AND b.target = 1;
这甚至可能吗?有人有更好的建议吗?提前感谢您的任何建议!
【问题讨论】:
标签: postgresql graph common-table-expression