SQL:查找子图

时间:2012-11-08 03:04:35

标签: sql sql-server graph subgraph

我有一个存储在SQL服务器中的图形网络。图形网络(标记的,无向的和连通的图形的集合)存储在顶点边缘映射方案中(即有2个表格,一个用于顶点,一个用于边缘):

顶点(graphID,vertexID,vertexLabel)

边(graphID,sourceVertex,destinationVertex,edgeLabel)

我正在寻找一种计算此网络中特定子图的简单方法。例如:我想知道该网络中存在多少“A-B-C”实例:“C-D-A-B-C-E-A-B-C-F”。关于如何在Java或C ++中完成这一点,我有一些想法...但我不知道如何使用SQL来解决这个问题。任何想法?

一点背景:我不是学生......这是一个我想追求的小项目。我做了很多社交媒体分析(在内存中),但几乎没有经验来挖掘SQL数据库。

1 个答案:

答案 0 :(得分:1)

我的想法是创建一个存储过程,其输入是一个字符串,如'A-B-C'或一个预先创建的表,顶点按正确的顺序排列('A','B','C')。所以你将有一个循环,一步一步你应该走过'A-B-C'的路径。为此,您需要一个当前步骤顶点的临时表:
1)步骤0

@currentLabel = getNextVertexLabel(...) --need to decide how to do this
select 
  * 
into #v
from Vertices 
where 
  vertexLabel = @currentLabel

--we need it later
select 
  * 
into #tempV 
from #v 
where 
  0 <> 0

2)第一步

@currentLabel = getNextVertexLabel(...)

insert #tempV
select
  vs.*
from #v v
join Edges e on
  e.SourceVertex = v.VertexID
  and e.graphID = v.graphID
join Vertices vs on
  e.destinationVertex = vs.VertexID
  and e.graphID = vs.graphID
where
  vs.vertexLabel = @currentLabel

truncate table #v
insert #v
select * from #tempV

truncate table #tempV

3)循环后

您的结果将存储在#v。所以子图的数量将是:

select count(*) from #v