如何在 SQL Graph 表中创建递归边?

Posted

技术标签:

【中文标题】如何在 SQL Graph 表中创建递归边?【英文标题】:How do you create a recursive Edge in SQL Graph tables? 【发布时间】:2021-07-24 06:20:24 【问题描述】:

最近一位客户询问如何创建一个节点,其边缘递归地指向同一个节点。用例围绕一个产品“推荐”另一个产品的概念。这是一个概念图。

【问题讨论】:

【参考方案1】:

在 SQL Server 的 SQL Graph 中,任何表都可以使用 DDL 扩展 AS NODEAS EDGE 之一进行归因。创建 Edge 时,它​​不是定向的或约束的,但使用新的 CONNECTION 关键字,可以限制 Edge 与指定节点之间的往来。让我们从 Products 表开始。

CREATE TABLE Products
(
  Id INT PRIMARY KEY
  , Name VARCHAR(50) NOT NULL
) AS NODE;

这将创建一个空表,准备好从您的 RDBMS 数据库中填充,以便使用图形查询进行查询。例如,您可能想问“这个产品的推荐链是否递归地推荐过那个产品?”对于任何数据库中的标准 TSQL 查询来说,这是一个很难提出的问题。在图数据库中比较简单。

旁白:这就是 SQL Graph 的想法有趣的地方。如果您有一个非常适合图形数据库的问题,为什么要将您的数据迁移到专用的图形数据库并失去 SQL Server 在性能、可伸缩性、高可用性、互操作性、报告和支持方面的功能? SQL Graph 可让您在现有 RDBMS 结构之上构建一个小图,而无需任何潜在的妥协。

这就是魔法。

CREATE TABLE Recommends
(
  CONSTRAINT EC_RECOMMENDS 
    CONNECTION (Product TO Product) 
      ON DELETE CASCADE
) AS EDGE

此 DDL 语句允许您创建想要推荐的 Edge,并添加 CONNECTION 约束以确保 Edge 只能从产品到产品,其他节点不能参与。注意:如果您想将此 Edge 与其他节点重用,可以添加 ANOTHER 约束。

现在您可以回答这个问题“这个产品的推荐链是否递归地推荐过那个产品?”查询如下:

SELECT
  STRING_AGG(Product.name, '->') WITHIN GROUP (GRAPH PATH) AS RecommendationPath
FROM
  Product AS Product,
  Recommends FOR PATH AS recommends,
  Product FOR PATH  AS Recommendation
WHERE 
  MATCH(SHORTEST_PATH(Product(-(recommends)->Recommendation)+))
  AND Product.Id = 123 
  AND Recommendation.Id = 234

如今,TSQL 内置了几个特定于图形的函数。对于那些遗漏的人,您有一些有趣的选择:1) 用 TSQL 编写您自己的。我已经在几个项目中完成了此操作,发现它非常直接,具体取决于算法,或者 2)考虑过滤适合您需要的算法的数据子集,并使用 SQL Server 的 ML 服务功能将该数据公开给您的任何库数据科学家最喜欢。话虽如此,第 2 步(导出数据)的需要将仅限于 SQL 托管实例(在 Azure 中),并且非常罕见。

【讨论】:

以上是关于如何在 SQL Graph 表中创建递归边?的主要内容,如果未能解决你的问题,请参考以下文章

如何在sql中创建嵌套表

如何在 Transact/SQL 中创建数据透视表?

如何在代码中创建一个“硬编码”的小 SQL 连接表?

如何在 spark sql 中创建永久表

如何在 SQL Server 2008 中创建具有新名称的重复表

如何在 SQL 中创建临时表以用于多个 ADF 活动?