我有一个存储在数据库中的图形信息。每个节点都有一个整数id和文本标签以及一个邻接列表,它是一个整数ARRAY的ids。在第一个查询中,我将获得一个节点列表,对于结果中的每个节点,我想获得与其相邻的所有节点的名称。
CREATE TABLE graph (id INTEGER,
name TEXT,
adj_list INTEGER[],
PRIMARY KEY (id)
);
这是我想要实现的伪代码。
let node_list = (select * from graph where name like "X%");
foreach node in node_list:
foreach adj_node in node.adj_list:
print adj_node.name
任何人都可以建议我如何编写PostgreSQL查询来实现这一目标?
这是一些示例数据
id | name | adj
---+------+------------
1 | X1 | {3, 4}
2 | X2 | {5, 6}
3 | Y1 | {..}
4 | Y2 | {..}
5 | Z1 | {..}
6 | Z2 | {..}
我想列出名称以X
开头的节点的所有相邻节点。在此示例中,结果将是{Y1,Y2,Z1,Z2}。
如果你构建像@twelfth建议的另一个表,这可能会容易得多。但是如果你想摇滚整数数组,我相信你可以这样做:
--create the table
create table graph (
id integer,
name text,
adj_list integer[]
);
-- a sample insert
insert into graph (id, name, adj_list)
values
(1, 'X1', '{3,4}'),
(2, 'X2', '{5,6}'),
(3, 'Y1', '{}'),
(4, 'Y2', '{}'),
(5, 'Z1', '{}'),
(6, 'Z2', '{}')
;
-- use a CTE to unnest the array and give you a simple list of integers.
-- In my opinion this CTE makes the code easier to read
with adjacent_ones as (
select unnest(adj_list) from graph where name like 'X%'
)
select * from graph where id in (select * from adjacent_ones);
这将为您提供以下内容
--------------------------
|id |name |adj_list |
--------------------------
|3 |Y1 |{} |
|4 |Y2 |{} |
|5 |Z1 |{} |
|6 |Z2 |{} |
--------------------------