最近一位客户询问如何创建一个节点,其边缘递归地指向同一个节点。用例围绕一个产品“推荐”另一个产品的概念。这是一个概念图。
1 回答
在 SQL Server 的 SQL 图表中,任何表都可以使用 DDL 扩展之一AS NODE
或AS EDGE
. 创建边时,它不是定向的或约束的,但使用 newCONNECTION
关键字,边可以被约束到只指定的节点。让我们从 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 与其他节点重用,您可以添加另一个约束。
现在你可以回答这个问题“这个产品的推荐链是否递归地推荐过那个产品?” 查询如下:
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 中),并且非常罕见。