我在Postgres中使用CTE不是很强,但我认为这是解决图问题的正确方向。我要做的是使用边缘表和最短路径数组来生成SQL语句。我有两个图表:数据和模式。数据图包含所有数据(很明显),模式图描述了不同的节点类型是如何结合在一起的。
与其递归遍历已经很大且正在增长的数据图,我还创建了一个模式图,认为我使用它来生成数据图的查询。人们的想法是,如果有可能的话,它会大大加快速度。
假设我有以下表格:
节点型(模式图)
节点型边缘(模式图)
节点(数据图)
边(数据图)
我还有一个最短路径函数,它将路径作为模式的整数数组返回。例:{15,12,1}将相当于探访、加入、入院、加入病人。
我要做的是生成一个动态select语句来查询节点。因此,给定上面的{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;这有可能吗?有人有更好的建议吗?谢谢您的建议!
发布于 2015-10-18 18:35:48
你有一个基本的误解。图不是树木,也就是说,从A->B到A->B没有唯一的路径,数据库如何确定您想要的路径?
另外,如何避免双向边的循环?你根本不能。换句话说,关系数据库不能用于遍历图。这就是为什么会有像Neo4j这样的专门图形数据库,尤其是在这方面。
关于树木,你总是可以参考乔·塞尔科的"Smarties SQL中的树和层次结构“
https://stackoverflow.com/questions/33193046
复制相似问题