orientdb a database for the web

Post on 01-Jan-2017

225 Views

Category:

Documents

2 Downloads

Preview:

Click to see full reader

TRANSCRIPT

(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

(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 ?

(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

(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 }

(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'

(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

(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

};

}

(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

(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

(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')

(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

(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._%+-?+@A-Z0-9.-?+\.A-Z?{2,4}\b'

(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

(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 ]

}“ );

(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

(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

(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

(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

(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

(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]

(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

(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

(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

(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!

(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

(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

(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)

(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

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

(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]

(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

(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

(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

(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

top related