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

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

【问题讨论】:

    标签: sql-server sql-graph


    【解决方案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 中),并且非常罕见。

    【讨论】:

      猜你喜欢
      • 2012-10-08
      • 1970-01-01
      • 1970-01-01
      • 2020-09-28
      • 2022-08-22
      • 2015-03-18
      • 2020-02-06
      • 2011-03-10
      • 1970-01-01
      相关资源
      最近更新 更多