图形数据库的PostgreSQL CTE语句

图形数据库的PostgreSQL CTE语句,postgresql,graph,common-table-expression,Postgresql,Graph,Common Table Expression,我不太擅长在Postgres中使用CTE,但我认为这是我遇到的图形问题的正确方向。我要做的是使用edges表和最短路径数组生成SQL语句。我有两个图:数据和模式。数据图包含所有数据(显然),模式图描述了不同节点类型如何组合在一起 我创建了一个模式图,而不是递归地遍历已经很大而且还在增长的数据图,我想用它来为数据图生成一个查询。我们的想法是,如果可能的话,速度会明显加快 假设我有以下表格: 节点类型(架构图) 患者(节点类型id=1) 准入(节点类型id=12) 访问(节点类型id=15) 节

我不太擅长在Postgres中使用CTE,但我认为这是我遇到的图形问题的正确方向。我要做的是使用edges表和最短路径数组生成SQL语句。我有两个图:数据和模式。数据图包含所有数据(显然),模式图描述了不同节点类型如何组合在一起

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

假设我有以下表格:

节点类型(架构图)

  • 患者(节点类型id=1)
  • 准入(节点类型id=12)
  • 访问(节点类型id=15)
节点类型边(架构图)

  • 来源
  • 目标
节点(数据图)

  • 节点id
  • 节点类型id
  • 有效载荷
(数据图)

  • 来源
  • 目标
我还有一个最短路径函数,它将路径作为模式的整数数组返回。例:{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;

这可能吗?有人有更好的建议吗?提前感谢您的建议

你有一个基本的误解。图形不是,也就是说,从a->B没有唯一的路径。DB如何确定您想要的路径

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

关于树木,您可以参考Joe Celko的“