OrientDB
NoSQLEn 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