Поддержка и совместимость графов 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()
.
Следующие шаги
- Создайте приложение графа с использованием пакетов SDK.
- Дополнительные сведения о поддержке графа в Azure Cosmos DB