← Tilbage til databaser

OrientDB

NoSQL

En multi-model NoSQL-database der kombinerer grafdatabase-funktioner med dokument-, objekt- og nøgle-værdi-kapabiliteter.

Beskrivelse

OrientDB er en anden multi-model database (ligesom ArangoDB) der primært fokuserer på grafdatabase-kapabiliteter men også understøtter dokument-, objekt- og nøgle-værdi-modeller. Historisk var OrientDB en af de første multi-model databaser og har været populær i enterprise-miljøer. Den gemmer data som records (dokumenter) der kan linkes via relationships (kanter), hvilket skaber en property graph-struktur. OrientDB bruger et SQL-udvidet forespørgselssprog, som gør det nemmere for SQL-kyndige udviklere at lære. Den understøtter ACID-transaktioner, multi-master replikering og sharding. OrientDB tilbyder både disk-baserede og in-memory lagringsmotorer. En unik funktion er Object Database Mode, hvor du kan persistere Java/C#-objekter direkte uden ORM-mapping. OrientDB har været gennem ejerskabsændringer (fra OrientDB Ltd til SAP og nu Arcade Data), hvilket har skabt usikkerhed om fremtiden. Version 3.x er den nuværende stabile version. Mens OrientDB stadig bruges i produktionssystemer, har den tabt momentum til nyere alternativer som Neo4j og ArangoDB.

Features

  • Multi-model (graf, dokument, objekt, nøgle-værdi)
  • SQL-udvidet forespørgselssprog
  • ACID-transaktioner
  • Multi-master replikering
  • Sharding-understøttelse
  • Grafalgoritmer
  • Fuldtekstsøgning via Lucene
  • RESTful og binære protokoller

Query Eksempel

-- OrientDB SQL

-- 1. Opret classes (lignende tables/collections)
CREATE CLASS Person EXTENDS V;
CREATE CLASS Company EXTENDS V;
CREATE CLASS WorksFor EXTENDS E;

-- 2. Opret properties
CREATE PROPERTY Person.name STRING;
CREATE PROPERTY Person.email STRING;
CREATE PROPERTY Person.age INTEGER;
CREATE PROPERTY Company.name STRING;

-- 3. Opret indexes
CREATE INDEX Person.email UNIQUE;

-- 4. Indsæt vertices (nodes)
INSERT INTO Person SET 
  name = 'Peter Hansen',
  email = 'peter@email.dk',
  age = 30;

INSERT INTO Company SET 
  name = 'TechCorp';

-- 5. Opret edge (relationship)
CREATE EDGE WorksFor FROM 
  (SELECT FROM Person WHERE email = 'peter@email.dk') TO
  (SELECT FROM Company WHERE name = 'TechCorp')
SET since = date('2020-01-01');

-- 6. Query vertices
SELECT * FROM Person WHERE age > 25;

-- 7. Graph traversal (OUTGOING)
SELECT expand(out('WorksFor')) FROM Person 
WHERE name = 'Peter Hansen';

-- 8. Graph traversal (INCOMING)
SELECT expand(in('WorksFor')) FROM Company 
WHERE name = 'TechCorp';

-- 9. Traverse multiple levels
SELECT FROM (
  TRAVERSE out('WorksFor'), out('ParentCompany') FROM 
  (SELECT FROM Person WHERE name = 'Peter Hansen')
  WHILE $depth <= 3
);

-- 10. Shortest path
SELECT shortestPath(
  (SELECT FROM Person WHERE name = 'Peter Hansen'),
  (SELECT FROM Person WHERE name = 'Maria Nielsen'),
  'BOTH'
);

-- 11. Pattern matching
MATCH 
  {class: Person, as: person}-WorksFor->{class: Company, as: company}
RETURN person.name, company.name;

-- 12. Aggregation
SELECT age, count(*) as total 
FROM Person 
GROUP BY age 
ORDER BY total DESC;

-- 13. UPDATE
UPDATE Person SET age = 31 WHERE email = 'peter@email.dk';

-- 14. DELETE
DELETE VERTEX Person WHERE email = 'old@email.dk';
DELETE EDGE WorksFor WHERE since < date('2015-01-01');

// Java API eksempel
import com.orientechnologies.orient.core.db.*;
import com.tinkerpop.blueprints.impls.orient.*;

// Connect
OrientDB orientDB = new OrientDB("remote:localhost", OrientDBConfig.defaultConfig());
ODatabaseSession db = orientDB.open("mydb", "admin", "admin");

// Create vertex
OVertex person = db.newVertex("Person");
person.setProperty("name", "John Doe");
person.setProperty("email", "john@email.com");
person.setProperty("age", 28);
person.save();

// Create edge
OVertex company = db.query(
  "SELECT FROM Company WHERE name = ?", 
  "TechCorp"
).get(0);

OEdge worksFor = person.addEdge(company, "WorksFor");
worksFor.setProperty("since", new Date());
worksFor.save();

// Query
OResultSet rs = db.query(
  "SELECT * FROM Person WHERE age > ?", 
  25
);

while (rs.hasNext()) {
  OResult result = rs.next();
  System.out.println(result.getProperty("name"));
}

// Graph traversal
OResultSet traversal = db.query(
  "SELECT expand(out('WorksFor')) FROM Person WHERE name = ?",
  "John Doe"
);

// Transaction
db.begin();
try {
  OVertex v1 = db.newVertex("Person");
  v1.setProperty("name", "Transaction Person");
  v1.save();
  
  OVertex v2 = db.newVertex("Company");
  v2.setProperty("name", "Transaction Corp");
  v2.save();
  
  db.commit();
} catch (Exception e) {
  db.rollback();
}

// Close
db.close();
orientDB.close();

// Node.js eksempel
const OrientDB = require('orientjs');

const server = OrientDB({
  host: 'localhost',
  port: 2424,
  username: 'root',
  password: 'root'
});

const db = server.use('mydb');

// Insert
await db.query(
  'INSERT INTO Person SET name = :name, email = :email',
  { params: { name: 'Node User', email: 'node@email.com' } }
);

// Select
const results = await db.query(
  'SELECT * FROM Person WHERE age > :age',
  { params: { age: 25 } }
);

console.log(results);

// Graph traversal
const companies = await db.query(
  "SELECT expand(out('WorksFor')) FROM Person WHERE name = :name",
  { params: { name: 'Node User' } }
);

Anvendelsesområder

  • Enterprise grafapplikationer
  • Indholdsstyring med komplekse relationer
  • Netværkstopologimapping
  • Master data management
  • Semantisk web-applikationer

Fordele

  • SQL-lignende forespørgselssprog (lettere at lære)
  • Multi-model fleksibilitet
  • ACID-transaktioner
  • Objektdatabasetilstand (Java/C#-objekter)
  • Kan køre indlejret i applikationer

Ulemper

  • Usikker fremtid efter ejerskabsændringer
  • Mindre aktivt community end før
  • Ydeevneproblemer ved meget store grafer
  • Dokumentation kan være forældet
  • Færre nye funktioner sammenlignet med konkurrenter

Bedst til

  • Enterprise-applikationer med eksisterende SQL-viden
  • Java-applikationer (native integration)
  • Migration fra relationel til graf
  • Indlejrede databasebehov
  • Legacy-systemer der kræver grafkapabiliteter

Ikke anbefalet til

  • Nye projekter (overvej Neo4j eller ArangoDB)
  • Meget store grafer (milliarder af kanter)
  • Cloud-native applikationer
  • Teams der vil have banebrydende funktioner
  • Produktionssystemer der har brug for langsigtet supportgaranti

Relaterede databaser

ArangoDBNeo4jJanusGraphDgraphTigerGraph