Introduction aux API Java OrientDB

Introduction aux API Java OrientDB

 

1. Vue d'ensemble

OrientDB est une technologie de base de données NoSQL multi-modèle open source conçue pour fonctionner avec les modèlesGraph,Document,Key-Value,GeoSpatial etReactive tout en gérant les requêtes avec la syntaxeSQL.

Dans cet article, nous allons couvrir la configuration et utiliser les API Java OrientDB.

2. Installation

Tout d'abord, nous devons installer le paquet binaire.

Téléchargez la dernière version stable deOrientDB (2.2.x au moment de la rédaction de cet article).

Deuxièmement, nous devons le décompresser et déplacer son contenu dans un répertoire pratique (en utilisantORIENTDB_HOME). Assurez-vous d'ajouter le dossierbin aux variables d'environnement pour une utilisation facile de la ligne de commande.

Enfin, nous devons éditer le fichierorientdb.sh situé dans$ORIENTDB_HOME/bin en remplissant l'emplacement (ORIENTDB_HOME) du répertoire OrientDB à la place de[.s1]#ORIENTDB_DIR #and also the system user we’d like to use instead of USER_YOU_WANT_ORIENTDB_RUN_WITH.

Maintenant, nous avons un OrientDB entièrement fonctionnel. Nous pouvons utiliser lesorientdb.sh <option> script with options:

  • start: pour démarrer le serveur

  • status: pour vérifier l'état

  • stop: pour arrêter le serveur

Veuillez noter que les actionsstart etstop nécessitent le mot de passe utilisateur (celui que nous avons configuré dans le fichierorientdb.sh).

Une fois le serveur lancé, il occupera le port 2480. On peut donc y accéder localement en utilisant ceURL:

image

Vous trouverez plus de détails sur l'installation manuellehere.

Remarque: OrientDB nécessite la version 1.7 ou supérieure deJava.

Les versions précédentes sont disponibleshere.

3. Configuration des API Java OrientDB

OrientDB permet aux développeurs Java de travailler avec trois API différentes telles que:

  • API graphique - bases de données graphiques

  • API de document - bases de données orientées document

  • Object API - objets liés directement au document OrientDB

Nous pouvons utiliser tous ces types dans une seule base de code simplement en intégrant et en utilisant OrientDB.

Jetons un coup d'œil à quelques fichiers JAR disponibles que nous pouvons inclure dans le classpath du projet:

  • orientdb-core-*.jar: apporte la bibliothèque principale

  • blueprints-core-*.jar: pour amener les composants de base des adaptateurs

  • orientdb-graphdb-*.jar: donne l'API de la base de données Graph

  • orientdb-object-*.jar: fournit l'API de base de données d'objets

  • orientdb-distributed-*.jar: fournit le plugin de base de données distribuée pour fonctionner avec un cluster de serveurs

  • orientdb-tools-*.jar: passe la commande de la console

  • orientdb-client-*.jar: fournit le client distant

  • orientdb-enterprise-*.jar: active le protocole et les classes de réseau partagés par le client et le serveur

Les deux derniers ne sont obligatoires que si nous gérons nos données sur un serveur distant.

Commençons par un projet Maven et utilisons les dépendances suivantes:


    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

Veuillez consulter le référentiel Maven Central pour les dernières versions des APICore,GraphDB,Object d'OrientDB et lesBlueprints-Core.

4. Usage

L'OrientDB utilise l'implémentationTinkerPop Blueprints pour travailler avec des graphiques.

TinkerPop est un framework de calcul graphique fournissant de nombreuses façons de créer des bases de données graphiques, où chacune d'elles a ses implémentations:

De plus, OrientDB permet de travailler avec les trois types deSchemas quel que soit le type d'API:

  • Schema-Full - le mode strict est activé, ainsi tous les champs sont spécifiés lors de la création de la classe

  • Sans schéma - les classes sont créées sans propriété spécifique, nous pouvons donc les ajouter comme nous le voulons; it’s the default mode

  • Schema-Hybrid - c'est le mélange de schéma complet et sans schéma où nous pouvons créer une classe avec des champs prédéfinis mais laisser l'enregistrement définir d'autres personnalisés

4.1. API graphique

Puisqu'il s'agit d'une base de données graphique, les données sont représentées sous la forme d'un réseau contenantVertices (nœuds) interconnectés parEdges (arcs).

Dans un premier temps, utilisons l'interface utilisateur pour créer une base de données Graph appeléeexampleDB avec un utilisateuradmin et un mot de passeadmin.

Comme nous le voyons dans l'image suivante, legraph a été sélectionné comme type de base de données, donc par conséquent ses données seront accessibles dans leGRAPH Tab:

image

Connectons-nous maintenant à la base de données souhaitée, sachant queORIENTDB_HOME est une variable d'environnement qui correspond au dossier d'installation deOrientDB:

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

Lançons les classesArticle,Author etEditor - tout en montrant comment ajouter une validation à leurs champs:

@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");
}

Dans l'extrait de code ci-dessus, nous avons fait une représentation simple de notre base de données simple où:

  • Article est la classe sans schéma qui contient des articles

  • Writer est une super-classe complète de schéma qui contient les informations nécessaires sur le rédacteur

  • Writer est un sous-type deAuthor qui contient ses détails

  • Editor est un sous-type deWriter sans schéma qui contient les détails de l'éditeur

  • Le champlastName n'a pas été renseigné dans l'auteur enregistré mais apparaît toujours sur le graphique suivant

  • nous avons une relation entre toutes les classes: unAuthor peut écrireArticle et doit avoir unEditor

  • Vertex représente une entité avec quelques champs

  • Edge est une entité qui relie deuxVertices

Veuillez noter qu'en essayant d'ajouter une autre propriété à un objet d'une classe complète, nous nous retrouverons avec lesOValidationException.

Après vous être connecté à notre base de données en utilisantOrientDB studio, nous verrons la représentation graphique de nos données:

image

Voyons comment avoir le nombre de tous les enregistrements (sommets) de la base de données:

long size = graph.countVertices();

Maintenant, montrons juste le nombre d'objetsWriter (Author & Editor):

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

    assertEquals(2, size);
}

À l'étape suivante, nous pouvons trouver toutes les données deWriter, en utilisant l'instruction suivante:

Iterable writers = graph.getVerticesOfClass("Writer");

Enfin, recherchons tous lesEditor aveclevel 7; ici, nous n'en avons qu'un qui correspond:

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

    assertEquals("Maxim", onlyEditor);
}

Le nom de la classe est toujours spécifié pour rechercher un sommet spécifique lors de la demande. Nous pouvons trouver plus de détailshere.

4.2. API de document

L’option suivante consiste à utiliser le modèle de document d’OrientDB. Ceci expose la manipulation de données via un simple enregistrement avec des informations stockées dans des champs où le type pourrait être du texte, une image ou une forme binaire.

Utilisons à nouveau l'interface utilisateur pour créer une base de données nomméeexampleDBTwo, mais maintenant avec undocument comme type:

image

Remarque: De même, cette API peut également être utilisée en mode schéma complet, schéma inférieur ou schéma hybride.

La connexion à la base de données reste simple car il suffit d'instancier un objetODatabaseDocumentTx, de fournir l'URL de la base de données et les informations d'identification de l'utilisateur de la base de données:

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

Commençons par enregistrer un document simple contenant des informationsAuthor.

Ici nous pouvons voir que la classe a été créée automatiquement:

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

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

En conséquence, pour compter le nombre deAuthors, on peut utiliser:

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

Examinons à nouveau les documents en utilisant une valeur de champ, pour rechercher les objets deAuthor aveclevel 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());
}

De même, pour supprimer tous les enregistrements de la classeAuthor, nous pouvons utiliser:

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

Sur lesBROWSE Tab du studio OrientDB, nous pouvons faire une requête pour obtenir tous nos objetsAuthor's:

image

4.3. API objet

OrientDB n'a pas le type d'objet de base de données. Ainsi, l'API d'objet s'appuie sur une base de données de document.

Dans le type API objet, tous les autres concepts restent les mêmes avec un seul ajout -binding à POJO.

Commençons par nous connecter auxexampleDBThree en utilisant la classeOObjectDatabaseTx:

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

Ensuite, en supposant queAuthor est le POJO utilisé pour contenir une donnéeAuthor, nous devons l'enregistrer:

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

Author a des getters et des setters pour les champs suivants:

  • Prénom

  • nom de famille

  • niveau

Créons unAuthor avec des instructions multilignes si nous avons reconnu un constructeur sans argument:

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

D'un autre côté, si nous avons un autre constructeur qui prend respectivement lesfirstName,lastName etlevel desAuthor, l'instanciation est juste une ligne:

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

Les lignes suivantes utilisent pour parcourir et supprimer tous les enregistrements de la classe Author:

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

Pour compter tous les auteurs, il suffit de fournir la classe et l'instance de base de données sans qu'il soit nécessaire d'écrire une requête SQL:

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

De même, nous interrogeons les auteurs aveclevel 7 comme ceci:

@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());
}

Enfin, c'est leofficial guide qui introduit certaines utilisations avancées de l'API Object.

5. Conclusion

Dans cet article, nous avons vu comment utiliser OrientDB en tant que système de gestion de base de données avec ses API Java. Nous avons également appris à ajouter une validation sur les champs et à écrire des requêtes simples.

Comme toujours, le code source de cet article peut être trouvéover on GitHub.