在图表中索引和查询路径的最有效方法

时间:2011-05-17 21:04:41

标签: sql sqlite indexing

我有一张代表图表的表格:边缘(从,到)

我想用“路径查询”查询此表,只检索路径的源和目标。

例如,假设我的表包含以下行:

+------+----+
| from | to |
+------+----+
| a    | b  |
| b    | c  |
| c    | d  |
| f    | g  |
| b    | f  |
| c    | a  |
+------+----+ 

假设我执行以下(伪)查询:

SELECT ?v1, ?v2 WHERE ?v1 to ?t1, ?t1 to ?t2, ?t2 to ?v2;

这意味着我希望所有由4个节点组成的路径中存在的所有源和目标对。执行此查询应返回以下结果:

+-----+-----+
| ?v1 | ?v2 |
+-----+-----+
| a   | a   |
| a   | g   |
| a   | d   |
+-----+-----+

当然,也可能需要由不同数量的节点组成的路径,数字4不是硬编码的: - )

我的问题是:

  1. 构建此类SQL查询的最佳方法是什么(请注意我使用的是SQLite,因此无法使用递归查询。)
  2. 我目前有一个来自列的索引和一个列的索引。这是最佳的吗?我是否应该为“从,到对创建索引?相反?
  3. 假设

    1. 没有自我边缘(E.G“a - a”)。

    2. 没有两个相同的行。

    3. 提前致谢!

1 个答案:

答案 0 :(得分:2)

ad 1.) 除非您事先知道您的路径将始终具有给定长度(或一小组给定长度),否则您无法在纯SQL中表达您的查询。但是,您可以选择逐步维护图形的传递闭包,特别是

  • 对图表的更改很少
  • 和/或主要是边缘插入(而不是删除)
  • 或大部分时间都会发生批量更改,以便进行一些预处理。
这项技术在dong et al., doi://10.1.1.103.3314的论文中概述;不要被理论和数学所吓倒,他们还提供随时可用的sql代码,他们的基本想法很简单。

ad 2。)

如果维护一个传递闭包表是一个选项,它应该借给表示路径起点和终点顶点的一对索引。

如果不是,你可能会利用图表的结构:对于与粉丝相比较高(小)的平均粉丝,你应该更好地使用'to'的索引( 'from')专栏。

如果你不能对扇出/扇入比率做出假设,你可能最好用每列的索引。

希望它有所帮助,

最好的问候,carsten