Введение в API Java OrientDB
1. обзор
2. Монтаж
Во-первых, нам нужно установить бинарный пакет.
Во-вторых, нам нужно разархивировать его и переместить его содержимое в удобный каталог (используяORIENTDB_HOME). Не забудьте добавить папкуbin в переменные среды для удобного использования командной строки.
Наконец, нам нужно отредактировать файлorientdb.sh, расположенный в$ORIENTDB_HOME/bin, заполнив местоположение (ORIENTDB_HOME) каталога OrientDB вместо[.s1]#ORIENTDB_DIR #and also the system user we’d like to use instead of USER_YOU_WANT_ORIENTDB_RUN_WITH.
Теперь у нас есть полностью рабочий OrientDB. Мы можем использоватьorientdb.sh <option> script with options:
-
start: для запуска сервера
-
status: проверить статус
-
stop: остановить сервер
Обратите внимание, что для действийstart иstop требуется пароль пользователя (тот, который мы установили в файлеorientdb.sh).
После запуска сервер займет порт 2480. Поэтому мы можем получить к нему доступ локально, используя этотURL:
Более подробную информацию о ручной установке можно найтиhere.
Примечание. OrientDB требуетJava версии 1.7 или выше.
Доступны предыдущие версииhere.
3. Настройка Java API OrientDB
OrientDB позволяет разработчикам Java работать с тремя различными API, такими как:
-
Graph 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 и будем использовать следующие зависимости:
com.orientechnologies
orientdb-core
2.2.31
com.orientechnologies
orientdb-graphdb
2.2.31
com.orientechnologies
orientdb-object
2.2.31
com.tinkerpop.blueprints
blueprints-core
2.6.0
Пожалуйста, проверьте репозиторий Maven Central на наличие последних версий API OrientDBCore,GraphDB,Object иBlueprints-Core.
4. использование
OrientDB использует реализациюTinkerPop Blueprints для работы с графами.
TinkerPop - это Graph Computing Framework, предоставляющая множество способов построения графовых баз данных, каждая из которых имеет свои реализации:
Более того, OrientDB позволяет работать с тремя видамиSchemas независимо от типа API:
-
Schema-Full - строгий режим включен, поэтому все поля указываются при создании класса
-
Schema-Less - классы создаются без определенного свойства, поэтому мы можем добавлять их по своему усмотрению; it’s the default modeс
-
Schema-Hybrid - это сочетание полной схемы и схемы без схемы, где мы можем создать класс с предопределенными полями, но позволить записи определять другие настраиваемые поля.
4.1. График API
Поскольку это база данных на основе графов, данные представлены в виде сети, содержащейVertices (узлов), соединенных между собойEdges (дуги).
В качестве первого шага давайте с помощью пользовательского интерфейса создадим базу данных Graph с именемexampleDB с пользователемadmin и паролемadmin..
Как мы видим на следующем изображении,graph был выбран в качестве типа базы данных, поэтому его данные будут доступны вGRAPH Tab:
Теперь давайте подключимся к нужной базе данных, зная, чтоORIENTDB_HOME - это переменная среды, которая соответствует папке установкиOrientDB:
@BeforeClass
public static void setup() {
String orientDBFolder = System.getenv("ORIENTDB_HOME");
graph = new OrientGraphNoTx("plocal:" + orientDBFolder +
"/databases/exampleDB", "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");
}
В приведенном выше фрагменте кода мы сделали простое представление нашей простой базы данных, где:
-
Article - это класс без схемы, содержащий статьи
-
Writer - это суперкласс с полной схемой, который содержит необходимую информацию о писателе.
-
Writer - это подтипAuthor, который содержит его детали
-
Editor - это подтипWriter без схемы, содержащий сведения о редакторе.
-
ПолеlastName не было заполнено у сохраненного автора, но все еще отображается на следующем графике
-
у нас есть связь между всеми классами:Author может записыватьArticle и должен иметьEditor
-
Vertex представляет собой объект с некоторыми полями
-
Edge - это объект, который связывает дваVertices
Обратите внимание, что, пытаясь добавить другое свойство к объекту полного класса, мы получимOValidationException.
После подключения к нашей базе данных с помощьюOrientDB studio мы увидим графическое представление наших данных:
Давайте посмотрим, как получить количество всех записей (вершин) базы данных:
long size = graph.countVertices();
Теперь давайте покажем только количество объектовWriter (Author & Editor):
@Test
public void givenexampleDB_checkWeHaveTwoWriters() {
long size = graph.countVertices("Writer");
assertEquals(2, size);
}
На следующем шаге мы можем найти все данныеWriter, используя следующий оператор:
Iterable writers = graph.getVerticesOfClass("Writer");
Наконец, давайте запросим всеEditor сlevel 7; здесь у нас есть только один, который соответствует:
@Test
public void givenexampleDB_getEditorWithLevelSeven() {
String onlyEditor = "";
for(Vertex v : graph.getVertices("Editor.level", 7)) {
onlyEditor = v.getProperty("firstName").toString();
}
assertEquals("Maxim", onlyEditor);
}
Имя класса всегда указывается для поиска конкретной вершины при запросе. Мы можем найти более подробную информациюhere.
4.2. Документ API
Следующий вариант - использовать модель документа OrientDB. Это предоставляет возможность манипулирования данными с помощью простой записи с информацией, хранящейся в полях, где типом может быть текст, изображение или двоичная форма.
Давайте снова воспользуемся пользовательским интерфейсом, чтобы создать базу данных с именемexampleDBTwo, но теперь с типомdocument:
Примечание: аналогично этот API также может использоваться в режиме полной схемы, в режиме без схемы или в режиме гибридной схемы.
Подключение к базе данных остается простым, поскольку нам просто нужно создать экземпляр объектаODatabaseDocumentTx, предоставить URL-адрес базы данных и учетные данные пользователя базы данных:
@BeforeClass
public static void setup() {
String orientDBFolder = System.getenv("ORIENTDB_HOME");
db = new ODatabaseDocumentTx("plocal:"
+ orientDBFolder + "/databases/exampleDBTwo")
.open("admin", "admin");
}
Начнем с сохранения простого документа, содержащего информациюAuthor.
Здесь мы видим, что класс был создан автоматически:
@Test
public void givenDB_whenSavingDocument_thenClassIsAutoCreated() {
ODocument doc = new ODocument("Author");
doc.field("name", "Paul");
doc.save();
assertEquals("Author", doc.getSchemaClass().getName());
}
Соответственно, для подсчета количестваAuthors мы можем использовать:
long size = db.countClass("Author");
Давайте снова запросим документы, используя значение поля, чтобы найти объектыAuthor сlevel 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 result = db.query(
new OSQLSynchQuery("select * from Author where level = 7"));
assertEquals(1, result.size());
}
Аналогично, чтобы удалить все записи классаAuthor, мы можем использовать:
for (ODocument author : db.browseClass("Author")) {
author.delete();
}
ВBROWSE Tab студии OrientDB мы можем сделать запрос, чтобы получить все наши объектыAuthor's:
4.3. Объектный API
OrientDB не имеет объектного типа базы данных. Таким образом, Object API опирается на базу данных Document.
В типе Object API все остальные концепции остаются такими же, за исключением одного добавления -binding к POJO.
Начнем с подключения кexampleDBThree с помощью классаOObjectDatabaseTx:
@BeforeClass
public static void setup() {
String orientDBFolder = System.getenv("ORIENTDB_HOME");
db = new OObjectDatabaseTx("plocal:"
+ orientDBFolder + "/databases/exampleDBThree")
.open("admin", "admin");
}
Затем, предполагая, чтоAuthor - это POJO, используемый для хранения данныхAuthor, нам необходимо его зарегистрировать:
db.getEntityManager().registerEntityClass(Author.class);
Author имеет геттеры и сеттеры для следующих полей:
-
имя
-
Фамилия
-
уровень
Давайте создадимAuthor с многострочными инструкциями, если мы подтвердили конструктор без аргументов:
Author author = db.newInstance(Author.class);
author.setFirstName("Luke");
author.setLastName("Sky");
author.setLevel(9);
db.save(author);
С другой стороны, если у нас есть другой конструктор, который принимаетfirstName,lastName иlevel изAuthor соответственно, создание экземпляра занимает всего одну строку:
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);
Точно так же мы запрашиваем у авторовlevel 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 result
= db.query(new OSQLSynchQuery(
"select * from Author where level = 7"));
assertEquals(1, result.size());
}
Наконец, этоofficial guide, в котором представлены некоторые расширенные возможности использования Object API.
5. Заключение
В этой статье мы увидели, как использовать OrientDB в качестве системы управления базами данных с ее API Java. Мы также узнали, как добавить проверку полей и написать несколько простых запросов.
Как всегда, исходный код этой статьи можно найти вover on GitHub.