0

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

在此处输入图像描述

4

1 回答 1

0

在 SQL Server 的 SQL 图表中,任何表都可以使用 DDL 扩展之一AS NODEAS 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 中),并且非常罕见。

于 2021-05-01T00:16:08.033 回答