成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > PostgreSQL圖(graph)的遞歸查詢實例

PostgreSQL圖(graph)的遞歸查詢實例

熱門標(biāo)簽:漯河外呼電話系統(tǒng) 合肥公司外呼系統(tǒng)運營商 打電話智能電銷機器人授權(quán) 重慶自動外呼系統(tǒng)定制 海豐有多少商家沒有地圖標(biāo)注 地圖標(biāo)注和圖片名稱的區(qū)別 外呼調(diào)研系統(tǒng) 美容工作室地圖標(biāo)注 辦公外呼電話系統(tǒng)

背景

在樹形遞歸查詢這篇文章,我記錄了使用CTE語法查詢樹形結(jié)構(gòu)的辦法。在一個樹形結(jié)構(gòu)中,每一個節(jié)點最多有一個上級,可以有任意個數(shù)的下級。

在實際場景中,我們還會遇到對圖(graph)的查詢,圖和樹的最大區(qū)別是,圖的節(jié)點可以有任意個數(shù)的上級和下級。如下圖所示

因為圖可能存在loop結(jié)構(gòu)(上圖紅色箭頭),所以在使用CTE遞歸的過程中,必須要破環(huán)(break loop),否則算法就會進入無限遞歸,永不結(jié)束。

存儲和查詢圖結(jié)構(gòu),目前當(dāng)紅數(shù)據(jù)庫是neo4j,但是當(dāng)數(shù)據(jù)量只有十幾萬條的時候,PostgreSQL完全可以勝任。

構(gòu)造樣本數(shù)據(jù)

-- 每一條有向關(guān)系邊都存在上游,下游兩個節(jié)點
drop table if exists demo.t_rel;
create table if not exists demo.t_rel(up int , down int);

-- 唯一約束,避免插入相同的關(guān)系
alter table demo.t_rel add constraint udx_t_rel unique (up, down);

insert into demo.t_rel values(6,5),(3,7),(5,1),(1,2),(5,2),(5,7),(7,2),(2,4),(7,4);

-- 構(gòu)造一條環(huán)數(shù)據(jù),7-2-4-7
delete from demo.t_rel where up=4 and down=7;
insert into demo.t_rel values(4,7);

遞歸查詢

指定節(jié)點的下級

常見的一個場景是,給定一個節(jié)點,查詢這個節(jié)點的所有下級節(jié)點和路徑。使用破環(huán)的算法關(guān)鍵如下

  • 使用數(shù)組保存當(dāng)前的路徑信息。
  • 計算下一個節(jié)點之前,判斷該節(jié)點是否已經(jīng)存在于路徑上。如果是,就說明該點是環(huán)的起點,必須排除這個節(jié)點來達到破環(huán)的效果。
  • 起始節(jié)點和最大深度,都是可選的。如果忽略這兩個條件,就會返回完整的圖信息。
with recursive 
downstream as
(
	select 1 as lvl, r.up, r.down, 
			-- 保存當(dāng)前路徑
			array[]::int[] || r.up || r.down as trace 
		from demo.t_rel r  
	where r.up = 7 -- 指定起點
	union all
	select ds.lvl +1, r.up, r.down, ds.trace || r.down
		from demo.t_rel r , downstream ds 
	where r.up = ds.down
		-- 破環(huán)
		and not r.down = any(ds.trace)
		and ds.lvl  20 -- 最大深度
)
select * from downstream ds;

上面以節(jié)點7為開始,返回下級的所有節(jié)點和路徑信息,如下。

-- 可以看到并沒有包括7-2-4-7這條環(huán)。
 lvl | up | down | trace
-----+----+------+---------
 1 | 7 | 2 | {7,2}
 1 | 7 | 4 | {7,4}
 2 | 2 | 4 | {7,2,4}
(3 rows)

指定節(jié)點的所有關(guān)聯(lián)

在社交網(wǎng)絡(luò)的場景中,我們根據(jù)一個特定的節(jié)點,查詢所有的關(guān)系網(wǎng)。在本文的樣本數(shù)據(jù)中,我們的需求就變成,同時查詢指定節(jié)點的所有上級和下級。

為了方便后面的測試,我們封裝一個函數(shù)

drop function if exists f_get_rel;

/*
取得某個節(jié)點的相關(guān)聯(lián)節(jié)點,和路徑信息。
@start_node 起始節(jié)點。
@direct_flag 查詢方向,-1:查找上級;1:查找下級; 0:查找上下級;
@max_depth 遞歸深度,即查找最多幾級關(guān)系。
*/
create or replace function f_get_rel(start_node int, direct_flag int=1, max_depth int=20) 
	returns table (direct int, cur_depth int, up_node int, down_node int, trace int[])
as $$
begin

	return query 
		with recursive 
		downstream as
		(
			select 1 as lvl, r.up, r.down, array[]::int[] || r.up || r.down as trace 
				from demo.t_rel r 
			where r.up = start_node
				and direct_flag in (0, 1)
			union all
			select ds.lvl +1, r.up, r.down, ds.trace || r.down
				from demo.t_rel r , downstream ds 
			where r.up = ds.down
				and not r.down = any(ds.trace)
				and ds.lvl  max_depth
		),
		upstream as
		(
			select 1 as lvl, r.up, r.down, array[]::int[] || r.up || r.down as trace 
				from demo.t_rel r 
			where r.down = start_node
				and direct_flag in (0, -1)
			union all
			select us.lvl +1, r.up, r.down, r.up || us.trace 
				from demo.t_rel r , upstream us 
			where r.down = us.up
				and not r.up = any(us.trace)
				and us.lvl  max_depth
		)
		select -1, us.* from upstream us 
			union all 
		select 1, ds.* from downstream ds
		order by 1 desc, lvl, up, down
	;

end;
$$ language plpgsql strict;

測試一下,查詢節(jié)點7的所有3度關(guān)聯(lián)節(jié)點信息,如下

dap=# select * from demo.f_get_rel(7,0,3);
 direct | cur_depth | up_node | down_node | trace
--------+-----------+---------+-----------+-----------
  1 |   1 |  7 |   2 | {7,2}
  1 |   1 |  7 |   4 | {7,4}
  1 |   2 |  2 |   4 | {7,2,4}
  -1 |   1 |  3 |   7 | {3,7}
  -1 |   1 |  4 |   7 | {4,7}
  -1 |   1 |  5 |   7 | {5,7}
  -1 |   2 |  2 |   4 | {2,4,7}
  -1 |   2 |  6 |   5 | {6,5,7}
  -1 |   3 |  1 |   2 | {1,2,4,7}
  -1 |   3 |  5 |   2 | {5,2,4,7}
(10 rows)

圖形顯示結(jié)果

ECharts模板

在沒有集成圖形界面之前,使用ECharts的示例代碼(地址),可以直觀的查看關(guān)系圖譜。對官方樣表進行微調(diào)之后,代碼如下
注意 代碼中的 data 和 links 部分需要進行替換

option = {
 title: {
  text: '數(shù)據(jù)圖譜'
 },
 tooltip: {},
 animationDurationUpdate: 1500,
 animationEasingUpdate: 'quinticInOut',
 series : [
  {
   type: 'graph',
   layout: 'force',
   force: {
     repulsion: 1000
    },
   focusNodeAdjacency: true,
   symbolSize: 30,
   roam: true,
   label: {
    normal: {
     show: true
    }
   },
   edgeSymbol: ['circle', 'arrow'],
   edgeSymbolSize: [4, 10],
   edgeLabel: {
    normal: {
     textStyle: {
      fontSize: 20
     }
    }
   },
   data: [
    { name:"2", draggable: true, symbolSize:20},
   ],
   links: [
    { source:"2", target:"4"},
   ],

  }
 ]
};

造顯示用數(shù)據(jù)

構(gòu)造 data 部分

-- 根據(jù)節(jié)點的關(guān)聯(lián)點數(shù)量,設(shè)置圖形大小
with rel as (select * from f_get_rel(7,0,2)),
	up_nodes as (select up_node, count(distinct down_node) as out_cnt from rel group by up_node),
	down_nodes as (select down_node, count(distinct up_node) as in_cnt from rel group by down_node),
	node_cnt as ( select up_node as node, out_cnt as cnt from up_nodes union all select * from down_nodes )
select '{ name:"' || n.node || '", draggable: true, symbolSize:' || sum(n.cnt) * 10 || '},' as node
	from node_cnt n
group by n.node
order by 1;

構(gòu)造 links 部分

select distinct r.up_node, r.down_node, '{ source:"'|| r.up_node ||'", target:"'|| r.down_node ||'"},' as links 
	from f_get_rel(7,0,3) r
order by r.up_node	;

圖形顯示

把構(gòu)造的data和links替換到ECharts代碼里面

查詢節(jié)點7的所有2度關(guān)聯(lián)節(jié)點信息,結(jié)果顯示如下

查詢節(jié)點7的所有關(guān)聯(lián)節(jié)點信息(不限層級數(shù)),結(jié)果顯示如下

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • PostgreSQL樹形結(jié)構(gòu)的遞歸查詢示例
  • 在PostgreSQL中實現(xiàn)遞歸查詢的教程
  • PostgreSQL利用遞歸優(yōu)化求稀疏列唯一值的方法

標(biāo)簽:衡陽 株洲 晉城 錦州 烏海 珠海 來賓 蚌埠

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PostgreSQL圖(graph)的遞歸查詢實例》,本文關(guān)鍵詞  PostgreSQL,圖,graph,的,遞歸,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PostgreSQL圖(graph)的遞歸查詢實例》相關(guān)的同類信息!
  • 本頁收集關(guān)于PostgreSQL圖(graph)的遞歸查詢實例的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    三区精品视频| 加勒比久久高清| 国产精品18久久久久久久久久| 亚洲欧美电影一区二区| 国产精品88888| 中文在线字幕av| 免费在线观看黄色小视频| 精品一区三区| 在线观看不卡av| 国产哺乳奶水91在线播放| 久久综合影音| 女生裸体无遮挡天堂网站免费| 国产乱码精品一区二三区蜜臂| 999这里只有精品| 欧美亚日韩国产aⅴ精品中极品| 波多野结衣亚洲一二三| 少妇高潮流白浆| 黄色录像特级片| 91成人短视频在线观看| 日韩精品久久久久久福利| 亚洲精品98久久久久久中文字幕| 欧美综合一区二区| 亚洲av熟女国产一区二区性色| 久久久久久97| 91福利资源站| 亚洲免费观看高清在线观看| 中文字幕免费高清视频| 女海盗2成人h版中文字幕| 玖玖爱视频在线| 91蜜桃婷婷狠狠久久综合9色| 蜜臀精品一区二区三区在线观看| 日本免费一区二区视频| 色婷婷av久久久久久久| 99在线精品视频免费观看软件| 亚洲欧美日韩精品一区二区| 欧美日韩色综合| 国产精品一区二区精品| 日韩精品自拍偷拍| 国产免费一区二区三区最新6| 久久精品视频一区二区三区| 激情小说综合区| 3p视频在线观看| 欧美尿孔扩张虐视频| 亚洲男人影院| 亚洲a∨日韩av高清在线观看| 色88888久久久久久影院| 久久久久久久久久久国产| 日韩一区精品字幕| 国产女主播一区二区三区| 精品国产31久久久久久| 在线观看国产日韩| 精品999在线| 夜级特黄日本大片_在线| 国产一区二区美女| 尤物yw午夜国产精品视频明星| 久久综合狠狠综合久久综合88| 亚洲精品国产成人影院| 国产伦精品一区二区三区在线播放| 日韩av综合在线观看| 国产 欧美 在线| 肉大捧一出免费观看网站在线播放| 狠狠88综合久久久久综合网| 亚洲图色一区二区三区| 电影天堂国产精品| 欧美本精品男人aⅴ天堂| 一色屋免费视频| 久久久久国产免费免费| 欧美日韩一区二区视频在线| 亚州精品永久观看视频| 欧美日韩在线大尺度| 国产色视频在线播放| 日韩三级一区二区三区| 欧美男生操女生| 国产激情一区二区三区四区| 亚洲黄页一区| 色婷婷香蕉在线一区二区| 久久97久久97精品免视看| 国产精品18久久久久久久久| jizz18欧美18| 国产成人精品福利一区二区三区| 亚洲AV第二区国产精品| 91精品国模一区二区三区| 性刺激综合网| 欧美激情第6页| 夜夜添无码一区二区三区| 亚洲成人黄色网| 99精品在线观看| 日本视频一二三区中文字幕| 免费高清av| 国产精品极品美女在线观看免费| 精品久久久久中文慕人妻| 国产精品99久久久久久董美香| 免费成人黄色网| 麻豆changesxxx国产| 国精品无码一区二区三区| 怡红院亚洲色图| a视频免费在线观看| 91麻豆精品国产91久久久久久| 第一福利在线| 国产精品美女久久久久av福利| 成人午夜精品| 国产丝袜在线| 婷婷五月综合激情| 性做久久久久久免费观看欧美| 久久精品视频一区二区| 亚洲深夜福利在线观看| 亚洲欧美日韩国产中文专区| 亚洲精品国产第一综合99久久| 又黄又爽的视频在线观看| 欧亚精品中文字幕| 中文一区一区三区免费在线观看| 美国黄色一级视频| 欧美视频在线观看视频| 成人亚洲精品7777| 亚洲aaa激情| 美女福利视频导航| 婷婷久久五月天| 国内久久精品视频| 亚洲伦理一区| 日产精品久久久一区二区福利| 69亚洲乱人伦| 国产激情91久久精品导航| 国产精品视频网址| 色琪琪丁香婷婷综合久久| 波多野结衣亚洲一区二区| 色香蕉在线观看| 97视频在线观看网站| 欧美成人三级伦在线观看| 日本免费看黄色| 成人91在线观看| 午夜精品久久久久久久96蜜桃| 久久视频免费在线| 欧美电影《轻佻寡妇》| 亚洲免费三区一区二区| 久久久伦理片| 一区二区中文视频| 天美传媒免费在线观看| 亚洲精品国产成人av在线| 国产欧美一区二区三区另类精品| 一起操在线视频| 日本一区二区三区久久| 日本视频一区二区三区| 国产1区2区3区在线| 成人欧美一区二区三区视频| 欧美videossex另类| 欧美乱大交xxxx| 精品国产午夜福利在线观看| 人妻换人妻仑乱| 男女视频免费网站| 91破解版在线观看| 中文在线综合| 国产日本一区二区| 久久av高潮av无码av喷吹| 女人18毛片毛片毛片毛片区二| 无罩大乳的熟妇正在播放| 欧美一区二区三区黄片| 9.1人成人免费视频网站| 亚洲欧美激情在线| 在线影院自拍| 中文字幕一区二区三区四区五区六区| 国产深夜视频在线观看| 91嫩草国产线观看亚洲一区二区| 亚洲free嫩bbb| 国产小视频福利在线| 久久在线视频在线| 黄网站免费看| 亚洲欧洲日产国码无码久久99| 欧美激情欧美激情在线五月| 浮妇高潮喷白浆视频| av先锋影音资源站| 最新中文字幕一区| 99青草视频在线播放视| 男女啪啪在线观看| 国产欧美91| 欧美专区国产专区| 国产欧美熟妇另类久久久| 国产成人无码www免费视频播放| 先锋影音av在线资源| 男女高潮又爽又黄又无遮挡| 亚洲国产视频一区二区| 欧美色蜜桃97| 1024成人网色www| 亚洲动漫第一页| 日日夜夜精品免费| 精品伦理一区二区三区| 中文天堂最新版本在线观看| 日本不卡不卡| 国产午夜在线视频| 先锋影音av资源网| 六月丁香综合在线视频| 欧美性色视频在线| 人妻无码久久一区二区三区免费| 美女又黄又免费| 精品精品欲导航| 日本毛片在线观看| 久久久久久毛片| 久久黄色精品视频| 精品国精品自拍自在线| 亚洲人成毛片在线播放| 色婷婷av一区二区| 一级黄色片免费看| 日韩一区二区三区国产| 免费毛片小视频| 久久视频免费在线观看| 黄色小视频在线播放| 日本精品国语自产拍在线观看| 亚洲这里只有精品| 天天综合网天天做天天受| 又黄又免费的视频| 欧美精品免费在线| 中文字幕在线久热精品| 在线免费看av| 自由日本语热亚洲人| 亚洲精品天堂在线| 91精品蜜臀一区二区三区在线| 91在线视频免费观看| 日本精品中文字幕| 精品一区二区三区免费观看| 亚洲av熟女高潮一区二区| 国产精品久久久一本精品| 中文在线观看免费网站| 黄色小视频免费看| 国产视频不卡一区| 狠狠色综合网站久久久久久久| 91久久国产综合| 亚洲永久免费av| 999色成人| 五月婷婷六月色| 欧美激情亚洲精品| 亚洲欧美一区二区三| 久久久久久黄| 中文字幕一区二区中文字幕| 国产人妖伪娘一区91| 亚洲av无码一区二区乱子伦| 俺要去色综合狠狠| 亚洲欧美综合图片| 92国产在线视频| 黄色一级免费视频| 韩日精品一区| 色综合视频一区中文字幕| 性の欲びの女javhd| 国产a久久精品一区二区三区| 成人影院在线视频| 无码人妻精品一区二区三区在线| 欧美系列亚洲系列| 91精品国产乱码在线观看| 日韩视频一区二区三区在线播放免费观看| 在线亚洲美日韩| 天天综合av| 日本一区二区不卡高清更新| 国产黄色小视频在线| 国产精品吹潮在线观看| 国产高清第一页| 国产精品成人a在线观看| 粉嫩小泬无遮挡久久久久久| 久久夜精品va视频免费观看| 国产精品黄色影片导航在线观看| 品久久久久久久久久96高清| 快she精品国产999| 午夜免费看视频| **女人18毛片一区二区| 91国产丝袜在线放| 色播视频在线播放| 五月天av影院| 91人人澡人人爽人人精品| 精品香蕉一区二区三区| 99r国产精品视频| 国产视频每日更新| 亚洲精品福利| 丁香高清在线观看完整电影视频| 精品av中文字幕在线毛片| 亚洲视频日本| 国产精品九九视频| 成人免费播放视频| 久久婷婷综合国产| 亚洲精品成人网| 中国大陆高清aⅴ毛片| 欧美日韩尤物久久| 欧美性感美女一区二区| 亚洲小说春色综合另类网蜜桃| 香蕉av在线播放| 女女同性女同一区二区三区91| 亚洲一级特黄| 动漫一区二区三区| 激情无码人妻又粗又大| 宅男噜噜噜66一区二区66| av资源中文在线天堂| 国产99久一区二区三区a片| 成人激情视频小说免费下载| 亚洲春色在线| 成人黄网18免费观看的网站| 尤物在线观看视频| 一区二区三区av在线| 日韩尤物视频| 最新亚洲精品| 黄p免费网站| 乳奴隷乳フ辱julia在线观看| 福利在线导航136| 欧美a极品极品欧美| 亚洲熟女一区二区| 欧美国产视频在线| 亚洲精品亚洲人成人网| 日本大胆人体视频| www.夜夜爱| 国产无码精品久久久| 久久一二三国产| 亚洲成人激情在线观看| 成人欧美一区二区| 久久久久久久久久久视频| 亚洲成人免费视频| 萌白酱视频在线| 亚洲最新免费视频| 欧美日韩视频在线观看一区二区三区| 精品一区二区视频在线观看| 亚洲免费精彩视频| 欧美18一19xxx性| 天天色天天射天天综合网| 韩国女主播一区二区三区| 国内精品免费午夜毛片| 超碰av在线免费观看| chinese少妇国语对白| 国产传媒欧美日韩| 欧美性色欧美a在线播放| 全部a∨一极品视觉盛宴| 日日狠狠久久偷偷综合色| 亚洲欧美另类久久久精品2019| 欧美极品少妇xxxxⅹ裸体艺术| 日韩电影免费在线|