Синтаксис для запроса дополнительных отношений в графической базе данных 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.

Другие вопросы по тегам