Published on

September 9, 2019

Изучение функции кратчайшего пути в SQL Server

Вы когда-нибудь задумывались о том, как найти кратчайшее расстояние между двумя точками в графовой базе данных? Функция “Кратчайший путь” в SQL Server позволяет вам сделать это. В этой статье мы рассмотрим концепцию кратчайшего пути и исследуем его различные варианты использования.

Давайте начнем с простого примера. Представьте, что у вас есть база данных фильмов, и вы хотите найти кратчайший путь между двумя актерами, Амришем Пури и Харрисоном Фордом. Амриш хочет встретиться с Харрисоном Фордом, но они не снимались вместе. Однако у них могут быть общие связи – люди, которые их знают или люди, которые знают людей, которые их знают. В этом случае функция кратчайшего пути пригодится.

Аналогично тому, как вы бы использовали LinkedIn для поиска связей в своей сети, функция кратчайшего пути в SQL Server позволяет найти кратчайший путь между двумя узлами в графовой базе данных. Это может быть полезно в различных сценариях:

  1. Поиск пути к человеку, к которому вы хотите получить доступ из большой организационной структуры.
  2. Поиск связей между конкретными таблицами в ER-диаграмме.
  3. Поиск связей между ресурсами в графовой модели центра обработки данных.
  4. Поиск ближайшего магазина к клиенту или другим географическим приложениям.
  5. Исследование отношений между персонажами в сложном романе.

Давайте рассмотрим пример, используя базу данных фильмов. Следующий SQL-запрос иллюстрирует связи от Харрисона Форда со всеми другими актерами в базе данных:

SELECT STRING_AGG(toActor.PersonName, '->') WITHIN GROUP (GRAPH PATH) AS FriendConnections, 
       LAST_VALUE(toActor.PersonName) WITHIN GROUP (GRAPH PATH) AS FriendName, 
       COUNT(toActor.PersonName) WITHIN GROUP (GRAPH PATH) AS levels 
FROM PersonNode AS fromActor, CoActorLink FOR PATH AS f, PersonNode FOR PATH AS toActor 
WHERE MATCH(SHORTEST_PATH((toActor<-(f)-)+fromActor)) 
      AND fromActor.PersonName = 'Harrison Ford'

Результаты этого запроса показывают, насколько далеко каждый человек находится от Харрисона Форда, а также людей на пути, если они находятся на расстоянии более одного уровня. Мы можем дополнительно отфильтровать результаты, чтобы найти только людей, находящихся на расстоянии одного шага или двух уровней.

Если мы хотим найти связи между двумя конкретными людьми, мы можем изменить запрос следующим образом:

SELECT PersonName, Friends, levels 
FROM (
    SELECT Person1.Personname AS PersonName, 
           STRING_AGG(Person2.Personname, '->') WITHIN GROUP (GRAPH PATH) AS Friends, 
           COUNT(Person2.Personname) WITHIN GROUP (GRAPH PATH) AS levels 
    FROM PersonNode AS Person1, CoActorLink FOR PATH AS fo, PersonNode FOR PATH AS Person2 
    WHERE MATCH(SHORTEST_PATH(Person1(-(fo)->Person2){1,3})) 
          AND Person1.Personname = 'Harrison Ford'
) Q 
WHERE Q.levels = 1

Этот запрос вернет связи между Харрисоном Фордом и другим конкретным человеком, а также количество уровней между ними.

Функция кратчайшего пути в SQL Server открывает мир возможностей для анализа и исследования отношений в графовых базах данных. Независимо от того, работаете ли вы с организационными структурами, ER-диаграммами, моделями центров обработки данных или даже сложными романами, функция кратчайшего пути может помочь вам обнаружить ценные идеи.

В будущих публикациях мы рассмотрим более конкретные примеры использования этой функции в повседневных сценариях. Следите за обновлениями!

Click to rate this post!
[Total: 0 Average: 0]

Let's work together

Send us a message or book free introductory meeting with us using button below.