Поддержка и совместимость графов Azure Cosmos DB для Gremlin с функциями TinkerPop

Область применения: Гремлин

Azure Cosmos DB поддерживает язык обхода графов Apache Tinkerpop, известный как Gremlin. Вы можете использовать язык Gremlin, чтобы создать сущности графа (вершины и ребра), изменить свойства в этих сущностях, выполнить запросы и обходы графа, а также удалить сущности.

Подсистема графов Azure Cosmos DB по большей части соответствует спецификации обхода графов Apache TinkerPop, но для Azure Cosmos DB характерные определенные отличия в реализации. В этой статье описано краткое пошаговое руководство по Gremlin и перечисление функций Gremlin, поддерживаемых API для Gremlin.

Совместимые клиентские библиотеки

В таблице ниже приведены распространенные драйверы Gremlin, которые вы можете использовать для базы данных Azure Cosmos DB.

Загрузка Исходный код Начало работы Поддерживаемая или рекомендуемая версия соединителя
.NET Gremlin.NET в GitHub Создание приложения Graph с помощью .NET 3.4.13
Java Документация по Gremlin для Java Создание приложения Graph с помощью Java 3.4.13
Python Gremlin-Python в GitHub Создание приложения Graph с помощью Python 3.4.13
Консоль Gremlin Документация по TinkerPop Создание приложения Graph с помощью консоли Gremlin 3.4.13
Node.js Gremlin для JavaScript в GitHub Создание приложения Graph с помощью Node.js 3.4.13
PHP Gremlin-PHP в GitHub Создание приложения Graph с помощью PHP 3.1.0
Go Lang Go Lang Эта библиотека создана внешними участниками. Команда Azure Cosmos DB не предлагает поддержку этой библиотеки и не обслуживает ее.

Примечание.

Версии драйвера клиента Gremlin для версий 3.5.*, 3.6.* имеют известные проблемы совместимости, поэтому мы рекомендуем использовать последние поддерживаемые версии драйверов 3.4.*, перечисленные выше. Эта таблица будет обновлена, когда будут решены проблемы совместимости для более новых версий драйверов.

Поддерживаемые объекты Graph

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

В таблице ниже перечислены функции TinkerPop, реализованные в базе данных Azure Cosmos DB:

Категория Реализация базы данных Azure Cosmos DB Примечания.
Функции графа Обеспечивает сохраняемость и одновременный доступ. Разработаны для поддержки транзакций. Вычислительные методы могут применяться через соединитель Spark.
Функции переменной Поддерживает логические, целые числа, байты, double, Float, Long, String Поддерживаются несложные типы. Совместимы со сложными типами через модель данных.
Функции вершины Поддерживаются RemoveVertices, MetaProperties, AddVertices, MultiProperties, StringIds, UserSuppliedIds, AddProperty, RemoveProperty. Поддерживается создание, изменение и удаление вершин.
Функции свойств вершины Поддерживаются StringIds, UserSuppliedIds, AddProperty, RemoveProperty, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues. Поддерживается создание, изменение и удаление свойств вершины.
Функции ребра AddEdges, RemoveEdges, StringIds, UserSuppliedIds, AddProperty, RemoveProperty Поддерживается создание, изменение и удаление ребра.
Функции свойств ребра Поддерживаются типы Properties, BooleanValues, ByteValues, DoubleValues, FloatValues, IntegerValues, LongValues, StringValues. Поддерживается создание, изменение и удаление свойств ребра.

Формат подключения Gremlin

При возвращении результатов операций Gremlin в Azure Cosmos DB используется формат JSON. Azure Cosmos DB сейчас поддерживает формат JSON. Например, в следующем фрагменте кода показано представление JSON вершины, возвращенной клиенту из Azure Cosmos DB.

  {
    "id": "a7111ba7-0ea1-43c9-b6b2-efc5e3aea4c0",
    "label": "person",
    "type": "vertex",
    "outE": {
      "knows": [
        {
          "id": "3ee53a60-c561-4c5e-9a9f-9c7924bc9aef",
          "inV": "04779300-1c8e-489d-9493-50fd1325a658"
        },
        {
          "id": "21984248-ee9e-43a8-a7f6-30642bc14609",
          "inV": "a8e3e741-2ef7-4c01-b7c8-199f8e43e3bc"
        }
      ]
    },
    "properties": {
      "firstName": [
        {
          "value": "Thomas"
        }
      ],
      "lastName": [
        {
          "value": "Andersen"
        }
      ],
      "age": [
        {
          "value": 45
        }
      ]
    }
  }

Свойства вершин, используемые в формате JSON, описаны ниже:

Свойство Description
id Идентификатор вершины. Должен иметь уникальное значение (если применимо — со значением _partition). Если значение не указано, оно будет предоставляться автоматически с помощью идентификатора GUID.
label Метка вершины. Это свойство используется для описания типа сущности.
type Используется для отделения вершин от документов, не связанных с графом.
properties Набор определенных пользователем свойств, связанных с вершиной. Каждое свойство может иметь несколько значений.
_partition Ключ секции вершины. Используется для секционирования данных графа.
outE Это свойство содержит список внешних ребер вершины. Хранение смежных сведений с помощью вершины обеспечивает быстрое выполнение обхода графов. Ребра сгруппированы на основе меток.

Каждое свойство может хранить несколько значений в массиве.

Свойство Description
value Значение свойства

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

Свойство Description
id Идентификатор ребра. Должен иметь уникальное значение (если применимо — со значением _partition).
label Метка ребра. Это свойство является необязательным и используется для описания типа связи.
inV Это свойство содержит список внутренних вершин для ребра. Хранение смежных сведений с помощью ребра обеспечивает быстрое выполнение обхода графов. Вершины сгруппированы на основе меток.
properties Набор определенных пользователем свойств, связанных с ребром.

Шаги Gremlin

Теперь рассмотрим шаги Gremlin, поддерживаемые базой данных Azure Cosmos DB. Дополнительные сведения о Gremlin см. в руководстве по TinkerPop.

step Description Руководство по TinkerPop 3.2
addE Добавляет ребро между двумя вершинами. Шаг addE
addV Добавляет вершину в граф. Шаг addV
and Обеспечивает возвращение значения для всех обходов. Шаг and
as Модулятор шага для назначения переменной выходным данным шага. Шаг as
by Модулятор шага, используемый с group и order. Шаг by
coalesce Возвращает первый обход, который возвращает результат. Шаг coalesce
constant Возвращает постоянное значение. Используется с coalesce. Шаг constant
count Возвращает число из обхода. Шаг count
dedup Возвращает значения с удаленными повторяющимися значениями. Шаг dedup
drop Удаляет значения (вершины или ребра). Шаг drop
executionProfile Создает описание всех операций, формируемых выполненным шагом Gremlin Шаг executionProfile
fold Действует как барьер, который вычисляет статистическое значение результатов. Шаг fold
group Группирует значения на основе указанных меток. Шаг group
has Используется для фильтрации свойств, вершин и ребер. Поддерживает варианты hasLabel, hasId, hasNot и has. Шаг has
inject Вставляет значения в поток. Шаг inject
is Используется для выполнения фильтра с помощью логического выражения. Шаг is
limit Используется для ограничения числа элементов в обходе. Шаг limit
local Локально обертывает раздел обхода аналогично вложенному запросу. Шаг local
not Используется для создания отрицания фильтра. Шаг not
optional Возвращает результат указанного обхода, если он выдается. В противном случае возвращается вызывающий элемент. Шаг optional
or Гарантирует, что по крайней мере один из обходов возвращает значение. Шаг or
order Возвращает результаты в заданном порядке сортировки. Шаг order
path Возвращает полный путь обхода. Шаг path
project Выполняет проекцию свойств в виде сопоставления. Шаг project
properties Возвращает свойства для указанных меток. Шаг properties
range Выполняет фильтрацию до заданного диапазона значений. Шаг range
repeat Повторяет шаг указанное количество раз. Используется для циклов. Шаг repeat
sample Используется для вывода примеров результатов из обхода. Шаг sample
select Используется для проектирования результатов из обхода. Шаг select
store Используется для статистических функций из обхода без блокировки. Шаг store
TextP.startingWith(string) Функция фильтрации строк. Эта функция используется в качестве предиката для шага has() для сопоставления свойства, начинающегося с определенной строки. Предикаты TextP
TextP.endingWith(string) Функция фильтрации строк. Эта функция используется в качестве предиката для шага has() для сопоставления свойства, заканчивающегося определенной строкой. Предикаты TextP
TextP.containing(string) Функция фильтрации строк. Эта функция используется в качестве предиката для шага has() для сопоставления свойства, содержащего определенную строку. Предикаты TextP
TextP.notStartingWith(string) Функция фильтрации строк. Эта функция используется в качестве предиката для шага has() для сопоставления свойства, не начинающегося с определенной строки. Предикаты TextP
TextP.notEndingWith(string) Функция фильтрации строк. Эта функция используется в качестве предиката для шага has() для сопоставления свойства, не заканчивающегося определенной строкой. Предикаты TextP
TextP.notContaining(string) Функция фильтрации строк. Эта функция используется в качестве предиката для шага has() для сопоставления свойства, не содержащего определенную строку. Предикаты TextP
tree Выполняет статистическое вычисление путей из вершины в дерево. Шаг tree
unfold Развертывает итератор. Шаг unfold
union Объединяет результаты из нескольких обходов. Шаг union
V Содержит шаги, необходимые для обходов между вершинами и ребрами (V, E, out, in, both, outE, inE, bothE, outV, inV, bothV) и otherV — для других вершин. Шаги vertex
where Используется для фильтрации результатов из обхода. Поддерживает операторы eq, neq, lt, lte, gt, gte и between. Шаг where

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

Отличия в поведении

  • Подсистема графов Azure Cosmos DB выполняет обход балансировки нагрузки в ширину, а Gremlin для TinkerPop — в глубину. Это поведение обеспечивает более высокую производительность в горизонтально масштабируемой системе, такой как Azure Cosmos DB.

Неподдерживаемые функции

  • Gremlin Bytecode — это независимая от языка спецификация для обходов графа. Azure Cosmos DB Graph пока не поддерживает его. Используйте GremlinClient.SubmitAsync() и передавайте обход как текстовую строку.

  • кратность набора property(set, 'xyz', 1) сегодня не поддерживается. Вместо этого используйте property(list, 'xyz', 1). Дополнительные сведения см. в разделе "Свойства вершин" в документации TinkerPop.

  • Шаг match() в настоящее время недоступен. Этот шаг предоставляет возможности декларативного запроса.

  • Объекты как свойства не поддерживаются для вершин и ребер. Как свойства могут использоваться только примитивные типы или массивы.

  • Сортировка по свойствам массива order().by(<array property>) не поддерживается. Сортировка поддерживается только для примитивных типов.

  • Непримитивные типы JSON не поддерживаются. Используйте типы string, number или true/false. Значения null не поддерживаются.

  • Сериализатор GraphSONv3 настоящее время не поддерживается. Используйте классы GraphSONv2 для сериализаторов, модулей чтения и модулей записи в конфигурации подключения. Результаты, возвращаемые Azure Cosmos DB для Gremlin, не имеют того же формата, что и формат GraphSON.

  • Лямбда-выражения и функции в настоящее время не поддерживаются. К ним относятся функции .map{<expression>}, .by{<expression>} и .filter{<expression>}. Дополнительные сведения о них и о том, как переписать их с помощью шагов Gremlin, см. в примечании о лямбда-выражениях.

  • Транзакции не поддерживаются из-за распределенного характера системы. Настройте соответствующую модель согласованности для учетной записи Gremlin, чтобы она "считывала ваши собственные записи", и используйте оптимистическую блокировку для разрешения конфликтов операций записи.

Известные ограничения

  • Использование индексов для запросов Gremlin с шагами обхода на середине .V(). В настоящее время индекс будет использоваться только при первом вызове .V() в обходе для разрешения всех фильтров или подключенных к нему предикатов. При последующих вызовах индекс не применяется, что может увеличить задержку и расходы на запрос.

При использовании индексирования по умолчанию типичный запрос Gremlin на чтение, начинающийся с шага .V(), будет использовать для оптимизации затрат на запрос и производительности его выполнения параметры в связанных с ним шагах фильтрации, например .has() или .where(). Например:

g.V().has('category', 'A')

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

g.V().has('category', 'A').as('a').V().has('category', 'B').as('b').select('a', 'b')

Этот запрос возвращает две группы вершин на основе их свойства с именем category. В этом случае для разрешения вершин на основе значений их свойств индекс будет использовать только при первом вызове g.V().has('category', 'A').

В качестве обходного пути для этого запроса можно использовать шаги промежуточного обхода, такие как .map() и union(). Соответствующий пример приведен ниже.

// Query workaround using .map()
g.V().has('category', 'A').as('a').map(__.V().has('category', 'B')).as('b').select('a','b')

// Query workaround using .union()
g.V().has('category', 'A').fold().union(unfold(), __.V().has('category', 'B'))

Производительность запросов можно проверить с помощью шага Gremlin executionProfile().

Следующие шаги