Получите ненаправленные данные в SQL серверной графической базе данных - PullRequest
1 голос
/ 18 марта 2020

Я пытаюсь получить всех друзей определенного человека, используя SQL Обработка серверного графика

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 здесь, чтобы найти всех людей, которые любят Джона, и добавить к вышесказанному. Но это сделает худший случай для сценария ios, где найти друга друзей. Можем ли мы сделать это более интуитивно с помощью Match или стрелок

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

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

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

1 Ответ

1 голос
/ 18 марта 2020

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...