1

我想选择中的可选关系。在类似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

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状态:

ORNOT运营商在MATCH图案不被支持。 MATCH可以与WHERE子句中的AND组合使用。但是,不支持使用ORNOT与其他表达式结合使用。

回答

1

您可以合并LEFT JOINMATCH。将可选的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餐厅的NULLMATCH(person1-(friendOf)->person2-(likes)->Restaurant)不显示莎莉。


MATCH §ArgumentsUse views and table valued functions as node or edge tables in match clauses和描述上可以在MATCH -clause被使用的表此限制。