我有一个存储在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数据库。
答案 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