SlideShare uma empresa Scribd logo
1 de 85
Baixar para ler offline
Conheça seu primeiro
banco de dados orientado
       a GRAFOS
  Jean Carlo Nascimento aka Suissa
El Suissa
              nosqlbr.com.br
             jquerybrasil.org
          frontendbrasil.com.br
         javascriptbrasil.com.br
       comoprogramarphp.com.br
            github.com/suissa
             about.me/suissa
                @osuissa
GRAFO
 WTF?
parent_id é um grafo
Quem inventou isso?
Euler foi um dos mais
 prolíficos matemáticos,
calcula-se que toda a sua
 obra reunida teria entre
    60 e 80 volumes.
  Fonte: Wikipedia, mas eu boto fé!
Leonhard Euler
●   Número de Euler
●   Fórmula de Euler
●   Constante de Euler-Mascheroni
●   Conjectura de Euler
●   Igualdade de Euler
●   Teorema de Euler
●   Teoria dos grafos
Paguei pau.
De onde surgiu esse
     manolo?
Por que ele fez isso?
Por quê?!
Ah é nessa época não tinha internet.
Sete pontes de
 Königsberg
Neo4J
●   Transações ACID
●   32 bilhões de nós
●   32 bilhões de relacionamentos
●   64 bilhoões de propriedades
●   REST API ou JVM Embedded
Mas isso não é muito
       novo?
Modelo Relacional
1970
Grafos
1736
Tudo muito bonito mas
  qual a diferença?
O custo da busca local de
   um grafo continua o
mesmo independente do
      seu tamanho.
Cypher
REST API
  AMEN!
Criar um novo nó vazio
POST http://localhost:7474/db/data/node
201 Created

POST http://localhost:7474/db/data/node {"nome":"Suissa"}
201 Created
Ler um nó
GET http://localhost:7474/db/data/node/27
200 Ok

GET http://localhost:7474/db/data/node/666
404 Not Found
Deleta um nó
DELETE http://localhost:7474/db/data/node/26
204 No Content
*Um nó com relacionamento não pode ser deletado

POST http://localhost:7474/db/data/node {"name":"NoSQL"}
POST http://localhost:7474/db/data/node/27/relationships {"to" :
"http://localhost:7474/db/data/node/28", "type" : "Evangeliza"}
DELETE http://localhost:7474/db/data/node/27
409 Conflict
Primeiro o relacionamento
DELETE http://localhost:7474/db/data/relationship/1
204 No Content

DELETE http://localhost:7474/db/data/node/27
204 No Content

E para deletar todos os nós?
Adicionando propriedades
POST http://localhost:7474/db/data/node
201 Created

PUT http://localhost:7474/db/data/node/29/properties/idade 28
204 No Content

PUT http://localhost:7474/db/data/node/29/properties {"nome":"
Suissa", "idade":28, "cursos":["neo4j", "mongodb"]}

*Um valor de propriedade não pode ser nulo ou um objeto
JSON.
Adicionando propriedades
Estes dois comandos irão falhar:
PUT http://localhost:7474/db/data/node/29/properties {"nome":"
Suissa", "idade":28, "cursos":null}
PUT http://localhost:7474/db/data/node/29/properties {"nome":"
Suissa", "idade":28, "cursos":{"nosql":"mongodb", "nosql":"
neo4j"}}

Mas estes irão funcionar
PUT http://localhost:7474/db/data/node/29/properties {"nome":"
Suissa", "idade":28, "cursos":""}
PUT http://localhost:7474/db/data/node/29/properties {"nome":"
Suissa", "idade":28, "cursos": "{"nosql":"mongodb", "nosql":"
neo4j"}" }
Modificando uma propriedade
PUT http://localhost:7474/db/data/node/29/properties/nome
"Cumpadi Uóxinton"
204 No Content

PUT http://localhost:7474/db/data/node/29/properties
{"nome": "Cumpadi Uóxinton"}
204 No Content
Deletando uma propriedade
DELETE http://localhost:7474/db/data/node/29/properties/cursos

Deletando todas as propriedades
DELETE http://localhost:7474/db/data/node/29/properties
Atravessando nós
POST http://localhost:7474/db/data/node/13/traverse/node
Accept: application/json
Content-Type: application/json
{
   "order": "breadth_first",
      "return_filter": {
      "body": "position.endNode().getProperty('name').toLowerCase().contains('t')", "language":
"javascript"
   },
      "prune_evaluator": {
      "body": "position.length() > 10", "language": "javascript"
   },       "uniqueness": "node_global",
      "relationships": [{
       "direction": "all",
          "type": "knows"
        }, {
       "direction": "all",
          "type": "loves"
       }],
      "max_depth": 3
}
Atravessando relacionamentos
POST http://localhost:7474/db/data/node/6/traverse/relationship
Accept: application/json
Content-Type: application/json
{
  "order" : "breadth_first",
  "uniqueness" : "none",
  "return_filter" : {
    "language" : "builtin",
    "name" : "all"
  }
}
Atravessando relacionamentos
[{
 "start" : "http://localhost:7474/db/data/node/6",
 "data" : {
 },
 "self" : "http://localhost:7474/db/data/relationship/1",
 "property" : "http://localhost:7474/db/data/relationship/1/properties/{key}",
 "properties" : "http://localhost:7474/db/data/relationship/1/properties",
 "type" : "know",
 "extensions" : {
 },
 "end" : "http://localhost:7474/db/data/node/5"
}, {
 "start" : "http://localhost:7474/db/data/node/6",
 "data" : {
 },
 "self" : "http://localhost:7474/db/data/relationship/2",
 "property" : "http://localhost:7474/db/data/relationship/2/properties/{key}",
 "properties" : "http://localhost:7474/db/data/relationship/2/properties",
 "type" : "own",
 "extensions" : {
 },
 "end" : "http://localhost:7474/db/data/node/4"
}]
Atravessando caminhos
POST http://localhost:7474/db/data/node/9/traverse/path
Accept: application/json
Content-Type: application/json
{
  "order" : "breadth_first",
  "uniqueness" : "none",
  "return_filter" : {
    "language" : "builtin",
    "name" : "all"
  }
}
Atravessando caminhos
[{
 "start" : "http://localhost:7474/db/data/node/9",
 "nodes" : [ "http://localhost:7474/db/data/node/9" ],
 "length" : 0,
 "relationships" : [ ],
 "end" : "http://localhost:7474/db/data/node/9"
}, {
 "start" : "http://localhost:7474/db/data/node/9",
 "nodes" : [ "http://localhost:7474/db/data/node/9", "http://localhost:7474/db/data/node/8" ],
 "length" : 1,
 "relationships" : [ "http://localhost:7474/db/data/relationship/3" ],
 "end" : "http://localhost:7474/db/data/node/8"
}, {
 "start" : "http://localhost:7474/db/data/node/9",
 "nodes" : [ "http://localhost:7474/db/data/node/9", "http://localhost:7474/db/data/node/7" ],
 "length" : 1,
 "relationships" : [ "http://localhost:7474/db/data/relationship/4" ],
 "end" : "http://localhost:7474/db/data/node/7"
}]
Todos os comandos
também funcionam para
      as relações
  Só trocar node por relationship
Todos os tipos de relacionamentos
GET http://localhost:7474/db/data/relationship/types
200 OK
["Evangeliza","CONHECE","Ama"]

*Uma vez criado um relacionamento ele não pode mais ser
deletado
E o PHP mano?
cURL
Alternativas
● https://github.com/onewheelgood/Neo4J-REST-PHP-
  API-client
● https://github.com/lphuberdeau/Neo4j-PHP-OGM
● https://github.com/jadell/neo4jphp
Neo4J.php
use EverymanNeo4jClient,
   EverymanNeo4jTransport,
   EverymanNeo4jNode,
   EverymanNeo4jRelationship;

   $client = new Client(new Transport('localhost', 7474));
Neo4J.php
$keanu = new Node($client);
$keanu->setProperty('name', 'Keanu Reeves')->save();

$laurence = new Node($client);
$laurence->setProperty('name', 'Laurence Fishburne')->save();

$matrix = new Node($client);
$matrix->setProperty('title', 'The Matrix')->save();

$constantine = new Node($client);
$constantine>setProperty('title', 'Constantine')->save();
Neo4J.php
$keanu->relateTo($matrix, 'IN')->save();
$keanu->relateTo($constantine, 'IN')->save();
$laurence->relateTo($matrix, 'IN')->save();

echo $keanu->getProperty('name') . " filmou:n";
$relationships = $laurence->getRelationships('IN');
foreach ($relationships as $relationship) {
   $movie = $relationship->getEndNode();
   echo "t" . $movie->getProperty('title') . "n";
}
Object Graph Model
function findRecommendations(User $user){
    return $em->createCypherQuery()
          ->startWithNode('user', $user)
          ->match('user -[:follow]-> followedBy <-[:follow]- similarInterest')
          ->match('similarInterest -[:follow]-> potentialMatch')
          ->end('potentialMatch', 'count(*)')
          ->order('count(*) DESC')
          ->limit(10)
          ->getList();
}
Perguntas?
Conheça seu primeiro banco de dados orientado a GRAFOS

Mais conteúdo relacionado

Mais procurados

“Web Spiders” – Automação para Web Hacking
“Web Spiders” – Automação para Web Hacking“Web Spiders” – Automação para Web Hacking
“Web Spiders” – Automação para Web HackingConviso Application Security
 
Escreva aplicações web assíncronas com python3 + tornado
Escreva aplicações web assíncronas com python3 + tornadoEscreva aplicações web assíncronas com python3 + tornado
Escreva aplicações web assíncronas com python3 + tornadoWilson Júnior
 
Golang para desenvolvedores pragmáticos parte 2
Golang para desenvolvedores pragmáticos  parte 2Golang para desenvolvedores pragmáticos  parte 2
Golang para desenvolvedores pragmáticos parte 2Wilson Júnior
 
Curso mongo db com php
Curso mongo db com phpCurso mongo db com php
Curso mongo db com phpSuissa
 
Go Lang para desenvolvedores pragmáticos (parte 1)
Go Lang para desenvolvedores pragmáticos (parte 1)Go Lang para desenvolvedores pragmáticos (parte 1)
Go Lang para desenvolvedores pragmáticos (parte 1)Wilson Júnior
 
Curso PHP - 1a. Aula (2013.2)
Curso PHP - 1a. Aula (2013.2)Curso PHP - 1a. Aula (2013.2)
Curso PHP - 1a. Aula (2013.2)Jonata Weber
 

Mais procurados (10)

Workshop de ELK - EmergiNet
Workshop de ELK - EmergiNetWorkshop de ELK - EmergiNet
Workshop de ELK - EmergiNet
 
“Web Spiders” – Automação para Web Hacking
“Web Spiders” – Automação para Web Hacking“Web Spiders” – Automação para Web Hacking
“Web Spiders” – Automação para Web Hacking
 
Escreva aplicações web assíncronas com python3 + tornado
Escreva aplicações web assíncronas com python3 + tornadoEscreva aplicações web assíncronas com python3 + tornado
Escreva aplicações web assíncronas com python3 + tornado
 
Golang para desenvolvedores pragmáticos parte 2
Golang para desenvolvedores pragmáticos  parte 2Golang para desenvolvedores pragmáticos  parte 2
Golang para desenvolvedores pragmáticos parte 2
 
Node.js: serious business
Node.js: serious businessNode.js: serious business
Node.js: serious business
 
Curso mongo db com php
Curso mongo db com phpCurso mongo db com php
Curso mongo db com php
 
Go Lang para desenvolvedores pragmáticos (parte 1)
Go Lang para desenvolvedores pragmáticos (parte 1)Go Lang para desenvolvedores pragmáticos (parte 1)
Go Lang para desenvolvedores pragmáticos (parte 1)
 
Curso PHP - 1a. Aula (2013.2)
Curso PHP - 1a. Aula (2013.2)Curso PHP - 1a. Aula (2013.2)
Curso PHP - 1a. Aula (2013.2)
 
Doctrine for Dummies
Doctrine for DummiesDoctrine for Dummies
Doctrine for Dummies
 
Começando com ruby
Começando com rubyComeçando com ruby
Começando com ruby
 

Semelhante a Conheça seu primeiro banco de dados orientado a GRAFOS

Palestra CouchDB III ENSOL
Palestra CouchDB III ENSOLPalestra CouchDB III ENSOL
Palestra CouchDB III ENSOLAllisson Azevedo
 
Novidades do elasticsearch 2.0 e como usá-lo com PHP
Novidades do elasticsearch 2.0 e como usá-lo com PHPNovidades do elasticsearch 2.0 e como usá-lo com PHP
Novidades do elasticsearch 2.0 e como usá-lo com PHPLuiz Henrique Zambom Santana
 
Redis um banco chave valor
Redis um banco chave valorRedis um banco chave valor
Redis um banco chave valorKinn Julião
 
Desenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBDesenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBAri Stopassola Junior
 
Você não deveria escrever uma API para isso
Você não deveria escrever uma API para issoVocê não deveria escrever uma API para isso
Você não deveria escrever uma API para issoJunior Conte
 
Projeto Octopus - Database Sharding para ActiveRecord
Projeto Octopus - Database Sharding para ActiveRecordProjeto Octopus - Database Sharding para ActiveRecord
Projeto Octopus - Database Sharding para ActiveRecordtchandy
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAThiago Cifani
 
Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril
Como um verdadeiro sistema REST funciona: arquitetura e performance na AbrilComo um verdadeiro sistema REST funciona: arquitetura e performance na Abril
Como um verdadeiro sistema REST funciona: arquitetura e performance na AbrilLuis Cipriani
 
XML Free Programming - Brazil
XML Free Programming - BrazilXML Free Programming - Brazil
XML Free Programming - BrazilStephen Chin
 
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...Luis Cipriani
 
Zabbix Conference LatAm 2019 - Automação: Ganhando produtividade
Zabbix Conference LatAm 2019 - Automação: Ganhando produtividadeZabbix Conference LatAm 2019 - Automação: Ganhando produtividade
Zabbix Conference LatAm 2019 - Automação: Ganhando produtividadeIgor Nicoli
 
CouchDB vs Postgres em Rails
CouchDB vs Postgres em RailsCouchDB vs Postgres em Rails
CouchDB vs Postgres em RailsJuan Maiz
 
CouchDB vs PostgreSQL no Rails
CouchDB vs PostgreSQL no RailsCouchDB vs PostgreSQL no Rails
CouchDB vs PostgreSQL no RailsJohalf Farina
 
Construindo sua primeira ontologia
Construindo sua primeira ontologiaConstruindo sua primeira ontologia
Construindo sua primeira ontologiaRômulo Jales
 
Ruby on rails gds 2011
Ruby on rails   gds 2011Ruby on rails   gds 2011
Ruby on rails gds 2011JogosUnisinos
 

Semelhante a Conheça seu primeiro banco de dados orientado a GRAFOS (20)

Palestra CouchDB III ENSOL
Palestra CouchDB III ENSOLPalestra CouchDB III ENSOL
Palestra CouchDB III ENSOL
 
Novidades do elasticsearch 2.0 e como usá-lo com PHP
Novidades do elasticsearch 2.0 e como usá-lo com PHPNovidades do elasticsearch 2.0 e como usá-lo com PHP
Novidades do elasticsearch 2.0 e como usá-lo com PHP
 
Redis um banco chave valor
Redis um banco chave valorRedis um banco chave valor
Redis um banco chave valor
 
PHP GERAL
PHP GERALPHP GERAL
PHP GERAL
 
Desenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDBDesenvolvimento de aplicações PHP com MongoDB
Desenvolvimento de aplicações PHP com MongoDB
 
Você não deveria escrever uma API para isso
Você não deveria escrever uma API para issoVocê não deveria escrever uma API para isso
Você não deveria escrever uma API para isso
 
Projeto Octopus - Database Sharding para ActiveRecord
Projeto Octopus - Database Sharding para ActiveRecordProjeto Octopus - Database Sharding para ActiveRecord
Projeto Octopus - Database Sharding para ActiveRecord
 
Palestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVAPalestra Desenvolvimento Ágil para Web com ROR UVA
Palestra Desenvolvimento Ágil para Web com ROR UVA
 
Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril
Como um verdadeiro sistema REST funciona: arquitetura e performance na AbrilComo um verdadeiro sistema REST funciona: arquitetura e performance na Abril
Como um verdadeiro sistema REST funciona: arquitetura e performance na Abril
 
XML Free Programming - Brazil
XML Free Programming - BrazilXML Free Programming - Brazil
XML Free Programming - Brazil
 
Conhecendo Ror
Conhecendo RorConhecendo Ror
Conhecendo Ror
 
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...
Alexandria: um Sistema de Sistemas para Publicação de Conteúdo Digital utiliz...
 
Zabbix Conference LatAm 2019 - Automação: Ganhando produtividade
Zabbix Conference LatAm 2019 - Automação: Ganhando produtividadeZabbix Conference LatAm 2019 - Automação: Ganhando produtividade
Zabbix Conference LatAm 2019 - Automação: Ganhando produtividade
 
CouchDB vs Postgres em Rails
CouchDB vs Postgres em RailsCouchDB vs Postgres em Rails
CouchDB vs Postgres em Rails
 
CouchDB vs PostgreSQL no Rails
CouchDB vs PostgreSQL no RailsCouchDB vs PostgreSQL no Rails
CouchDB vs PostgreSQL no Rails
 
Nosql4java
Nosql4javaNosql4java
Nosql4java
 
Construindo sua primeira ontologia
Construindo sua primeira ontologiaConstruindo sua primeira ontologia
Construindo sua primeira ontologia
 
Realtime com node.js e socket.io
Realtime com node.js e socket.ioRealtime com node.js e socket.io
Realtime com node.js e socket.io
 
Ruby on rails gds 2011
Ruby on rails   gds 2011Ruby on rails   gds 2011
Ruby on rails gds 2011
 
Minicurso Ruby on Rails
Minicurso Ruby on RailsMinicurso Ruby on Rails
Minicurso Ruby on Rails
 

Mais de Suissa

ES6 funcional TDC - Suissa
ES6 funcional TDC - SuissaES6 funcional TDC - Suissa
ES6 funcional TDC - SuissaSuissa
 
TypeScript - Olhe teu tipo, script slides
TypeScript - Olhe teu tipo, script slidesTypeScript - Olhe teu tipo, script slides
TypeScript - Olhe teu tipo, script slidesSuissa
 
Mongoose - Melhores práticas usando MongoDB e Node.js
Mongoose - Melhores práticas usando MongoDB e Node.jsMongoose - Melhores práticas usando MongoDB e Node.js
Mongoose - Melhores práticas usando MongoDB e Node.jsSuissa
 
Atomic design
Atomic design Atomic design
Atomic design Suissa
 
Palestra node.js
Palestra   node.js Palestra   node.js
Palestra node.js Suissa
 
Be MEAN JSConf Uruguay - Suissa
Be MEAN JSConf Uruguay - SuissaBe MEAN JSConf Uruguay - Suissa
Be MEAN JSConf Uruguay - SuissaSuissa
 
Atomic design
Atomic designAtomic design
Atomic designSuissa
 
Be MEAN
Be MEANBe MEAN
Be MEANSuissa
 
Be mean
Be meanBe mean
Be meanSuissa
 
Devcast node.js e mongo db o casamento perfeito
Devcast   node.js e mongo db o casamento perfeitoDevcast   node.js e mongo db o casamento perfeito
Devcast node.js e mongo db o casamento perfeitoSuissa
 
Secot banco de dados no sql de código aberto
Secot   banco de dados no sql de código abertoSecot   banco de dados no sql de código aberto
Secot banco de dados no sql de código abertoSuissa
 
Flisol - Nodejs e MongoDb o casamento perfeito
Flisol - Nodejs e MongoDb o casamento perfeitoFlisol - Nodejs e MongoDb o casamento perfeito
Flisol - Nodejs e MongoDb o casamento perfeitoSuissa
 
Javascript moderno
Javascript modernoJavascript moderno
Javascript modernoSuissa
 
DevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsDevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsSuissa
 
DevDay - MongoDb no mundo real - slides
DevDay - MongoDb no mundo real - slidesDevDay - MongoDb no mundo real - slides
DevDay - MongoDb no mundo real - slidesSuissa
 
7 masters wordpress - advanced queries
7 masters   wordpress - advanced queries7 masters   wordpress - advanced queries
7 masters wordpress - advanced queriesSuissa
 
Javascript moderno
Javascript modernoJavascript moderno
Javascript modernoSuissa
 
Fisl banco de dados no sql de código aberto
Fisl   banco de dados no sql de código abertoFisl   banco de dados no sql de código aberto
Fisl banco de dados no sql de código abertoSuissa
 
Mongo db no mundo real slides
Mongo db no mundo real   slidesMongo db no mundo real   slides
Mongo db no mundo real slidesSuissa
 
Html5 storage api
Html5 storage apiHtml5 storage api
Html5 storage apiSuissa
 

Mais de Suissa (20)

ES6 funcional TDC - Suissa
ES6 funcional TDC - SuissaES6 funcional TDC - Suissa
ES6 funcional TDC - Suissa
 
TypeScript - Olhe teu tipo, script slides
TypeScript - Olhe teu tipo, script slidesTypeScript - Olhe teu tipo, script slides
TypeScript - Olhe teu tipo, script slides
 
Mongoose - Melhores práticas usando MongoDB e Node.js
Mongoose - Melhores práticas usando MongoDB e Node.jsMongoose - Melhores práticas usando MongoDB e Node.js
Mongoose - Melhores práticas usando MongoDB e Node.js
 
Atomic design
Atomic design Atomic design
Atomic design
 
Palestra node.js
Palestra   node.js Palestra   node.js
Palestra node.js
 
Be MEAN JSConf Uruguay - Suissa
Be MEAN JSConf Uruguay - SuissaBe MEAN JSConf Uruguay - Suissa
Be MEAN JSConf Uruguay - Suissa
 
Atomic design
Atomic designAtomic design
Atomic design
 
Be MEAN
Be MEANBe MEAN
Be MEAN
 
Be mean
Be meanBe mean
Be mean
 
Devcast node.js e mongo db o casamento perfeito
Devcast   node.js e mongo db o casamento perfeitoDevcast   node.js e mongo db o casamento perfeito
Devcast node.js e mongo db o casamento perfeito
 
Secot banco de dados no sql de código aberto
Secot   banco de dados no sql de código abertoSecot   banco de dados no sql de código aberto
Secot banco de dados no sql de código aberto
 
Flisol - Nodejs e MongoDb o casamento perfeito
Flisol - Nodejs e MongoDb o casamento perfeitoFlisol - Nodejs e MongoDb o casamento perfeito
Flisol - Nodejs e MongoDb o casamento perfeito
 
Javascript moderno
Javascript modernoJavascript moderno
Javascript moderno
 
DevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webappsDevDay - O elo perdido: sincronizando webapps
DevDay - O elo perdido: sincronizando webapps
 
DevDay - MongoDb no mundo real - slides
DevDay - MongoDb no mundo real - slidesDevDay - MongoDb no mundo real - slides
DevDay - MongoDb no mundo real - slides
 
7 masters wordpress - advanced queries
7 masters   wordpress - advanced queries7 masters   wordpress - advanced queries
7 masters wordpress - advanced queries
 
Javascript moderno
Javascript modernoJavascript moderno
Javascript moderno
 
Fisl banco de dados no sql de código aberto
Fisl   banco de dados no sql de código abertoFisl   banco de dados no sql de código aberto
Fisl banco de dados no sql de código aberto
 
Mongo db no mundo real slides
Mongo db no mundo real   slidesMongo db no mundo real   slides
Mongo db no mundo real slides
 
Html5 storage api
Html5 storage apiHtml5 storage api
Html5 storage api
 

Conheça seu primeiro banco de dados orientado a GRAFOS

  • 1. Conheça seu primeiro banco de dados orientado a GRAFOS Jean Carlo Nascimento aka Suissa
  • 2.
  • 3. El Suissa nosqlbr.com.br jquerybrasil.org frontendbrasil.com.br javascriptbrasil.com.br comoprogramarphp.com.br github.com/suissa about.me/suissa @osuissa
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 14.
  • 15. Euler foi um dos mais prolíficos matemáticos, calcula-se que toda a sua obra reunida teria entre 60 e 80 volumes. Fonte: Wikipedia, mas eu boto fé!
  • 16. Leonhard Euler ● Número de Euler ● Fórmula de Euler ● Constante de Euler-Mascheroni ● Conjectura de Euler ● Igualdade de Euler ● Teorema de Euler ● Teoria dos grafos
  • 17.
  • 19. De onde surgiu esse manolo?
  • 20.
  • 21.
  • 22. Por que ele fez isso?
  • 23.
  • 24. Por quê?! Ah é nessa época não tinha internet.
  • 25. Sete pontes de Königsberg
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32. Neo4J ● Transações ACID ● 32 bilhões de nós ● 32 bilhões de relacionamentos ● 64 bilhoões de propriedades ● REST API ou JVM Embedded
  • 33. Mas isso não é muito novo?
  • 34.
  • 36. 1970
  • 38. 1736
  • 39.
  • 40. Tudo muito bonito mas qual a diferença?
  • 41. O custo da busca local de um grafo continua o mesmo independente do seu tamanho.
  • 42.
  • 43.
  • 44.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54. REST API AMEN!
  • 55. Criar um novo nó vazio POST http://localhost:7474/db/data/node 201 Created POST http://localhost:7474/db/data/node {"nome":"Suissa"} 201 Created
  • 56. Ler um nó GET http://localhost:7474/db/data/node/27 200 Ok GET http://localhost:7474/db/data/node/666 404 Not Found
  • 57. Deleta um nó DELETE http://localhost:7474/db/data/node/26 204 No Content *Um nó com relacionamento não pode ser deletado POST http://localhost:7474/db/data/node {"name":"NoSQL"} POST http://localhost:7474/db/data/node/27/relationships {"to" : "http://localhost:7474/db/data/node/28", "type" : "Evangeliza"} DELETE http://localhost:7474/db/data/node/27 409 Conflict
  • 58.
  • 59. Primeiro o relacionamento DELETE http://localhost:7474/db/data/relationship/1 204 No Content DELETE http://localhost:7474/db/data/node/27 204 No Content E para deletar todos os nós?
  • 60.
  • 61. Adicionando propriedades POST http://localhost:7474/db/data/node 201 Created PUT http://localhost:7474/db/data/node/29/properties/idade 28 204 No Content PUT http://localhost:7474/db/data/node/29/properties {"nome":" Suissa", "idade":28, "cursos":["neo4j", "mongodb"]} *Um valor de propriedade não pode ser nulo ou um objeto JSON.
  • 62. Adicionando propriedades Estes dois comandos irão falhar: PUT http://localhost:7474/db/data/node/29/properties {"nome":" Suissa", "idade":28, "cursos":null} PUT http://localhost:7474/db/data/node/29/properties {"nome":" Suissa", "idade":28, "cursos":{"nosql":"mongodb", "nosql":" neo4j"}} Mas estes irão funcionar PUT http://localhost:7474/db/data/node/29/properties {"nome":" Suissa", "idade":28, "cursos":""} PUT http://localhost:7474/db/data/node/29/properties {"nome":" Suissa", "idade":28, "cursos": "{"nosql":"mongodb", "nosql":" neo4j"}" }
  • 63. Modificando uma propriedade PUT http://localhost:7474/db/data/node/29/properties/nome "Cumpadi Uóxinton" 204 No Content PUT http://localhost:7474/db/data/node/29/properties {"nome": "Cumpadi Uóxinton"} 204 No Content
  • 64. Deletando uma propriedade DELETE http://localhost:7474/db/data/node/29/properties/cursos Deletando todas as propriedades DELETE http://localhost:7474/db/data/node/29/properties
  • 65.
  • 66. Atravessando nós POST http://localhost:7474/db/data/node/13/traverse/node Accept: application/json Content-Type: application/json { "order": "breadth_first", "return_filter": { "body": "position.endNode().getProperty('name').toLowerCase().contains('t')", "language": "javascript" }, "prune_evaluator": { "body": "position.length() > 10", "language": "javascript" }, "uniqueness": "node_global", "relationships": [{ "direction": "all", "type": "knows" }, { "direction": "all", "type": "loves" }], "max_depth": 3 }
  • 67.
  • 68. Atravessando relacionamentos POST http://localhost:7474/db/data/node/6/traverse/relationship Accept: application/json Content-Type: application/json { "order" : "breadth_first", "uniqueness" : "none", "return_filter" : { "language" : "builtin", "name" : "all" } }
  • 69. Atravessando relacionamentos [{ "start" : "http://localhost:7474/db/data/node/6", "data" : { }, "self" : "http://localhost:7474/db/data/relationship/1", "property" : "http://localhost:7474/db/data/relationship/1/properties/{key}", "properties" : "http://localhost:7474/db/data/relationship/1/properties", "type" : "know", "extensions" : { }, "end" : "http://localhost:7474/db/data/node/5" }, { "start" : "http://localhost:7474/db/data/node/6", "data" : { }, "self" : "http://localhost:7474/db/data/relationship/2", "property" : "http://localhost:7474/db/data/relationship/2/properties/{key}", "properties" : "http://localhost:7474/db/data/relationship/2/properties", "type" : "own", "extensions" : { }, "end" : "http://localhost:7474/db/data/node/4" }]
  • 70.
  • 71. Atravessando caminhos POST http://localhost:7474/db/data/node/9/traverse/path Accept: application/json Content-Type: application/json { "order" : "breadth_first", "uniqueness" : "none", "return_filter" : { "language" : "builtin", "name" : "all" } }
  • 72. Atravessando caminhos [{ "start" : "http://localhost:7474/db/data/node/9", "nodes" : [ "http://localhost:7474/db/data/node/9" ], "length" : 0, "relationships" : [ ], "end" : "http://localhost:7474/db/data/node/9" }, { "start" : "http://localhost:7474/db/data/node/9", "nodes" : [ "http://localhost:7474/db/data/node/9", "http://localhost:7474/db/data/node/8" ], "length" : 1, "relationships" : [ "http://localhost:7474/db/data/relationship/3" ], "end" : "http://localhost:7474/db/data/node/8" }, { "start" : "http://localhost:7474/db/data/node/9", "nodes" : [ "http://localhost:7474/db/data/node/9", "http://localhost:7474/db/data/node/7" ], "length" : 1, "relationships" : [ "http://localhost:7474/db/data/relationship/4" ], "end" : "http://localhost:7474/db/data/node/7" }]
  • 73. Todos os comandos também funcionam para as relações Só trocar node por relationship
  • 74. Todos os tipos de relacionamentos GET http://localhost:7474/db/data/relationship/types 200 OK ["Evangeliza","CONHECE","Ama"] *Uma vez criado um relacionamento ele não pode mais ser deletado
  • 75. E o PHP mano?
  • 76.
  • 77. cURL
  • 78.
  • 79. Alternativas ● https://github.com/onewheelgood/Neo4J-REST-PHP- API-client ● https://github.com/lphuberdeau/Neo4j-PHP-OGM ● https://github.com/jadell/neo4jphp
  • 80. Neo4J.php use EverymanNeo4jClient, EverymanNeo4jTransport, EverymanNeo4jNode, EverymanNeo4jRelationship; $client = new Client(new Transport('localhost', 7474));
  • 81. Neo4J.php $keanu = new Node($client); $keanu->setProperty('name', 'Keanu Reeves')->save(); $laurence = new Node($client); $laurence->setProperty('name', 'Laurence Fishburne')->save(); $matrix = new Node($client); $matrix->setProperty('title', 'The Matrix')->save(); $constantine = new Node($client); $constantine>setProperty('title', 'Constantine')->save();
  • 82. Neo4J.php $keanu->relateTo($matrix, 'IN')->save(); $keanu->relateTo($constantine, 'IN')->save(); $laurence->relateTo($matrix, 'IN')->save(); echo $keanu->getProperty('name') . " filmou:n"; $relationships = $laurence->getRelationships('IN'); foreach ($relationships as $relationship) { $movie = $relationship->getEndNode(); echo "t" . $movie->getProperty('title') . "n"; }
  • 83. Object Graph Model function findRecommendations(User $user){ return $em->createCypherQuery() ->startWithNode('user', $user) ->match('user -[:follow]-> followedBy <-[:follow]- similarInterest') ->match('similarInterest -[:follow]-> potentialMatch') ->end('potentialMatch', 'count(*)') ->order('count(*) DESC') ->limit(10) ->getList(); }