156
Adrian Onet -2015 Non-Relational Databases

Adrian Onet -2015. Non-Relational Databases Graph databases Columnar databases. Large databases: Key-Value Stores (Amazon) BigTable (Google)

Embed Size (px)

Citation preview

Graph Databases

Non-Relational DatabasesAdrian Onet -2015Non-Relational DatabasesGraph databasesColumnar databases.Large databases:Key-Value Stores (Amazon)BigTable (Google)Adrian Onet -2015Graph DatabasesProcedural programming (C, Pascal, Fortran) theoretical algebra.RDBMS logic and set theory.Graph databases graph theory.Adrian Onet -2015Graph DatabasesProcedural programming (C, Pascal, Fortran) theoretical algebra.RDBMS logic and set theory.Graph databases graph theory.Graph TheoryNode (somehow similar with entities in RDBMS).

adamjohnAdrian Onet -2015Graph DatabasesProcedural programming (C, Pascal, Fortran) theoretical algebra.RDBMS logic and set theory.Graph databases graph theory.Graph TheoryNode (somehow similar with entities in RDBMS).

adamjohnknowsEdges connects nodes.can be orientedAdrian Onet -2015Graph DatabasesProcedural programming (C, Pascal, Fortran) theoretical algebra.RDBMS logic and set theory.Graph databases graph theory.Graph TheoryNode (somehow similar with entities in RDBMS).

adamjohnknowsEdges connects nodes.can be not orientedAdrian Onet -2015Graph DatabasesGraph TheoryPath (a sequence of nodes using each node only once).

Adrian Onet -2015Graph DatabasesGraph TheoryPath (a sequence of nodes using each node only once).

12345Adrian Onet -2015Graph DatabasesGraph TheoryPath (a sequence of nodes using each node only once).

123451Adrian Onet -2015Graph DatabasesGraph TheoryPath (a sequence of nodes using each node only once).

123451 2Adrian Onet -2015Graph DatabasesGraph TheoryPath (a sequence of nodes using each node only once).

123451 2 4Adrian Onet -2015Graph DatabasesGraph TheoryPath (a sequence of nodes using each node only once).

123451 2 4 5 Adrian Onet -2015Graph DatabasesCan they be better than RDBMS?IMDB.COM - has around 6.6 million actors and 3.4 million titles.

Adrian Onet -2015Graph DatabasesCan they be better than RDBMS?IMDB.COM - has around 6.6 million actors and 3.4 million titles.

ORACLEOFBACON.ORG

Adrian Onet -2015Graph DatabasesCan they be better than RDBMS?IMDB.COM - has around 6.6 million actors and 3.4 million titles.

ORACLEOFBACON.ORG

Adrian Onet -2015Graph DatabasesCan they be better than RDBMS?IMDB.COM - has around 6.6 million actors and 3.4 million titles.

ORACLEOFBACON.ORG

JCV has Bacon number 2Adrian Onet -2015Graph DatabasesCan they be better than RDBMS?IMDB.COM - has around 6.6 million actors and 3.4 million titles.

ORACLEOFBACON.ORG

JCV has Bacon number 2Bacon NumberRDBMS - SQLCogito100:00:240.172sAdrian Onet -2015Graph DatabasesCan they be better than RDBMS?IMDB.COM - has around 6.6 million actors and 3.4 million titles.

ORACLEOFBACON.ORG

JCV has Bacon number 2Bacon NumberRDBMS - SQLCogito100:00:240.172s200:02:0600:00:01Adrian Onet -2015Graph DatabasesCan they be better than RDBMS?IMDB.COM - has around 6.6 million actors and 3.4 million titles.

ORACLEOFBACON.ORG

JCV has Bacon number 2Bacon NumberRDBMS - SQLCogito100:00:240.172s200:02:0600:00:01300:12:5200:00:01Adrian Onet -2015Graph DatabasesCan they be better than RDBMS?IMDB.COM - has around 6.6 million actors and 3.4 million titles.

ORACLEOFBACON.ORG

JCV has Bacon number 2Bacon NumberRDBMS - SQLCogito100:00:240.172s200:02:0600:00:01300:12:5200:00:01400:14:0300:00:13Adrian Onet -2015Graph DatabasesCan they be better than RDBMS?IMDB.COM - has around 6.6 million actors and 3.4 million titles.

ORACLEOFBACON.ORG

JCV has Bacon number 2Bacon NumberRDBMS - SQLCogito100:00:240.172s200:02:0600:00:01300:12:5200:00:01400:14:0300:00:13500:14:5500:00:16Adrian Onet -2015Graph DatabasesCan they be better than RDBMS?IMDB.COM - has around 6.6 million actors and 3.4 million titles.

ORACLEOFBACON.ORG

JCV has Bacon number 2Bacon NumberRDBMS - SQLCogito100:00:240.172s200:02:0600:00:01300:12:5200:00:01400:14:0300:00:13500:14:5500:00:16RDBMS was 9000 times slowerwhen changing focus actor and useonly actress links.Adrian Onet -2015Graph DatabasesExisting Graph DatabasesSystemCharacteristicsAllegroGraphBased on RDF (Resource Description Framework). SPARQL for ad-hoc queries.OrientDBACID support. SQL-like query language. REST API.ArangoDBACID support. Query language AQL (SQL-like).IBM System GHigh performance. Support REST API and provides C++ and Java API.TitanDistributed, scalable. Java API.Neo4jHighly scalable. REST API. API for many programming languages (Java, Python, ). Cypher query language.Adrian Onet -2015Graph DatabasesExisting Graph DatabasesSystemCharacteristicsAllegroGraphBased on RDF (Resource Description Framework). SPARQL for ad-hoc queries.OrientDBACID support. SQL-like query language. REST API.ArangoDBACID support. Query language AQL (SQL-like).IBM System GHigh performance. Support REST API and provides C++ and Java API.TitanDistributed, scalable. Java API.Neo4jHighly scalable. REST API. API for many programming languages (Java, Python, ). Cypher query language.Adrian Onet -2015Graph DatabasesNeo4j - basic commands$ bin/neo4j start$ bin/neo4j console- starts the server as a background process.$ more conf/neo4j-server.propertiesorg.neo4j.server.database.location=/var/graph.dborg.neo4j.server.webserver.port=7474org.neo4j.server.webadmin.data.uri=/db/data/org.neo4j.server.webadmin.management.uri=/db/manage- starts the server as a foreground process. $ bin/neo4j shell host 192.168.1.100 port 7474- command line shell to run Cypher queries.Adrian Onet -2015Graph DatabasesCypher - getting startedCREATE (a:USER {name:john, age:21})name=johnage=21USERAdrian Onet -2015Graph DatabasesCypher - getting startedCREATE (a:USER {name:john, age:21})CREATE (b:USER {name:adam, ssn:123})name=johnage=21name=adamssn=123USERUSERAdrian Onet -2015Graph DatabasesCypher - getting startedCREATE (a:USER {name:john, age:21})CREATE (b:USER {name:adam, ssn:123})CREATE (a)-[r:KNOWS]-(b)name=johnage=21name=adamssn=123KNOWSUSERUSERAdrian Onet -2015Graph DatabasesCypher - getting startedCREATE (a:USER {name:john, age:21})CREATE (b:USER {name:adam, ssn:123})CREATE (a)-[r:KNOWS]-(b)RETURN a,b,rname=johnage=21name=adamssn=123KNOWSUSERUSERabr(8:USER {age:21, name:"john"})(9:USER {name:"adam", ssn:"123"})(8)-[7:KNOWS]->(9)Adrian Onet -2015Graph DatabasesCypher - querying dataname=johnage=21name=adamssn=123KNOWSUSERUSER

Adrian Onet -2015Graph DatabasesCypher - querying data MATCH (a:USER)name=johnage=21name=adamssn=123KNOWSUSERUSER RETURN a.name, a.age, a.ssn

Adrian Onet -2015Graph DatabasesCypher - querying data MATCH (a:USER)name=johnage=21name=adamssn=123KNOWSUSERUSER RETURN a.name, a.age, a.ssna.namea.agea.ssnjohn21adam123

Adrian Onet -2015Graph DatabasesCypher - querying data MATCH (a:USER)name=johnage=21name=adamssn=123KNOWSUSERUSER RETURN a.name, a.age, a.ssna.namea.agea.ssnjohn21adam123

Find the name off all USERS that KNOWS adam

Adrian Onet -2015Graph DatabasesCypher - querying data MATCH (a:USER)name=johnage=21name=adamssn=123KNOWSUSERUSER RETURN a.name, a.age, a.ssna.namea.agea.ssnjohn21adam123

Find the name off all USERS that KNOWS adam MATCH (a:USER)-[:KNOWS]->(:USER{name:adam}) RETURN a.name

Adrian Onet -2015Graph DatabasesCypher - querying data MATCH (a:USER)name=johnage=21name=adamssn=123KNOWSUSERUSER RETURN a.name, a.age, a.ssna.namea.agea.ssnjohn21adam123

Find the name off all USERS that KNOWS adam MATCH (a:USER)-[:KNOWS]->(:USER{name:adam}) RETURN a.namea.namejohn

Adrian Onet -2015Graph DatabasesCypher

Match can be used also to manipulate data:name=adamssn=123

Adrian Onet -2015Graph DatabasesCypher

Match can be used also to manipulate data: MATCH (a:USER{name:adam}) SET a.age=25name=adamssn=123age=25Adrian Onet -2015Graph DatabasesCypher

Match can be used also to manipulate data: MATCH (a:USER{name:adam}) DELETE aAdrian Onet -2015Graph DatabasesCypher

Match can be used also to manipulate data: MATCH (a:USER{name:adam}) DELETE a!!! If there are more users named adam all will be deletedAdrian Onet -2015Graph DatabasesCypher

Match can be used also to manipulate data:name=johnage=21name=adamssn=123KNOWSUSERUSERDelete an edge (relationship):Adrian Onet -2015Graph DatabasesCypher

Match can be used also to manipulate data:name=johnage=21name=adamssn=123USERUSERDelete an edge (relationship): MATCH (:USER{name:john})-[r:KNOWS]->(:USER{name:adam}) DELETE rAdrian Onet -2015Graph DatabasesCypher

Match can be used also to manipulate data:What is this statement doing? MATCH (a) DELETE a,r OPTIONAL MATCH (a)-[r]-()Adrian Onet -2015Graph DatabasesCypher more complex queries

Return all users that knows adam through somebody else: MATCH (a:USER)-[:KNOWS]->(:USER)-[:KNOWS]->(:USER{name:adam})KNOWSUSERUSERname=adamKNOWSUSER RETURN a MATCH (a:USER)-[:KNOWS*2]-> (:USER{name:adam}) RETURN aAdrian Onet -2015Graph DatabasesCypher in action

ACITYCREATE (a:CITY{name:"a"})Adrian Onet -2015Graph DatabasesCypher in action

ACITYBCITYCREATE (a:CITY{name:"a"})CREATE (b:CITY{name:"b"})Adrian Onet -2015Graph DatabasesCypher in action

ACITYCBCITYCREATE (a:CITY{name:"a"})CREATE (b:CITY{name:"b"})CREATE (c:CITY{name:"c"})Adrian Onet -2015Graph DatabasesCypher in action

ACITYDCBCITYCREATE (a:CITY{name:"a"})CREATE (b:CITY{name:"b"})CREATE (c:CITY{name:"c"})CREATE (d:CITY{name:"d"})Adrian Onet -2015Graph DatabasesCypher in action

ACITYECITYDCBCITYCREATE (a:CITY{name:"a"})CREATE (b:CITY{name:"b"})CREATE (c:CITY{name:"c"})CREATE (d:CITY{name:"d"})CREATE (e:CITY{name:"e"})Adrian Onet -2015Graph DatabasesCypher in action

ACITYFCITYECITYDCBCITYCREATE (a:CITY{name:"a"})CREATE (b:CITY{name:"b"})CREATE (c:CITY{name:"c"})CREATE (d:CITY{name:"d"})CREATE (e:CITY{name:"e"})CREATE (f:CITY{name:"f"})Adrian Onet -2015Graph DatabasesCypher in action

ACITYFCITYECITYDCBCITYWay{dist:14}CREATE (a:CITY{name:"a"})CREATE (b:CITY{name:"b"})CREATE (c:CITY{name:"c"})CREATE (d:CITY{name:"d"})CREATE (e:CITY{name:"e"})CREATE (f:CITY{name:"f"})CREATE (a)-[r1:Way{dist:14}]->(b)Adrian Onet -2015Graph DatabasesCypher in action

ACITYFCITYECITYDCBCITYWay{dist:14}Way{dist:9}CREATE (a:CITY{name:"a"})CREATE (b:CITY{name:"b"})CREATE (c:CITY{name:"c"})CREATE (d:CITY{name:"d"})CREATE (e:CITY{name:"e"})CREATE (f:CITY{name:"f"})CREATE (a)-[r1:Way{dist:14}]->(b)CREATE (b)-[r2:Way{dist:9}]->(e)Adrian Onet -2015Graph DatabasesCypher in action

ACITYFCITYECITYDCBCITYWay{dist:14}Way{dist:9}Way{dist:6}CREATE (a:CITY{name:"a"})CREATE (b:CITY{name:"b"})CREATE (c:CITY{name:"c"})CREATE (d:CITY{name:"d"})CREATE (e:CITY{name:"e"})CREATE (f:CITY{name:"f"})CREATE (a)-[r1:Way{dist:14}]->(b)CREATE (b)-[r2:Way{dist:9}]->(e)CREATE (e)-[r4:Way{dist:6}]->(f)Adrian Onet -2015Graph DatabasesCypher in action

ACITYFCITYECITYDCBCITYWay{dist:14}Way{dist:9}Way{dist:11}Way{dist:6}CREATE (a:CITY{name:"a"})CREATE (b:CITY{name:"b"})CREATE (c:CITY{name:"c"})CREATE (d:CITY{name:"d"})CREATE (e:CITY{name:"e"})CREATE (f:CITY{name:"f"})CREATE (a)-[r1:Way{dist:14}]->(b)CREATE (b)-[r2:Way{dist:9}]->(e)CREATE (e)-[r4:Way{dist:6}]->(f)CREATE (f)-[r5:Way{dist:11}]->(c)Adrian Onet -2015Graph DatabasesCypher in action

ACITYFCITYECITYDCBCITYWay{dist:14}Way{dist:9}Way{dist:9}Way{dist:11}Way{dist:6}CREATE (a:CITY{name:"a"})CREATE (b:CITY{name:"b"})CREATE (c:CITY{name:"c"})CREATE (d:CITY{name:"d"})CREATE (e:CITY{name:"e"})CREATE (f:CITY{name:"f"})CREATE (a)-[r1:Way{dist:14}]->(b)CREATE (b)-[r2:Way{dist:9}]->(e)CREATE (e)-[r4:Way{dist:6}]->(f)CREATE (f)-[r5:Way{dist:9}]->(c)CREATE (c)-[r7:Way{dist:9}]->(a)Adrian Onet -2015Graph DatabasesCypher in action

ACITYFCITYECITYDCBCITYWay{dist:14}Way{dist:9}Way{dist:10}Way{dist:9}Way{dist:11}Way{dist:6}CREATE (a:CITY{name:"a"})CREATE (b:CITY{name:"b"})CREATE (c:CITY{name:"c"})CREATE (d:CITY{name:"d"})CREATE (e:CITY{name:"e"})CREATE (f:CITY{name:"f"})CREATE (a)-[r1:Way{dist:14}]->(b)CREATE (b)-[r2:Way{dist:9}]->(e)CREATE (e)-[r4:Way{dist:6}]->(f)CREATE (f)-[r5:Way{dist:9}]->(c)CREATE (b)-[r6:Way{dist:11}]->(e)CREATE (c)-[r7:Way{dist:9}]->(a)CREATE (c)-[r8:Way{dist:10}]->(d)Adrian Onet -2015Graph DatabasesCypher in action

ACITYFCITYECITYDCBCITYWay{dist:14}Way{dist:9}Way{dist:10}Way{dist:9}Way{dist:7}Way{dist:11}Way{dist:6}CREATE (a:CITY{name:"a"})CREATE (b:CITY{name:"b"})CREATE (c:CITY{name:"c"})CREATE (d:CITY{name:"d"})CREATE (e:CITY{name:"e"})CREATE (f:CITY{name:"f"})CREATE (a)-[r1:Way{dist:14}]->(b)CREATE (b)-[r2:Way{dist:9}]->(e)CREATE (e)-[r4:Way{dist:6}]->(f)CREATE (f)-[r5:Way{dist:9}]->(c)CREATE (b)-[r6:Way{dist:11}]->(e)CREATE (c)-[r7:Way{dist:9}]->(a)CREATE (c)-[r8:Way{dist:10}]->(d)CREATE (a)-[r9:Way{dist:7}]->(d)Adrian Onet -2015Graph DatabasesCypher in action

ACITYFCITYECITYDCBCITYWay{dist:14}Way{dist:9}Way{dist:10}Way{dist:9}Way{dist:7}Way{dist:11}Way{dist:15}Way{dist:6}CREATE (a:CITY{name:"a"})CREATE (b:CITY{name:"b"})CREATE (c:CITY{name:"c"})CREATE (d:CITY{name:"d"})CREATE (e:CITY{name:"e"})CREATE (f:CITY{name:"f"})CREATE (a)-[r1:Way{dist:14}]->(b)CREATE (b)-[r2:Way{dist:9}]->(e)CREATE (e)-[r4:Way{dist:6}]->(f)CREATE (f)-[r5:Way{dist:9}]->(c)CREATE (b)-[r6:Way{dist:11}]->(e)CREATE (c)-[r7:Way{dist:9}]->(a)CREATE (c)-[r8:Way{dist:10}]->(d)CREATE (a)-[r9:Way{dist:7}]->(d)CREATE (d)-[r10:Way{dist:15}]->(f)Adrian Onet -2015Graph DatabasesCypher in action

ACITYFCITYECITYDCBCITYWay{dist:14}Way{dist:9}Way{dist:2}Way{dist:10}Way{dist:9}Way{dist:7}Way{dist:11}Way{dist:15}Way{dist:6}CREATE (a:CITY{name:"a"})CREATE (b:CITY{name:"b"})CREATE (c:CITY{name:"c"})CREATE (d:CITY{name:"d"})CREATE (e:CITY{name:"e"})CREATE (f:CITY{name:"f"})CREATE (a)-[r1:Way{dist:14}]->(b)CREATE (b)-[r2:Way{dist:9}]->(e)CREATE (e)-[r4:Way{dist:6}]->(f)CREATE (f)-[r5:Way{dist:9}]->(c)CREATE (b)-[r6:Way{dist:11}]->(e)CREATE (c)-[r7:Way{dist:9}]->(a)CREATE (c)-[r8:Way{dist:10}]->(d)CREATE (a)-[r9:Way{dist:7}]->(d)CREATE (d)-[r10:Way{dist:15}]->(f)CREATE (b)-[r11:Way{dist:2}]->(c)Adrian Onet -2015Graph DatabasesCypher shortest path problem

ACITYFCITYECITYDCBCITYWay{dist:14}Way{dist:9}Way{dist:2}Way{dist:10}Way{dist:9}Way{dist:7}Way{dist:11}Way{dist:15}Way{dist:6}Adrian Onet -2015Graph DatabasesCypher shortest path problem

ACITYFCITYECITYDCBCITYWay{dist:14}Way{dist:9}Way{dist:2}Way{dist:10}Way{dist:9}Way{dist:7}Way{dist:11}Way{dist:15}Way{dist:6}MATCH (a:CITY { name:"a" }), (e:CITY { name:"e" }), p=shortestPath((a)-[*]-(e))RETURN p AS path, length(p) AS lengthAdrian Onet -2015Graph DatabasesCypher shortest path problem

ACITYFCITYECITYDCBCITYWay{dist:14}Way{dist:9}Way{dist:2}Way{dist:10}Way{dist:9}Way{dist:7}Way{dist:11}Way{dist:15}Way{dist:6}MATCH (a:CITY { name:"a" }), (e:CITY { name:"e" }), p=shortestPath((a)-[*]-(e))RETURN p AS path, length(p) AS lengthpathlength[(0:CITY {name:"a"}), (0)-[0:Way {dist:14}]->(1), (1:CITY {name:"b"}), (1)-[4:Way {dist:11}]->(4), (4:CITY {name:"e"})]2

Adrian Onet -2015Graph DatabasesCypher shortest path problem

ACITYFCITYECITYDCBCITYWay{dist:14}Way{dist:9}Way{dist:2}Way{dist:10}Way{dist:9}Way{dist:7}Way{dist:11}Way{dist:15}Way{dist:6}MATCH (a:CITY { name:"a" }), (e:CITY { name:"e" }), p=shortestPath((a)-[*]-(e))RETURN p AS path, length(p) AS lengthpathlength[(0:CITY {name:"a"}), (0)-[0:Way {dist:14}]->(1), (1:CITY {name:"b"}), (1)-[4:Way {dist:11}]->(4), (4:CITY {name:"e"})]2

NOT CORRECT!!!Adrian Onet -2015Graph DatabasesCypher shortest path problem

ACITYFCITYECITYDCBCITYWay{dist:14}Way{dist:9}Way{dist:2}Way{dist:10}Way{dist:9}Way{dist:7}Way{dist:11}Way{dist:15}Way{dist:6}MATCH p=(:CITY { name:"a" })-[rels:Way*]-(:CITY { name:"e" }) RETURN p AS shortestPath, REDUCE(dist=0, rel IN rels(p)|dist+rel.dist) AS distance ORDER BY distance ASC LIMIT 1

Adrian Onet -2015Graph DatabasesCypher shortest path problem

ACITYFCITYECITYDCBCITYWay{dist:14}Way{dist:9}Way{dist:2}Way{dist:10}Way{dist:9}Way{dist:7}Way{dist:11}Way{dist:15}Way{dist:6}MATCH p=(:CITY { name:"a" })-[rels:Way*]-(:CITY { name:"e" }) RETURN p AS shortestPath, REDUCE(dist=0, rel IN rels(p)|dist+rel.dist) AS distance ORDER BY distance ASC LIMIT 1shortestPathdistance[(0:CITY {name:"a"}), (2)-[5:Way {dist:9}]->(0), (2:CITY {name:"c"}), (1)-[9:Way {dist:2}]->(2), (1:CITY {name:"b"}), (1)-[1:Way {dist:9}]->(4), (4:CITY {name:"e"})]20

Adrian Onet -2015Graph DatabasesCypher find all cliques of size 3

AFEDCB

Search: Adrian Onet -2015Graph DatabasesCypher find all cliques of size 3

AFEDCB

Search: Adrian Onet -2015Graph DatabasesCypher find all cliques of size 3

AFEDCB

Search: MATCH (a),(b),(c)WHERE (a)--(b) AND (b)--(c) AND (c)--(a)RETURN a.name+b.name+c.name AS resultAdrian Onet -2015Graph DatabasesCypher find all cliques of size 3

AFEDCB

resultabcacbacdadcbacbcacabcadcbacdacdfcfddacdcadcfdfcfcdfdcSearch: MATCH (a),(b),(c)WHERE (a)--(b) AND (b)--(c) AND (c)--(a)RETURN a.name+b.name+c.name AS resultAdrian Onet -2015Graph DatabasesCypher find all cliques of size 3

AFEDCB

resultabcacbacdadcbacbcacabcadcbacdacdfcfddacdcadcfdfcfcdfdcSearch: MATCH (a),(b),(c)WHERE (a)--(b) AND (b)--(c) AND (c)--(a)RETURN a.name+b.name+c.name AS resultAdrian Onet -2015Graph DatabasesCypher find all cliques of size 3

AFEDCB

Search: MATCH (a),(b),(c) WHERE (a)--(b) AND (b)--(c) AND (c)--(a) RETURN DISTINCT CASE WHEN a.name