Синтаксис для запроса дополнительных отношений в графической базе данных Microsoft SQL Server 2017?
Я хочу выбрать дополнительные отношения в /questions/tagged/sql-server-2017-graph. Похожий на optional
в sparql например:
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/.
И похоже на LEFT JOIN
в обычном sql; например:
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
?
Документация MATCH
не описывает никакой "необязательной" конструкции и состояния примечаний:
OR
а такжеNOT
операторы не поддерживаются вMATCH
шаблон.MATCH
можно комбинировать с другими выражениями, используяAND
вWHERE
пункт. Однако, объединяя его с другими выражениями, используяOR
или жеNOT
не поддерживается.
1 ответ
Вы можете объединить LEFT JOIN
с MATCH
, Поставить опционально MATCH
в отдельном вложенном запросе. Поместите необязательный подзапрос в LEFT JOIN
-clause.
Запрос немного громоздкий. Шаблон поиска основного графика и необязательный шаблон поиска графика требуют отдельного Node
таблицы для использования графика MATCH
-синтаксис. Третий случай Node
нужен стол LEFT JOIN
необязательный пункт на. Этот третий Node
экземпляр должен быть отделен от Node
-используется для MATCH
основная часть запроса на с момента использования MATCH
требуется 1 table_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; выберите друзей Джона и при желании рестораны, которые нравятся этим друзьям:
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
В исходной базе данных каждый человек любит ресторан, поэтому нет разницы между сложным запросом выше и MATCH(person1-(friendOf)->person2-(likes)->Restaurant)
, Тем не менее, когда вы удаляете Салли нравится Джинджер и 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
по-прежнему возвращает Салли в друзья John
, Результаты показывают NULL
для ресторана Салли. MATCH(person1-(friendOf)->person2-(likes)->Restaurant)
не показывает Салли.
1 MATCH
Аргументы и Использование представлений и табличных функций в качестве таблиц узлов или ребер в предложениях соответствия описывают это ограничение для таблиц, которые могут использоваться в MATCH
-clause.