Поделиться через


Шаблоны графов GQL

Замечание

Эта функция сейчас доступна в общедоступной предварительной версии. Эта предварительная версия предоставляется без соглашения на уровне обслуживания и не рекомендуется для рабочих нагрузок. Некоторые функции могут не поддерживаться или их возможности могут быть ограничены. Для получения дополнительной информации см. Дополнительные условия использования для предварительных версий Microsoft Azure.

Шаблоны графов — это основные стандартные блоки запросов GQL. Они описывают структуры, которые вы ищете в графе с помощью узлов и ребер интуитивно понятным визуальным способом. Думайте о шаблонах графов как шаблонах, которые обработчик запросов пытается сопоставить с фактическими данными в графе.

Это важно

В этой статье исключительно используется пример графа социальных сетей.

Простые шаблоны элементов

Простые шаблоны элементов помогают соответствовать отдельным узлам и краям из графа, которые соответствуют определенным требованиям. Эти шаблоны формируют основу для более сложного сопоставления шаблонов.

Простые шаблоны узлов

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

(:City { name: "New York" })

Этот шаблон соответствует всем узлам, имеющим как метки, такPlace и City метки (указанные оператором & ) и свойства которых name равны "New York". Эта спецификация обязательных меток и свойств называется заливкой шаблона узла.

Основные понятия:

  • Сопоставление меток: требуется & несколько меток.
  • Фильтрация свойств: укажите точные значения, которые должны соответствовать свойствам.
  • Гибкое сопоставление ("ковариантное") — соответствующие узлы могут иметь больше меток и свойств за пределами указанных.

Замечание

Модели графов с несколькими метками элементов пока не поддерживаются (известная проблема).

Простые шаблоны ребер

Шаблоны пограничных вычислений являются более сложными, чем шаблоны узлов. Они не только указывают заливку, но и подключают шаблон исходного узла к шаблону целевого узла. Шаблоны пограничных вычислений описывают требования как к краю, так и к конечным точкам:

(:Person)-[:likes|knows { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]->(:Comment)

Направление -[...]-> со стрелками (:Person) важно— оно определяется как шаблон исходного узла и (:Comment) в качестве шаблона целевого узла. Понимание направления пограничных вычислений имеет решающее значение для правильного запроса графа.

Эквивалентный зеркальный шаблон:

Вы можете перевернуть стрелку и переключить шаблоны узлов, чтобы создать эквивалентный зеркальный граничный шаблон:

(:Comment)<-[:likes { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]-(:Person)

Этот шаблон находит те же отношения, но с противоположной точки зрения.

Шаблоны ребер, направленные на любой адрес

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

(:Song)-[:inspired]-(:Movie)

Этот шаблон соответствует тем же краям, что (:Song)-[:inspired]->(:Movie) и (:Movie)-[:inspired]->(:Song) объединенные, независимо от того, какой узел является источником и который является назначением (этот пример не относится к типу графа социальных сетей).

Ярлыки шаблонов пограничных вычислений графа

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

  • ()->() ()-[]->() означает (направленный край с любой меткой)
  • ()<-() ()<-[]-() означает (направленный край в обратном направлении с любой меткой)
  • ()-() ()-[]-() означает (любой направленный край с любой меткой)

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

Выражения меток

Шаблоны могут выражать сложные требования к меткам соответствующих узлов и ребер.

Example:

MATCH (:Person|(Organization&!Company))-[:isLocatedIn]->(p:City|Country)
RETURN count(*) AS num_matches

Это подсчитывает количество isLocatedIn ребер, подключающих Person узлы или Organizationузлы ,но неCompany - (которые всегда University являются узлами в схеме социальной сети) к City узлам или Country узлам.

Синтаксис

Синтаксис Meaning
A&B Метки должны включать как A, так и B.
A|B Метки должны включать по крайней мере одну из A или B.
!A Метки должны исключить A.

Кроме того, используйте скобки для управления порядком оценки выражений меток. По умолчанию ! имеет самый высокий приоритет и & имеет более высокий приоритет, чем |. Таким образом !A&B|C|!D , это то же самое, что ((!A)&B)|C|(!D)и .

Переменные привязки

Переменные позволяют ссылаться на соответствующие элементы графа в других частях запроса. Понимание того, как привязать и использовать переменные, важно для создания мощных запросов.

Переменные элемента привязки

Шаблоны узлов и ребер могут привязать соответствующие узлы и края к переменным для последующей ссылки.

(p:Person)-[w:workAt]->(c:Company)

В этом шаблоне p привязаны к соответствующим Person узлам, w к соответствующим workAt краям и c к соответствующим Company узлам.

Повторное использование переменной для структурных ограничений:

Повторное использование одной и той же переменной в шаблоне несколько раз выражает ограничение на структуру совпадений. Каждое вхождение одной переменной всегда должно быть привязано к одному элементу графа в допустимом совпадении. Повторное использование переменных является мощным для выражения сложных структурных требований.

(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)

Шаблон находит Person узлы x и y знает друг друга и работает в том же Companyрежиме, который привязан к переменной c. Повторное использование c гарантирует, что оба человека работают в одной компании.

Предикаты шаблона с переменными элемента:

Переменные элемента привязки позволяют указывать предикаты узлов и пограничных шаблонов. Вместо того, чтобы просто предоставить заливку с точными значениями свойств, например { name: "New York, USA" }, заливщик может указать предикат, который вычисляется для каждого элемента кандидата. Шаблон совпадает только в том случае, если предикат оценивается следующим способом TRUE:

(p:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T18:00:00Z")]-(o:Person)

Шаблон края находит людей, которые знали друг друга с 1 января 2000 года, используя гибкое условие, а не точное совпадение.

Замечание

Переменные шаблонов пограничных вычислений всегда привязываются к отдельному краю в предикате граничного шаблона, даже при использовании шаблонов переменной длины. Это может помочь не указать переменные списка пограничных групп для выполнения после фильтрации. См. раздел "Привязка переменных длины" для пограничных переменных шаблона.

Дополнительные методы предиката шаблонов:

Предикаты шаблонов предоставляют мощные встроенные возможности фильтрации, которые могут улучшить удобочитаемость запросов:

-- Multiple conditions in node predicates
MATCH (p:Person WHERE p.age > 30 AND p.department = 'Engineering')
      -[:workAt]->
      (c:Company WHERE c.revenue > 1000000 AND c.location = 'Seattle')

-- Complex edge predicates with calculations
MATCH (p1:Person)-[w:workAt WHERE w.start_date < ZONED_DATETIME('2020-01-01T00:00:00Z') 
                              AND w.salary > 75000]-(c:Company)

-- MATCH WHERE: evaluated after pattern matching
MATCH (p:Person)-[:workAt]->(c:Company)
WHERE p.active = TRUE AND c.public = TRUE

-- Filter during matching and after
MATCH (p:Person WHERE p.department = 'Sales')-[:workAt]->(c:Company)
WHERE p.quota_achievement > 1.2 AND c.revenue > c.revenue_target

Подсказка

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

Переменные пути привязки

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

p=(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)

p Здесь привязано к значению пути, представляющего полную структуру сопоставленного пути, включая ссылочные значения для всех узлов и ребер в указанном порядке.

Связанные пути могут быть либо возвращены пользователю, либо дополнительно обработаны с помощью функций, таких как NODES или EDGES:

MATCH p=(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)
LET path_edges = edges(p)
RETURN path_edges, size(path_edges) AS num_edges
GROUP BY path_edges

Создание шаблонов

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

Создание шаблонов пути

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

(:Person)-[:knows]->(:Person)-[:workAt]->(:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)

Шаблон проходит от человека через свои социальные и профессиональные связи, чтобы найти, где находится компания своего коллеги.

Кусковая конструкция шаблона: Вы также можете создавать шаблоны путей более постепенно, что позволяет упростить чтение и понимание сложных шаблонов:

(:Person)-[:knows]->(p:Person),
(p:Person)-[:workAt]->(c:Company),
(c:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)

Этот подход разбивает один и тот же обход на логические шаги, что упрощает понимание и отладку.

Создание нелинейных шаблонов

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

(p:Person),
(p)-[:studyAt]->(u:University),
(p)-[:workAt]->(c:Company),
(p)-[:likes]-(m)

Шаблон находит человека вместе с их обучением, трудоустройством и предпочтениями содержимого одновременно — комплексный запрос профиля.

Совпадение следов

В сложных шаблонах часто нежелательно проходить один и тот же край несколько раз. Повторное использование края становится важным, когда фактический граф содержит циклы, которые могут привести к бесконечным или чрезмерно длинным путям. Для повторного использования пограничных вычислений TRAIL граф в Microsoft Fabric поддерживает режим сопоставления.

Префикс шаблона пути с ключевым словом TRAIL удаляет все совпадения, которые привязывают один и тот же край несколько раз:

TRAIL (a)-[e1:knows]->(b)-[e2:knows]->(c)-[e3:knows]->(d)

С помощью TRAILшаблона создаются только совпадения, в которых все края отличаются. Таким образом, даже если c = a путь формирует цикл в заданном совпадении, e3 никогда не привязывается к тому же краю, что e1и .

Этот TRAIL режим необходим для предотвращения бесконечных циклов и обеспечения возврата запросов значимых, нередундированных путей.

Использование шаблонов переменной длины

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

Ограниченные шаблоны переменной длины

Это важно

Ограничивающие шаблоны переменной длины в настоящее время поддерживают только максимальную верхнюю границу 8. См. статью о текущих ограничениях.

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

(:Person)-[:knows]->(:Person)-[:knows]->(:Person)-[:knows]->(:Person)

Вы можете использовать более краткий синтаксис переменной длины:

(:Person)-[:knows]->{3}(:Person)

Указывает {3} , что граничный -[:knows]-> шаблон должен повторяться ровно три раза.

Гибкие диапазоны повторений: Для повышения гибкости можно указать нижнюю границу, так и верхнюю границу для повторения:

(:Person)-[:knows]->{1, 3}(:Person)

Этот шаблон находит прямых друзей, друзей и друзей-друзей всех в одном запросе.

Замечание

Нижняя граница также может быть 0. В этом случае границы не совпадают, и весь шаблон совпадает только в том случае, если два шаблона узла конечной точки соответствуют одному узлу.

Пример:

(p1:Person)-[r:knows WHERE NOT p1=p2]->{0,1}(p2:Person)

Этот паттерн сочетает пары разных людей, которые знают друг друга, но при этом совпадают с одним и тем же человеком — p1p2 даже если этот человек сам себя не «знает».

Если нижнюю границу не задано, обычно значение по умолчанию равно 0 (ноль).

Комплексные композиции переменной длины: Паттерны переменной длины могут быть частью более крупных и сложных паттернов, как в следующем запросе:

MATCH (c1:Comment)<-[:likes]-(p1:Person)-[:knows]-(p2:Person)-[:likes]->(c2:Comment),
      (c1:Comment)<-[:replyOf]-{1,3}(m)-[:replyOf]->{1,3}(c2:Comment)
RETURN *
LIMIT 100

Шаблон находит пары комментариев, где люди, которые знают друг друга, любили разные комментарии, и эти комментарии связаны через цепочки ответов 1-5 уровней каждый.

Привязка переменных шаблоны граничных переменных длины

При привязке шаблона края переменной длины значение и тип переменной граничной переменной изменяются в зависимости от контекста ссылки. Понимание этого поведения имеет решающее значение для правильной обработки совпадений переменной длины:

Две степени ссылки:

  • Внутри шаблона переменной длины: пограничные переменные графа привязываются к каждому отдельному краю вдоль соответствующего пути (также называемой "однотонной степенью ссылки")
  • Вне шаблона переменной длины: пограничные переменные графа привязываются ко последовательности всех ребер вдоль соответствующего пути (также называется "степенью ссылки группы")

Пример демонстрации обоих контекстов:

MATCH (:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")]->{1,3}()
RETURN e[0]
LIMIT 100

Оценка пограничной переменной e выполняется в двух контекстах:

  • MATCH В заявлении: Запрос находит цепочки друзей-друзей, где каждая дружба была создана с 2000 года. Во время сопоставления шаблонов предикат e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z") граничного шаблона вычисляется один раз для каждого края кандидата. В этом контексте e привязано к одному граничной ссылке.

  • В инструкцииRETURN: здесь e привязан список ссылочных значений edge (group) в порядке, который они происходят в соответствующей цепочке. Результатом e[0] является первое значение ссылки на ребра в каждой соответствующей цепочке.

Переменные ребер узора переменной длины в горизонтальной агрегации:

Реберные переменные, ограниченные сопоставлением узоров с переменной длиной, являются групповыми списками вне схемы переменной длины и, следовательно, могут использоваться в горизонтальной агрегации.

MATCH (a:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")]->{1,3}(b)
RETURN a, b, size(e) AS num_edges
LIMIT 100

См. раздел о горизонтальной агрегации для получения дополнительной информации.