SQL查询6度分离进行网络分析

时间:2015-11-19 21:40:52

标签: sql postgresql

我正在使用D3.js构建网络分析,以便将我的应用中的已连接电话号码显示为六度分离。用于查找初始连接的SQL(postgres)低于且相当简单。但是,我很难理解如何修改它以遍历六个级别的连接然后停止。

SELECT player_id, ps.player_state, ps.email, ph.create_date
FROM game.phone_hashes ph
INNER JOIN game.customer_settings cs ON cs.id = ph.player_id
WHERE hash IN (SELECT hash FROM game.phone_hashes WHERE player_id = $1);

我通过研究这个问题找到了公用表格表达式(CTE)和递归的提及,但我不确定如何在这里应用它们。

我的目标是让所有玩家通过普通电话哈希连接到初始玩家($ 1),然后通过公共电话哈希连接到每个连接的所有玩家,然后打开在6到6度的分离。

1 个答案:

答案 0 :(得分:8)

我认为这就是你的意思:

with recursive tc as(
select $1 as player_id, 1 as level
  union
select ph2.player_id, level+1
  from tc, phone_hashes ph1, phone_hashes ph2
  where tc.player_id=ph1.player_id
  and ph1.hash=ph2.hash
  and tc.level < 6  
)    
select distinct player_id from tc