在多对多SQL表中查找数据关系或图形

时间:2012-04-13 19:33:02

标签: sql database relational-database data-mining graph-databases

我的工作中有多种类型的多个表。我有将单词与其他单词(ngrams)相关联的应用程序,以及可以将用户与其他用户(朋友/粉丝)相关联的数据库。

我想知道如何与此数据建立关系,以便为我的应用建议和用户找到有用的连接。

使用以下简单数据库表,其中外键将节点链接到另一个节点。

id | node1  | node2 
--------------------
1  |   1    |   2
2  |   1    |   3
3  |   1    |   4
4  |   2    |   1
5  |   2    |   3
6  |   2    |   5
7  |   3    |   1

例如,在上表中可能很明显,“1”是最受欢迎的,因为它与最多(2& 3)相关联。也许显而易见的是,“2”可能与“4”相关联,因为“2”与“1”有很多关系(“1”与“4”相关联。)

所以,例如我可以找到:

  • 将节点连接到其他节点的路径。
  • 基于相似性的有益联系(推荐)
  • 共享相关连接的节点组

其他常见的关系形式包括user <=> friendsblog_post <=> tags

我正在寻找可以由前端直接运行的SQL查询,或者每天晚上可以运行的map-reduce作业来从这些数据中提取关系。

4 个答案:

答案 0 :(得分:1)

正如ffriend指出的那样,您的数据结构非常适合您要做的事情。这更像是一个前端问题,例如,您将如何呈现信息?

要研究的是一些节点遍历技术以确定节点之间的跳数(重复性),连接到单个节点的节点数(广度),有意义的路径可以采用多少跳(深度)。我要考虑的唯一另一件事就是用来帮助确定相关性。这或多或少会成为节点路径在使用期间行进了多少次的计数器。您可以在此处开始为特定路径设置权重。例如,如果从1到5(1 - > 2 - > 5)的路径作为第一次遍历行进,它可能看起来像这样......

id | node1  | node2  | count
------------------------------
1  |   1    |   2    |   1
2  |   1    |   3    |   0
3  |   1    |   4    |   0
4  |   2    |   1    |   0
5  |   2    |   3    |   0
6  |   2    |   5    |   1
7  |   3    |   1    |   0

此方法可以通过将计数器用作权重因子来帮助识别节点之间的意义关系。

请记住,使用这种数据结构,您需要一种方法来实现每个方向(1 - &gt; 5和5 - &gt; 1)

答案 1 :(得分:0)

Powergagets可以使用SQL数据制作图表和图表。

答案 2 :(得分:0)

根据我对图表的记忆,Dijkstra-Prinn和Kruskal的算法可能对您有用。它们都是搜索算法(我不记得它们是BFS还是DFS ......它已经有一段时间了:p)它将帮助你获取整个图形并找到最佳遍历路径。

他们不会为您提供SQL查询,但他们将提供一个数学“跳板”来帮助您获得正确的SQL查询逻辑。

正如他的计数系统所说的水疗天堂一样,你可以利用上述程序来获得一个起点,然后使用计数器系统进行双重检查。

此外,正如之前所说的ffriend所说,我不确定您是为了优化目的还是为了其他用途而收集这些数据,所以我认为如果您重新构建问题,您可能会得到更好的帮助。

祝你好运。

答案 3 :(得分:0)

也许寻找NOSQL数据库是解决问题的更好方法。更具体地说,使用像neo4j这样的图形数据库来首先表示你的sql数据,而不是简单地遍历图形来查找你想要的关系和组。

在您的用例中,使用图形数据库总是更好,因为性能比使用表上有多个连接的sql快几倍。