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 :
Подробнее о ручной установке можно узнать здесь.
Примечание. Для 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.
Как мы видим на следующем изображении, граф
был выбран в качестве типа базы данных, поэтому его данные будут доступны на вкладке ГРАФИК
:
Давайте теперь подключимся к нужной базе данных, зная, что 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 мы увидим графическое представление наших данных:
Давайте посмотрим, как получить количество всех записей (вершин) базы данных:
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
, но теперь с документом в качестве типа:
Примечание. Подобным образом этот 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 мы можем сделать запрос, чтобы получить все объекты нашего автора :
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 .