【问题标题】:PostgreSQL CTE statement for graph database图数据库的 PostgreSQL CTE 语句
【发布时间】: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


    【解决方案1】:

    你有一个基本的误解。图表不是Trees,即从 A->B 没有唯一的路径。数据库如何确定您想要的路径?

    另外,如何避免双向边的循环?你根本做不到。换句话说,关系数据库不能用于遍历图。这就是为什么会有专门的图形数据库,例如 Neo4j,特别是为此。

    关于树木,您可以随时参考 Joe Celko 的“Trees and Hierarchies in SQL for Smarties

    【讨论】:

      猜你喜欢
      • 2016-02-22
      • 1970-01-01
      • 2019-07-12
      • 1970-01-01
      • 2015-10-21
      • 2019-03-03
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      相关资源
      最近更新 更多