Перейти к основному содержимому

Введение в API OrientDB Java

· 9 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

1. Обзор

OrientDB — это технология базы данных Multi-Model NoSQL с открытым исходным кодом, предназначенная для работы с моделями Graph , Document , Key-Value , GeoSpatial и Reactive при управлении запросами с синтаксисом SQL .

В этой статье мы рассмотрим настройку и использование API Java OrientDB.

2. Установка

Во-первых, нам нужно установить бинарный пакет.

Давайте загрузим последнюю стабильную версию OrientDB ( 2.2.x на момент написания этой статьи).

Во-вторых, нам нужно разархивировать его и переместить его содержимое в удобный каталог (используя ORIENTDB_HOME ). Не забудьте добавить папку bin в переменные среды для удобного использования в командной строке.

Наконец, нам нужно отредактировать файл orientdb.sh , расположенный в $ORIENTDB_HOME/bin , заполнив местоположение ( ORIENTDB_HOME ) каталога OrientDB вместо ORIENTDB_DIR, а также системного пользователя, которого мы хотели бы использовать вместо USER_YOU_WANT_ORIENTDB_RUN_WITH .

Теперь у нас есть полностью работающая OrientDB. Мы можем использовать скрипт orientdb.sh <option> с опциями :

  • start : запустить сервер

статус : проверить статус

  • stop : остановить сервер

Обратите внимание, что для действий запуска и остановки требуется пароль пользователя (тот, который мы установили в файле orientdb.sh ).

Как только сервер будет запущен, он займет порт 2480. Поэтому мы можем получить к нему локальный доступ, используя этот URL :

./ceef8365575c771e47bbf838a855891a.png

Подробнее о ручной установке можно узнать здесь.

Примечание. Для OrientDB требуется Java версии 1.7 или выше.

Предыдущие версии доступны здесь .

3. Настройка OrientDB Java API

OrientDB позволяет разработчикам Java работать с тремя различными API, такими как:

  • Графический API — графовые базы данных
  • Document API — документно-ориентированные базы данных
  • Object API — объекты, которые напрямую привязаны к документу OrientDB.

Мы можем использовать все эти типы в рамках одной кодовой базы, просто интегрировав и используя OrientDB.

Давайте посмотрим на некоторые доступные jar-файлы, которые мы можем включить в путь к классам проекта:

  • orientdb-core-*.jar : содержит основную библиотеку
  • blueprints-core-*.jar : чтобы принести основные компоненты адаптера
  • orientdb-graphdb-*.jar : предоставляет API базы данных Graph .
  • orientdb-object-*.jar : предоставляет API базы данных объектов .
  • orientdb-distributed-*.jar : предоставляет подключаемый модуль распределенной базы данных для работы с кластером серверов.
  • orientdb-tools-*.jar : передает консольную команду
  • orientdb-client-*.jar : предоставляет удаленный клиент
  • orientdb-enterprise-*.jar : включает протокол и сетевые классы, совместно используемые клиентом и сервером.

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

Начнем с проекта Maven и используем следующие зависимости:

<dependency>
<groupId>com.orientechnologies</groupId>
<artifactId>orientdb-core</artifactId>
<version>2.2.31</version>
</dependency>
<dependency>
<groupId>com.orientechnologies</groupId>
<artifactId>orientdb-graphdb</artifactId>
<version>2.2.31</version>
</dependency>
<dependency>
<groupId>com.orientechnologies</groupId>
<artifactId>orientdb-object</artifactId>
<version>2.2.31</version>
</dependency>
<dependency>
<groupId>com.tinkerpop.blueprints</groupId>
<artifactId>blueprints-core</artifactId>
<version>2.6.0</version>
</dependency>

Пожалуйста, проверьте репозиторий Maven Central на наличие последних версий OrientDB Core , GraphDB , Object API и Blueprints-Core .

4. Использование

OrientDB использует реализацию TinkerPop Blueprints для работы с графиками.

TinkerPop — это среда вычислений графов, предоставляющая множество способов построения баз данных графов, где каждый из них имеет свои реализации:

Более того, OrientDB позволяет работать с тремя видами схем независимо от типа API:

  • Schema-Full — включен строгий режим, поэтому все поля указываются при создании класса
  • Schema-Less — классы создаются без определенного свойства, поэтому мы можем добавлять их по своему усмотрению; это режим по умолчанию
  • Schema-Hybrid — это сочетание полной схемы и схемы без схемы, где мы можем создать класс с предопределенными полями, но позволить записи определять другие настраиваемые поля.

4.1. Графический API

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

В качестве первого шага давайте воспользуемся пользовательским интерфейсом для создания базы данных Graph с именем ForEachDB с пользователем admin и паролем admin.

Как мы видим на следующем изображении, граф был выбран в качестве типа базы данных, поэтому его данные будут доступны на вкладке ГРАФИК :

./84c9349c2ab91a5b60122d22043fb935.png

Давайте теперь подключимся к нужной базе данных, зная, что ORIENTDB_HOME — это переменная среды, соответствующая папке установки OrientDB :

@BeforeClass
public static void setup() {
String orientDBFolder = System.getenv("ORIENTDB_HOME");
graph = new OrientGraphNoTx("plocal:" + orientDBFolder +
"/databases/ForEachDB", "admin", "admin");
}

Давайте запустим классы Article , Author и Editor , показав, как добавить проверку в их поля:

@BeforeClass
public static void init() {
graph.createVertexType("Article");

OrientVertexType writerType
= graph.createVertexType("Writer");
writerType.setStrictMode(true);
writerType.createProperty("firstName", OType.STRING);
// ...

OrientVertexType authorType
= graph.createVertexType("Author", "Writer");
authorType.createProperty("level", OType.INTEGER).setMax("3");

OrientVertexType editorType
= graph.createVertexType("Editor", "Writer");
editorType.createProperty("level", OType.INTEGER).setMin("3");

Vertex vEditor = graph.addVertex("class:Editor");
vEditor.setProperty("firstName", "Maxim");
// ...

Vertex vAuthor = graph.addVertex("class:Author");
vAuthor.setProperty("firstName", "Jerome");
// ...

Vertex vArticle = graph.addVertex("class:Article");
vArticle.setProperty("title", "Introduction to ...");
// ...

graph.addEdge(null, vAuthor, vEditor, "has");
graph.addEdge(null, vAuthor, vArticle, "wrote");
}

В приведенном выше фрагменте кода мы сделали простое представление нашей простой базы данных, где:

  • Статья — это класс без схемы, содержащий статьи.
  • Writer — это полный по схеме суперкласс, который содержит необходимую информацию о писателе.
  • Writer — это подтип Author , который содержит его детали .
  • Редактор — это подтип Writer без схемы , который содержит сведения о редакторе .
  • поле lastName не было заполнено в сохраненном авторе, но все еще отображается на следующем графике
  • у нас есть отношение между всеми классами: Автор может написать статью и должен иметь редактора
  • Вершина представляет объект с некоторыми полями
  • Ребро — это сущность, которая связывает две вершины.

Обратите внимание, что при попытке добавить еще одно свойство к объекту полного класса мы получим исключение OValidationException .

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

./ce133b707243efa5674bcf918ff9f198.png

Давайте посмотрим, как получить количество всех записей (вершин) базы данных:

long size = graph.countVertices();

Теперь давайте покажем только количество объектов Writer (Author & Editor) :

@Test
public void givenForEachDB_checkWeHaveTwoWriters() {
long size = graph.countVertices("Writer");

assertEquals(2, size);
}

На следующем шаге мы можем найти все данные Writer , используя следующий оператор:

Iterable<Vertex> writers = graph.getVerticesOfClass("Writer");

Наконец, давайте запросим все Editor с уровнем 7; здесь у нас есть только один, который соответствует:

@Test
public void givenForEachDB_getEditorWithLevelSeven() {
String onlyEditor = "";
for(Vertex v : graph.getVertices("Editor.level", 7)) {
onlyEditor = v.getProperty("firstName").toString();
}

assertEquals("Maxim", onlyEditor);
}

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

4.2. API документа

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

Давайте снова воспользуемся пользовательским интерфейсом, чтобы создать базу данных с именем ForEachDBTwo , но теперь с документом в качестве типа:

./f5242ce74c2c365f52843c1919c58fc4.png

Примечание. Подобным образом этот API также можно использовать в режиме полной схемы, без схемы или гибридной схемы.

Подключение к базе данных остается простым, поскольку нам просто нужно создать экземпляр объекта ODatabaseDocumentTx , предоставить URL-адрес базы данных и учетные данные пользователя базы данных:

@BeforeClass
public static void setup() {
String orientDBFolder = System.getenv("ORIENTDB_HOME");
db = new ODatabaseDocumentTx("plocal:"
+ orientDBFolder + "/databases/ForEachDBTwo")
.open("admin", "admin");
}

Начнем с сохранения простого документа, содержащего информацию об авторе .

Здесь мы видим, что класс был создан автоматически:

@Test
public void givenDB_whenSavingDocument_thenClassIsAutoCreated() {
ODocument doc = new ODocument("Author");
doc.field("name", "Paul");
doc.save();

assertEquals("Author", doc.getSchemaClass().getName());
}

Соответственно, для подсчета количества Авторов мы можем использовать:

long size = db.countClass("Author");

Давайте снова запросим документы, используя значение поля, для поиска объектов Author с уровнем 7:

@Test
public void givenDB_whenSavingAuthors_thenWeGetOnesWithLevelSeven() {
for (ODocument author : db.browseClass("Author")) author.delete();

ODocument authorOne = new ODocument("Author");
authorOne.field("firstName", "Leo");
authorOne.field("level", 7);
authorOne.save();

ODocument authorTwo = new ODocument("Author");
authorTwo.field("firstName", "Lucien");
authorTwo.field("level", 9);
authorTwo.save();

List<ODocument> result = db.query(
new OSQLSynchQuery<ODocument>("select * from Author where level = 7"));

assertEquals(1, result.size());
}

Аналогично, чтобы удалить все записи класса Author , мы можем использовать:

for (ODocument author : db.browseClass("Author")) {
author.delete();
}

На вкладке BROWSE студии OrientDB мы можем сделать запрос, чтобы получить все объекты нашего автора :

./20cf0fb71f37b9129f3f8345ab9bc74c.png

4.3. API объекта

OrientDB не имеет объектного типа базы данных. Таким образом, Object API опирается на базу данных документов.

В типе Object API все остальные концепции остаются прежними, за исключением одного дополнения — привязки к POJO.

Начнем с подключения к ForEachDBThree с помощью класса OObjectDatabaseTx :

@BeforeClass
public static void setup() {
String orientDBFolder = System.getenv("ORIENTDB_HOME");
db = new OObjectDatabaseTx("plocal:"
+ orientDBFolder + "/databases/ForEachDBThree")
.open("admin", "admin");
}

Далее, предполагая, что Author — это POJO, используемый для хранения данных Author , нам нужно зарегистрировать его:

db.getEntityManager().registerEntityClass(Author.class);

Автор имеет геттеры и сеттеры для следующих полей:

  • Имя
  • фамилия
  • уровень

Давайте создадим Author с многострочными инструкциями, если мы признали конструктор без аргументов:

Author author = db.newInstance(Author.class);
author.setFirstName("Luke");
author.setLastName("Sky");
author.setLevel(9);
db.save(author);

С другой стороны, если у нас есть другой конструктор, который принимает firstName , lastName и уровень автора соответственно, создание экземпляра будет всего одной строкой:

Author author = db.newInstance(Author.class, "Luke", "Sky", 9);
db.save(author);

Следующие строки используются для просмотра и удаления всех записей класса Author:

for (Author author : db.browseClass(Author.class)) {
db.delete(author);
}

Чтобы подсчитать всех авторов, нам просто нужно предоставить класс и экземпляр базы данных без необходимости писать SQL-запрос:

long authorsCount = db.countClass(Author.class);

Точно так же мы запрашиваем авторов с уровнем 7 следующим образом:

@Test
public void givenDB_whenSavingAuthors_thenWeGetOnesWithLevelSeven() {
for (Author author : db.browseClass(Author.class)) {
db.delete(author);
}

Author authorOne
= db.newInstance(Author.class, "Leo", "Marta", 7);
db.save(authorOne);

Author authorTwo
= db.newInstance(Author.class, "Lucien", "Aurelien", 9);
db.save(authorTwo);

List<Author> result
= db.query(new OSQLSynchQuery<Author>(
"select * from Author where level = 7"));

assertEquals(1, result.size());
}

Наконец, это официальное руководство , в котором представлены некоторые расширенные возможности использования Object API.

5. Вывод

В этой статье мы увидели, как использовать OrientDB в качестве системы управления базами данных с ее API-интерфейсами Java. Мы также узнали, как добавить проверку полей и написать несколько простых запросов.

Как всегда, исходный код этой статьи можно найти на GitHub .