【问题标题】:Syntax to query for optional relationships in Microsoft SQL Server 2017 Graph Database?在 Microsoft SQL Server 2017 图形数据库中查询可选关系的语法?
【发布时间】:2018-01-19 15:24:55
【问题描述】:

我想在 中选择可选关系。类似于 中的optional 例如:

PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?name ?mbox
WHERE  { ?x foaf:name  ?name .
     OPTIONAL { ?x  foaf:mbox  ?mbox }
   }

来自https://www.w3.org/2001/sw/DataAccess/rq23/#OptionalMatching

和普通中的LEFT JOIN类似;例如:

SELECT name, mbox
FROM Persons
LEFT JOIN PersonMailBoxLink ON Persons.$node_id = PersonMailBoxLink.$from_id
LEFT JOIN MailBoxes ON PersonMailBoxLink.$to_id = MailBoxes.$node_id

MATCH 有没有更简单的方法?

documentation of MATCH 没有描述“可选”构造和remarks 状态:

MATCH 模式不支持ORNOT 运算符。 MATCH 可以在 WHERE 子句中使用 AND 与其他表达式组合。但是,不支持将其与使用 ORNOT 的其他表达式组合。

【问题讨论】:

    标签: sql-server-2017-graph sparql sql sparql graph-databases sql-server-2017 sql-graph sql-server-2017-graph


    【解决方案1】:

    您可以将LEFT JOINMATCH 结合使用。将可选的MATCH 放在单独的嵌套查询中。将可选子查询放在LEFT JOIN-clause 中。

    查询有点麻烦。主要的graph search pattern 和可选的图形搜索模式需要单独的Node-tables 才能使用图形MATCH-syntax。 Node-table 的第三个实例需要LEFT JOIN 上的可选子句。这第三个Node-table 实例必须与用于MATCH 的主要查询部分的Node-table 分开,因为使用MATCH 需要1table_or_view_name 并且不能使用&lt;joined_table&gt;.

    OP 示例没有主图搜索模式,因此使用嵌套的JOIN 几乎没有什么好处。但是,这将是结果查询:

    SELECT [pLhs].[name],
        [mbox]
    FROM [Persons] as [pLhs]
    LEFT JOIN (
        SELECT [pRhs].$node_id AS [pRhsNodeId],
            [mbox]
        FROM [Persons] as [pRhs]
            [PersonMailBoxLink],
            [MailBoxes]
        WHERE MATCH ([Persons]-([PersonMailBoxLink])->[MailBoxes])
    ) AS [optionalGsp] ON [pLhs].$node_id = [optionalGsp].[pRhsNodeId];
    

    一个包含主图搜索模式和可选图搜索模式的更扩展示例更好地演示了图MATCH 与可选LEFT JOIN 的组合。以下使用SQL Graph Sample Database;选择 John 的朋友以及这些朋友喜欢的餐厅:

    SELECT [Person].[Name] as friend,
        [optionalGsp].[resaurantName],
    FROM [Person] AS person1,
        [Person] AS person2,
        [friendOf],
        [Person] AS person2Lhs
        LEFT JOIN (
            SELECT person2Rhs.$node_id AS rhsNodeId,
                [Restaurant].[Name] AS restaurantName
            FROM [Person] AS person2Rhs,
                [likes],
                [Restaurant]
            WHERE MATCH (person2Rhs-(likes)->Restaurant)
        ) AS optionalGsp
    WHERE MATCH (person1-(friendOf)->person2)
    AND person1.name = 'John'
    AND person2.$node_id = person2Lhs.$node_id
    

    在原来的sample database 中,每个人都喜欢一家餐馆,所以上面的复杂查询和MATCH(person1-(friendOf)-&gt;person2-(likes)-&gt;Restaurant) 没有区别。但是,当您删除 Sally 喜欢 Ginger and Spice 时:

    DELETE FROM likes
    WHERE $from_id = (SELECT $node_id FROM Persons WHERE name = 'Sally')
    AND $to_id = (SELECT $node_id FROM Restaurants WHERE name = 'Ginger and Spice')
    

    带有可选LEFT JOIN 的查询仍将Sally 作为John 的朋友返回。结果显示 NULL 为 Sally 的餐厅。 MATCH(person1-(friendOf)-&gt;person2-(likes)-&gt;Restaurant) 不显示 Sally。


    1MATCH §ArgumentsUse views and table valued functions as node or edge tables in match clauses 描述了对可在MATCH 子句中使用的表的限制。

    【讨论】:

      猜你喜欢
      • 2018-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      相关资源
      最近更新 更多