Я пытаюсь получить всех друзей определенного человека с помощью обработки графа 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 | +------+--------+
обновление: добавлен ожидаемый результат