首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >图数据库的PostgreSQL CTE语句

图数据库的PostgreSQL CTE语句
EN

Stack Overflow用户
提问于 2015-10-18 00:23:23
回答 1查看 563关注 0票数 0

我在Postgres中使用CTE不是很强,但我认为这是解决图问题的正确方向。我要做的是使用边缘表和最短路径数组来生成SQL语句。我有两个图表:数据和模式。数据图包含所有数据(很明显),模式图描述了不同的节点类型是如何结合在一起的。

与其递归遍历已经很大且正在增长的数据图,我还创建了一个模式图,认为我使用它来生成数据图的查询。人们的想法是,如果有可能的话,它会大大加快速度。

假设我有以下表格:

节点型(模式图)

  • 病人(node_type_id = 1)
  • 入学(node_type_id = 12)
  • 访问(node_type_id = 15)

节点型边缘(模式图)

  • 来源
  • 目标

节点(数据图)

  • node_id
  • node_type_id
  • 有效载荷

(数据图)

  • 来源
  • 目标

我还有一个最短路径函数,它将路径作为模式的整数数组返回。例:{15,12,1}将相当于探访、加入、入院、加入病人。

我要做的是生成一个动态select语句来查询节点。因此,给定上面的{15,12,1}数组,我希望输出类似于:

代码语言:javascript
复制
 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语句可以做到这一点,但我完全被困住了。

代码语言:javascript
复制
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;

这有可能吗?有人有更好的建议吗?谢谢您的建议!

EN

回答 1

Stack Overflow用户

发布于 2015-10-18 18:35:48

你有一个基本的误解。图不是树木,也就是说,从A->B到A->B没有唯一的路径,数据库如何确定您想要的路径?

另外,如何避免双向边的循环?你根本不能。换句话说,关系数据库不能用于遍历图。这就是为什么会有像Neo4j这样的专门图形数据库,尤其是在这方面。

关于树木,你总是可以参考乔·塞尔科的"Smarties SQL中的树和层次结构

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33193046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档