如何在 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 NODE
或 AS 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 表中创建递归边?的主要内容,如果未能解决你的问题,请参考以下文章