在 Microsoft SQL Server 2017 图形数据库中查询可选关系的语法?

Posted

技术标签:

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

我想在sql-server-2017-graph 中选择可选关系。类似于sparql 中的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。

和普通sql中的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 的其他表达式组合。

【问题讨论】:

【参考方案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 §Arguments 和Use views and table valued functions as node or edge tables in match clauses 描述了对可在MATCH 子句中使用的表的限制。

【讨论】:

以上是关于在 Microsoft SQL Server 2017 图形数据库中查询可选关系的语法?的主要内容,如果未能解决你的问题,请参考以下文章

客户端统计表 (Microsoft SQL Server Management Studio)

Microsoft SQL Server 2016,T-SQL:根据各个日期获取数据集的日期范围

P6 Professional Installation and Configuration Guide (Microsoft SQL Server Database) 16 R1

SQLSTATE[08001]:[Microsoft][ODBC Driver 17 for SQL Server]TCP 提供程序:错误代码 0x2746

如何把SQL Server 2008卸载干净

Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server不存在或访问被拒绝