在Microsoft SQL Server 2017图形数据库中查询可选关系的语法?
我想选择sql-server-2017-graph中的可选关系。在sparql类似optional
例如为:在Microsoft SQL Server 2017图形数据库中查询可选关系的语法?
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。
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状态:
OR
和NOT
运营商在MATCH
图案不被支持。MATCH
可以与WHERE
子句中的AND
组合使用。但是,不支持使用OR
或NOT
与其他表达式结合使用。
您可以合并LEFT JOIN
与MATCH
。将可选的MATCH
置于单独的嵌套查询中。将可选子查询放在JOIN
条款中。
该查询有点麻烦。主要的graph search pattern和可选的图搜索模式需要单独使用-表中的Node
-表。 JOIN
需要第三个Node
-table表的可选子句。这个第三个Node
-table实例必须与Node
-table分开使用,以MATCH
为主要查询部分,因为使用MATCH
需要 a table_or_view_name
并且不能使用<joined_table>
。
OP示例没有主图搜索模式,因此使用嵌套的JOIN
几乎没有什么好处。然而,这将是所产生的查询:
SELECT [pLhs].[name],
[mbox]
FROM [Persons] as [pLhs]
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];
既具有主图形搜索模式和一个可选的图形搜索图案的更扩展的例子给出具有可选LEFT JOIN
精梳图表MATCH
的一个更好的示范。以下使用SQL Graph Sample Database;选择约翰的朋友和可选的是,这些朋友喜欢的餐馆:
SELECT [Person].[Name] as friend,
[optionalGsp].[resaurantName],
FROM [Person] AS person1,
[Person] AS person2,
[friendOf],
[Person] AS person2Lhs
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)
的复杂查询之间没有什么区别。然而,当你删除萨利喜欢生姜和香料:
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')
与可选JOIN
查询仍返回萨利作为John
朋友。结果显示Sally's餐厅的NULL
。 MATCH(person1-(friendOf)->person2-(likes)->Restaurant)
不显示莎莉。
MATCH
§ArgumentsUse views and table valued functions as node or edge tables in match clauses和描述上可以在MATCH
-clause被使用的表此限制。