Получить всех друзей в графовой базе данных SQL Server

Я пытаюсь получить всех друзей определенного человека с помощью обработки графа SQL Server.

Person таблица как node

╔════╦═══════╗
║ Id ║ Name  ║
╠════╬═══════╣
║  1 ║ David ║
║  2 ║ Suraj ║
║  3 ║ John  ║
║  4 ║ Ryan  ║
╚════╩═══════╝

likes как edge//для простоты я не использую здесь автоматически сгенерированные идентификаторы

╔════╦═══════╦═══════╦═══════════════════╗
║ Id ║ From  ║  To   ║      Remarks      ║
╠════╬═══════╬═══════╬═══════════════════╣
║  1 ║ David ║ Suraj ║ David likes Suraj ║
║  2 ║ David ║ John  ║ David likes John  ║
║  3 ║ John  ║ Ryan  ║ John likes Ryan   ║
╚════╩═══════╩═══════╩═══════════════════╝

Мой графический запрос, чтобы найти всех друзей Джона, будет таким:

select p1.name, p2.name [friend]
from person p1, likes l, person p2 
where p1.name = 'John' and match(p1-(l)->p2)

и это вернет приведенный ниже набор результатов

╔══════╦════════╗
║ name ║ friend ║
╠══════╬════════╣
║ John ║ Ryan   ║
╚══════╩════════╝

Проблема в том, что у нас есть все люди, которые нравятся Джону, за исключением людей, которым нравится Джон (в данном случае Дэвид). В реальном мире, если человек мне друг, я тоже ему друг, верно? Я знаю, что могу использовать union здесь, чтобы найти всех людей, которым нравится Джон, и добавить к вышесказанному. Но это ухудшит ситуацию для сценариев, в которых вы найдете друга друзей. Можем ли мы сделать это более интуитивно, используя Match или стрелки?

ожидаемый результат

+------+--------+
| Name | Friend |
+------+--------+
| John | Ryan   |
| John | David  |
+------+--------+

обновление: добавлен ожидаемый результат


person Beingnin    schedule 18.03.2020    source источник
comment
Можете ли вы показать ожидаемый результат?   -  person KumarHarsh    schedule 19.03.2020
comment
Добавлен ожидаемый результат @KumarHarsh   -  person Beingnin    schedule 19.03.2020
comment
Пожалуйста, удалите тег Sql Server, это создаст путаницу.   -  person KumarHarsh    schedule 19.03.2020
comment
Я упоминаю только сервер sql. sql server-2017 поставляется с обработкой графов   -  person Beingnin    schedule 19.03.2020


Ответы (1)


Причина, по которой вы получаете этот ответ, связана с направленным характером края.

В реальном мире, если человек мне друг, я тоже ему друг, верно?

Это зависит от домена. Например, это верно для Facebook или LinkedIn, однако это неверно для чего-то вроде Twitter, где то, что вы подписаны на меня, не означает, что я подписан на вас. Это проектное решение, которое необходимо учитывать при разработке графовой модели данных.

Я не знаком с синтаксисом SQL Graph, но вы, скорее всего, сможете обойти ребра в двух направлениях, удалив > из шага MATCH следующим образом:

select p1.name, p2.name [friend]
from person p1, likes l, person p2 
where p1.name = 'John' and match(p1-(l)-p2)

По крайней мере, так вы бы сделали это в синтаксисе сопоставления с другим графическим образцом. Если это не сработает, вам, вероятно, придется выполнить UNION.

person bechbd    schedule 18.03.2020
comment
Это не работает. Я пробовал match(p1-(l)-p2) и match(p1<-(l)->p2). оба дают синтаксическую ошибку - person Beingnin; 19.03.2020
comment
Если это так, двунаправленные обходы ребер, вероятно, не поддерживаются SQL Server Graph, поэтому вам нужно будет выполнить UNION. - person bechbd; 19.03.2020