В самом сердце Opencepher пункт Match позволяет вам указать простые шаблоны запросов для извлечения отношений из базы данных графиков. Паттерн с переменной длиной обычно используется для описания путей, и это первая попытка графика туманности, совместимая с NGQL с Opencepher в пункте матча.
Как видно из предыдущих статей этой серии, план исполнения состоит из физических операторов. Каждый оператор отвечает за выполнение уникальной вычислительной логики. Для реализации пункта матча, такие операторы, как Getneighbors, Getvertices, Join, Project, Filter и Loop, которые были представлены в предыдущих статьях, необходимы. В отличие от структуры дерева в реляционной базе данных, процесс выполнения, выраженный планом выполнения в графике туманности, является циклическим графом. Как преобразовать шаблон с переменной длиной в физический план на графике туманности находится в центре внимания планировщика. В этой статье мы представим, как сопоставление шаблонов с переменной длиной реализовано на графике туманности.
Анализ проблем
Шаблон с фиксированной длиной
В предложении соответствия шаблон с фиксированной длиной обычно используется для поиска отношений. Если шаблон с фиксированной длиной считается особым случаем шаблона переменной длины, то есть шаблон, описывающий путь указанной длины, реализации обоих могут быть объединены. Вот примеры.
// Fixed-length pattern MATCH (v)-[e]-(v2) // Variable-length pattern MATCH (v)-[e*1..1]-(v2)
Предыдущие примеры отличаются друг от друга в типе переменной E. В шаблоне фиксированной длины E представляет край, в то время как в первой длине E E представляет список краев длины 1.
Подключение шаблонов переменной длины
В соответствии с синтаксисом Opencepher, пункт о соответствии позволяет вам указать комбинацию различных закономерностей для описания сложных путей. Например, два шаблона переменной длины могут быть подключены следующим образом.
MATCH (v)-[e*1..3]-(v2)-[ee*2..4]-(v3)
Комбинация шаблона в предыдущем примере расширяется, что означает, что, подключая шаблоны переменной длины и фиксированной длины по-разному, могут быть запрошены различные сложные пути. Поэтому мы должны найти шаблон для создания плана выполнения для повторного итерации всего процесса. Следующие условия должны быть рассмотрены:
Следующий путь переменной длины зависит от предыдущего. Переменные в следующей шаблоне зависят от предыдущего шаблона. Перед следующим шагом прохождения начальная вершина должна быть депутата. Из следующего примера вы можете видеть, что до тех пор, пока план выполнения может быть сгенерирован для части ()-[: как*m..n]-комбинации и итерации могут применяться для создания планов для последующих частей.
()-[:like*m..n]- ()-[:like*k..l]- () \____________/ \____________/ \_/ Pattern1 Pattern2 Pattern3
План исполнения
В этом разделе мы представим, как ()-[: как*м .. N]- Часть в предыдущем примере преобразуется в план физического выполнения на графике туманности. Этот шаблон описывает график минимума M Hops и максимум n -хмеля. На графике туманности оператор getneighbors завершается одноэтапное обход. Чтобы реализовать многоэтапный обход, каждый шаг обхода должен снова вызвать оператора Getneighbors на основе предыдущего шага, и когда обход всех шагов завершен единственный путь. Пользователи нуждаются в пути отношений M- N. Однако в процессе выполнения пути длины 1 к длине N запрашиваются и хранятся для выхода или для следующего обхода, но только пути длины M до N получены.
Один шаг обход
Давайте посмотрим, как выглядит одностадийный обход. На графике туманности исходная вершина хранится вместе с исходящими краями, поэтому их получение не нужно доступа к данным по разделам. Тем не менее, вершина назначения и его входящие края хранятся в разных разделах, поэтому для извлечения свойств вершины необходимы getVertices. Кроме того, чтобы избежать повторного сканирования хранения, вершины источника должны быть разбиты перед обходом. План выполнения одноэтапного обхода показан следующим образом.
Многоэтапный обход
Процесс многоэтапного обхода-это повторение одноэтапного обхода. Тем не менее, мы видим, что оператор getneighbors может получить свойства вершины исходного края, поэтому оператор Getvertices может быть опущен на предыдущем шаге. Вот план исполнения двухэтапного обхода.
Хранение путей
Пути, полученные в каждом этапе обхода, могут потребоваться в конце обходов, поэтому все пути должны храниться. Пути для двухэтапного обхода связаны оператором соединения. В результате примера ()-[e: like*m..n]-, E представляет список данных (ребра), поэтому необходим объединение для объединения результатов каждого шага обхода. План выполнения будет развиваться дальше следующим образом.
Подключение шаблонов переменной длины
После реализации предыдущего процесса будет сгенерирован физический план для ()- [E: Like*M..N]- шаблона. Если несколько аналогичных шаблонов соединены, такой процесс итерация. Однако до итерации результаты предыдущего процесса должны быть отфильтрованы, чтобы получить пути длины М до длины n. Полученный набор данных предыдущего процесса включает в себя пути длины 1 к длине n, поэтому необходимо фильтрация их по длине пути. Когда шаблоны переменной длины соединены вместе, план выполнения становится следующим.
После пошагового разложения шаблонов ожидаемый план выполнения для предложения матча наконец-то генерируется. Как вы можете видеть, требуется много усилий, чтобы преобразовать сложный рисунок в основные интерфейсы для обезвреживания. Конечно, план выполнения может быть оптимизирован, например, многоэтапный обход может быть инкапсулирован с использованием оператора петли, и подпланирование одноэтапного обхода может быть повторно использовано, что не будет подробно описано в этой статье. Если вы заинтересованы, пожалуйста, обратитесь к исходный код туманности график Анкет
Резюме
Эта статья продемонстрировала процесс создания плана выполнения для пункта соответствия с шаблоном с переменной длиной. Читая статью, у вас может быть этот вопрос: почему такой основной и простой запрос пути будет генерировать такой сложный план выполнения на графике туманности? Это не похоже на NEO4J, где нужно только несколько операторов для выполнения той же работы. На графике туманности генерируются сложные направленные ациклические графики (DAG).
Ответ заключается в том, что на графике туманности операторы ближе к базовым интерфейсам, и не хватает семантических абстракций для операций с графиками более высокого уровня. Гранулярность оператора слишком хороша, поэтому необходимо учитывать слишком много деталей для реализации оптимизации верхнего уровня. Мы также будем изучать операторов исполнения, чтобы постепенно улучшить функциональность и производительность пункта матча.
Если вы столкнетесь с какими -либо проблемами в процессе использования графика туманности, пожалуйста, обратитесь к Руководству по базе данных графика туманности, чтобы устранить задачу. Он подробно записывает точки знаний и конкретное использование базы данных графиков и график туманности базы данных графиков.
Оригинал: «https://dev.to/lisahui/nebula-graph-how-variable-length-pattern-matching-is-implemented-1pb5»