在 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
模式不支持OR
和NOT
运算符。MATCH
可以在WHERE
子句中使用AND
与其他表达式组合。但是,不支持将其与使用OR
或NOT
的其他表达式组合。
【问题讨论】:
【参考方案1】:您可以将LEFT JOIN
与MATCH
结合使用。将可选的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
并且不能使用<joined_table>
.
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)->person2-(likes)->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)->person2-(likes)->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
Microsoft][ODBC SQL Server Driver][DBNETLIB]SQL Server不存在或访问被拒绝