Простой запрос SQL Select для сканирования всех связанных людей в социальном графе? - PullRequest
3 голосов
/ 23 августа 2011

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

UId FriendId
1   2
2   1
2   4
1   3
5   7
7   5
7   8
5   9
9   7

У нас здесь есть два подмножества людей, я говорю о SQL-запросе или процедуре, которые, если мы передадим:

Uid = 4 возвращает строки набора результатов с uid : {1, 2, 3}

или, если

Uid = 9 возвращает строки набора результатов с uid : {5, 7, 8}

Извините за мой плохой английский.

Ответы [ 3 ]

4 голосов
/ 23 августа 2011

То есть вы хотите завести всех друзей кого-либо, включая друзей n-й степени? Я не думаю, что это возможно без рекурсии.

Как вы можете это сделать, объясняется здесь: https://inviqa.com/blog/graphs-database-sql-meets-social-network

1 голос
/ 23 августа 2011

Если вы храните свои значения в списке смежности, я обнаружил, что самый простой способ его сканирования - это перевести его на язык графики и выполнить запрос.Например, если вы работали в PHP, вы можете использовать пакет Image_GraphViz .Или, если вы хотите использовать AJAX, вы можете рассмотреть cytoscapeweb .Оба работают хорошо.

В любом случае вы бы SELECT * FROM mytable и подали все записи в пакет графа как узлы.Это означает вывод их в точка или GraphML (или другой язык графики).Затем вы можете легко запросить их.

Если вы не хотите переводить набор данных, рассмотрите возможность хранения его как вложенных наборов. Вложенные множества , хотя поддерживать его немного сложно, но гораздо лучше, чем списки смежности для запросов, которые вы хотите выполнить.

0 голосов
/ 23 августа 2011

Если вы храните свои значения в списке смежности, и вы хотите n-ую степень, вы можете просто рекурсивно присоединиться к UID. Например:

Select t1.uid, t2.uid, t3.uid FROM t1 INNER JOIN t2 ON t1.uid=t2.uid INNER JOIN t3 ON t2.uid=t3.uid

Этот запрос похож на DFS с фиксированной глубиной.

...