orientdb a database for the web

77
(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 1 www.orientechnologies.com Luca Garulli Founder and CEO NuvolaBase Ltd May 2012 29 - 30 in Cologne, Germany Design your application using Persistent Graphs and OrientDB

Upload: lydung

Post on 01-Jan-2017

225 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 1 www.orientechnologies.com

Luca Garulli – Founder and CEO NuvolaBase Ltd

May 2012 29 - 30 in Cologne, Germany

Design your application using Persistent Graphs and OrientDB

Page 4: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 4

Can we have a fast and scalable NoSQL

product with flexible schema,

transactions, SQL, security and the

support for complex types ?

Page 7: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 7

Mission?

Reduce to the minimum the compromises

on fitting the application domain to a

persistent database supporting

multiple models

Page 8: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 8

OrientDB = { flexibility of Document databases

+ complexity of the Graph model

+ Object Oriented concepts

+ fast Index

+ powerful SQL dialect }

Page 15: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 15

Schema-full schema with constraints on fields and validation rules

Customer.age > 17

Customer.address not null

Customer.surname is mandatory

Customer.email matches '\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b'

Page 20: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 20

Why reinvent

yet another language when

the 100% of developers already

know SQL?

OrientDB begins from SQL

but improves it with new

operators for graph manipulation

Page 22: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 22

SELECT SUM(price) as prices, SUM(cost) as costs, prices-costs, margin/price

FROM Balance

VS

function (key, values) {

var price = 0.0, cost = 0.0, margin = 0.0, marginPercent = 0.0;

for (var i = 0; i < values.length; i++) {

price += values[i].price;

cost += values[i].cost;

}

margin = price - cost;

marginPercent = margin / price;

return {

price: price,

cost: cost,

margin: margin,

marginPercent: marginPercent

};

}

Page 23: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 23

Asynchronous Query

invoke callback when a record matches the condition

doesn't collect the result set

perfect for immediate results

useful to compute aggregates

Page 24: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 24

Enhanced SQL

SQL is not enough for collections, maps, trees and graphs

need to enhance SQL syntax

Easy syntax derived from JDO/JPA standards

Page 25: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 25

SQL & relationships

select from Account where address.city.country.name = 'Italy'

select from Account where addresses contains (city.country.name = 'Italy')

Page 26: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 26

SQL & trees/graphs

select out[label='friend'].in from V where name = 'Luca' and surname = 'Garulli'

select out[@class='knows'].in from V where name = 'Jay' and surname = 'Miner'

traverse friends from Profile where $depth < 7

Page 28: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 28

SQL & strings

select from Profile where name.toUpperCase() = 'LUCA'

select from City where country.name.substring(1,3).toUpperCase() = 'TAL'

select from Agenda where phones contains ( number.indexOf( '+39' ) > -1 )

select from Agenda where email matches '\bA-Z0-9._%[email protected]?+\.A-Z?{2,4}\b'

Page 30: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 30

SQL & collections

select from Tree where children contains ( married = true )

select from Tree where children containsAll ( married = true )

select from User where roles containsKey 'shutdown'

select from Graph where edges.size() > 0

Page 36: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 36

Native JSON ODocument = new ODocument().fromJSON( "

{

'@rid' = '26:10',

'@class' = 'Developer',

'name' : 'Luca',

'surname' : 'Garulli',

'out' : [ #10:33, #10:232 ]

}“ );

Page 39: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 39

Hooks

similar to triggers catch events against records, database and transactions

implement custom cascade deletion algorithm

enforce constraints

Page 41: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 41

Cache

You can avoid using 3°party caches

like Memcached

2 Level caches:

Level1: Database level, 1 per thread

Level2: Storage level, 1 per JVM

Page 42: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 42

OGraphVertex (V)

Person Address : Address

Inheritance

Customer totSold : float

Provider totBuyed : float

OGraphEdge (E)

Works

since : Date

Resides since : Date

till : Date

Knows

Level : LEVELS

Vehicle brand : BRANDS

Page 43: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 43

OgraphVertex (V)

Person Address : Address

Polymorphic SQL Query

Customer totSold : float

Provider totBuyed : float

Vehicle brand : BRANDS

select from Person

where city.name = 'Rome‘

Queries are polymorphics

and subclasses of Person can be

part of result set

Page 44: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 44

Fetch plans

Choose what to fetch on query and vertexes/edges loading

Vertexes/Edges not fetched will be lazy-loaded on request

Optimizes network latency

Page 45: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 45

Load only the root vertex

= *:1

Fetch plans Vertex

Luca

|

| lives city

+---------> Vertex ------------> Vertex

| 10th street Italy

| knows

+--------->* [Vertex Vertex Vertex ]

[ Marko John Nicholas]

Page 46: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 46

Fetch plans Vertex

Luca

|

| lives city

+---------> Vertex ------------> Vertex

| 10th street Italy

| knows

+--------->* [Vertex Vertex Vertex ]

[ Marko John Nicholas]

Load root + address

= *:1 lives:2

Page 47: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 47

Fetch plans Vertex

Luca

|

| lives city

+---------> Vertex ------------> Vertex

| 10th street Italy

| knows

+--------->* [Vertex Vertex Vertex ]

[ Marko John Nicholas]

Load root + all known

= *:1 knows:1

Page 48: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 48

Fetch plans Vertex

Luca

|

| lives city

+---------> Vertex ------------> Vertex

| 10th street Italy

| knows

+--------->* [Vertex Vertex Vertex ]

[ Marko John Nicholas]

Load up 3rd level of depth

= *:3

Page 52: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 52

OrientDB doesn’t use JOIN

but the “link” to traverse

millions of elements per second

In Blueprints benchmark, with a hot cache,

traverses 29,6M of records in less than 5 seconds

= 5,92M of nodes traversed per sec!

Page 53: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 53

OGraphDatabase Native, damn fast, not the most beautiful API

2 different API

OrientGraph TinkerPop Blueprints, slowest but:

common to other impls, Gremlin, SPARQL (via Sail)

All APIs are compatible among them!

So use the right one for the right case

Page 54: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 54

What to choose?

OGraphDatabase if you need

performance at any cost.

Use it for massive insertion or

low resources

OGraphDatabase Native, damn fast, not the most beautiful API

Page 55: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 55

What to choose?

OrientGraph if you want to stay

Portable

at the cost of less speed and more memory used

or to use Gremlin language,

or as RDF store + SPARQL

OrientGraph TinkerPop Blueprints, slowest but:

common to other impls, Gremlin, SPARQL (Sail)

Page 57: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 57

TinkerPop Blueprints basic API to interact with GraphDB

implements transactional and

indexable property graph model

bidirectional edges

Page 58: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 58

GraphDB & Blueprints API

OrientGraph graph = new OrientGraph("local:/tmp/db/graph”);

Vertex actor = graph.addVertex(null);

actor.setProperty("name", "Leonardo");

actor.setProperty("surname", "Di Caprio");

Vertex movie = graph.addVertex(null);

movie.setProperty("name", "Inception");

Edge edge = graph.addEdge(null, actor, movie, "StarredIn");

graph.shutdown();

Page 61: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 61

Load graph

Run the console, open the database and load a graph in xml format

marko:~/software/gremlin$ ./gremlin.sh

\,,,/

(o o)

-----oOOo-(_)-oOOo-----

gremlin> $_g := orientdb:open('/tmp/graph/test')

==>orientgraph[/tmp/graph/test]

gremlin> g:load('data/graph-example-1.xml')

==>true

gremlin> $_g

==>orientgraph[/tmp/graph/test]

Page 62: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 62

Search

Displays outgoing edges of vertices with name equals to 'marko',

then the name of inbound vertices

gremlin> g:key-v('name','marko')/outE

==>e[6:0][5:2-knows->5:1]

==>e[6:1][5:2-knows->5:4]

==>e[6:4][5:2-created->5:0]

gremlin> g:key-v('name','marko')/outE/inV/@name

==>vadas

==>josh

==>lop

gremlin> g:close()

==>true

Page 66: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 66

After first tests we decided to throw away the old Master-Slave

architecture because it was against the OrientDB philosophy:

(1) It didn't scale

and (2) It was hard to configure

Page 67: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 67

Console

ORIENT database v.0.9.23 www.orientechnologies.com

Type 'help' to display all the commands supported.

> connect remote:localhost/demo admin admin

Connecting to database [remote:localhost/demo] with user 'admin'...OK

> select from profile where nick.startsWith('L')

---+--------+--------------------+--------------------+--------------------+

#| REC ID |NICK |SEX |AGE |

---+--------+--------------------+--------------------+--------------------+

0| 10:0|Lvca |male |34

1| 10:3|Leo |male |22

2| 10:7|Luisa |female |27

3 item(s) found. Query executed in 0.013 sec(s).

> close

Disconnecting from the database [demo]...OK

> quit

Page 73: OrientDB a database for the Web

(c) Luca Garulli Licensed under a Creative Commons Attribution-NoDerivs 3.0 Unported License Page 73

OrientDB

for Java developers 8 hours

OrientDB

Master Development 14 hours

OrientDB

for SOA 6 hours

OrientDB and the power of graphs

6 hours

OrientDB

for DBA 6 hours

OrientPlanet for Web Developers

6 hours