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

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

 

1. обзор

OrientDB - это технология многомодельной базы данных 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 вместо[.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:

image

Более подробную информацию о ручной установке можно найти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:

image

Теперь давайте подключимся к нужной базе данных, зная, что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 мы увидим графическое представление наших данных:

image

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

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:

image

Примечание: аналогично этот 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:

image

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.