Vous êtes sur la page 1sur 86

BANCO DE DADOS ORIENTADO

A GRAFOS

Prof.: Ricardo da Silva Torres


rtorres@ic.unicamp.br
www.ic.unicamp.br/~rtorres
INF-0325 Maio de 2019
Objetivos da aula
2

◻ Aprender características e operações em banco de


dados orientado a grafos

◻ Estudar exemplos de inserção, consulta, atualização


e exclusão de dados no Neo4J
Grafos estão em toda parte
3

◻ Estrutura de dados útil e flexível

◻ Podem ser vislumbrados em muitas aplicações

Relações sociais, consumo e interesse de compra de


clientes, etc.
Motivação
4

◻ Alta necessidade de consultas e análises com dados


extensamente relacionados

◻ Facilitar compartilhamento de dados


Motivação
5

◻ Alta necessidade de consultas e análises com dados


extensamente relacionados
◻ Facilitar compartilhamento de dados
◻ Permitir relacionamentos com diferentes
propriedades
◻ Melhora performance para acesso a dados
conectados comparado a bancos relacionais e
outros NoSQLs
Relacionamentos
6

◻ BD relacionais não foram projetados para tornar


explícito o significado das relações entre dados
Consultas tendem a se tornar complexas quando se
necessita explorar a relação entre os dados
Relacionamentos
7

◻ BD relacionais não foram projetados para tornar


explícito o significado das relações entre dados
Consultas tendem a se tornar complexas quando se
necessita explorar a relação entre os dados

◻ Bancos NoSQL com uso de modelo agregado não


permitem modelar relacionados aprimorados entre
elementos de dados
Grafo com propriedades
8

◻ Nós com propriedades


(nó)

(nó {propriedade:valor})
Propriedade: valor
Grafo com propriedades
9

◻ Arestas com propriedades


(nó_1)-[aresta]->(nó_2)

aresta
nó_1 nó_2
Grafo com propriedades
10

◻ Arestas com propriedades


(nó_1)-[aresta]->(nó_2)

aresta
nó_1 nó_2

(nó_1)-[aresta {propriedade:valor}]->(nó_2)

aresta
nó_1 nó_2

Propriedade: valor
Modelo de BD orientado a grafos
11

◻ Vértice pode ter um


rótulo

◻ Vértices e arestas
possuem propriedades

◻ Arestas são direcionais


Rótulo de nós
12

◻ Importante para classificar/categorizar os nós


Exemplo
■ Usuários
■ Produtos
■ Pedidos

Pode-se adicionar mais de um rótulo no nó

◻ Agrupamento de nós
◻ Consulta de nós com o mesmo rótulo
Exemplo
13

Intention-based Information Retrieval of EHRs


Exemplo: sistema da universidade
14

nome: “João”
matricula: 201822
cpf: “555.666.444-55”
nascimento: 23/06/1912

aluno
Exemplo: sistema da universidade
15

nome: “João”
matricula: 201822
cpf: “555.666.444-55”
nascimento: 23/06/1912

aluno CURSA sala: 72


turma: “E”
nome: “algoritmos”
disciplina
Exemplo: sistema da universidade
16

nome: “João”
matricula: 201822
cpf: “555.666.444-55”
nascimento: 23/06/1912

aluno
CURSA sala: 72
turma: “E”
nome: “algoritmos”
CURSA disciplina
sala: 74
turma: “F”
disciplina

nome: “estrutura de dados"


Neo4J
17

◻ Sistema gerenciador de banco de dados em grafos

◻ Permite operações de inserção, consulta,


atualização e remoção de dados

◻ Linguagem de consulta em grafos (Cypher)


Permite consultar e atualizar o grafo
Justificativa de uso
18

◻ Grafos de propriedades capturam domínios


complexos de maneira flexível

◻ Banco de dados em grafos facilitam o


desenvolvimento e aplicações de software que
manipulam dados persistidos usando modelos em
grafos
19

Inserção
Criação de nós
20

◻ CREATE (variavel:TipoRótulo {prop1: valor1, prop2:


valor2,..., propn: valorn})
Criação de nós
21

◻ CREATE (variavel:TipoRótulo {prop1: valor1, prop2:


valor2,..., propn: valorn})

◻ Criando um nó sem rótulo


CREATE (a)
Criação de nós
22

◻ CREATE (variavel:TipoRótulo {prop1: valor1, prop2:


valor2,..., propn: valorn})

◻ Criando um nó sem rótulo variável


CREATE (a)
◻ Criando um nó com rótulo
CREATE (a:Pessoa) ou CREATE (a:Pessoa:Brasileiro)
Dois tipos de rótulos
Criação de nós
23

◻ CREATE (variavel:TipoRótulo {prop1: valor1, prop2:


valor2,..., propn: valorn})

◻ Criando um nó sem rótulo


CREATE (a)
◻ Criando um nó com rótulo
CREATE (a:Pessoa) ou CREATE (a:Pessoa:Brasileiro)
◻ Criando nó com rótulo e propriedades
CREATE(a:Pessoa {nome: ‘João’, idade: 25})
Exemplo de criação de nós
24

Empresa

Pessoa
Pessoa

Intention-based Information Retrieval of EHRs


Exemplo de criação de nós
25

◻ CREATE (anna:Pessoa {nome: ‘Ana’})


◻ CREATE (carol:Pessoa {nome: ‘Carol’})
◻ CREATE (bigco:Empresa {nome: ‘BigCo’})
Empresa

Pessoa
Pessoa
Criando nós com parâmetros para as
26
propriedades
◻ Parâmetro
{ "props" : { "name" : "Andres", "position" :
"Developer" } }

◻ Inserção do nó
CREATE (n:Person $props) RETURN n

◻ Resultado
Node[20]{name:"Andres",position:"Developer"}
Criação de arestas
27

◻ CREATE (nóOrigem)-
[:RótuloAresta {prop1: valor1, prop2: valor2,..., propn:
valorn}]->(nóDestino)

Tipo da aresta
Criação de arestas
28

◻ CREATE (nóOrigem)-
[:RótuloAresta {prop1: valor1, prop2: valor2,..., propn:
valorn}]->(nóDestino)

◻ Aresta sem propriedade


CREATE (a)-[:CONHECER]->(b)
Criação de arestas
29

◻ CREATE (nóOrigem)-
[:RótuloAresta {prop1: valor1, prop2: valor2,..., propn:
valorn}]->(nóDestino)

◻ Aresta sem propriedade


CREATE (a)-[:CONHECER]->(b)

◻ Aresta com propriedade


CREATE (a)-[:CONHECER {data: 2000}]->(b)
Exemplo de criação de arestas
30

◻ Anna -> BigCo


CREATE (anna)-[:employee_of {role:’developer’,
hired:01/03/2006}]->(bigco)
Exemplo de criação de arestas
31

◻ Carol -> BigCo


CREATE (carol)-[:employee_of {role:’research’,
hired:01/10/2008}]->(bigco)
Recomendações de nomes
32

◻ Rótulo de nós
:VehicleOwner em vez de :vehice_owner

◻ Tipos de relações
:OWNS_VEHICLE em vez de :ownsVehicle

◻ Case sensitive
:PERSON, :Person e :person são três rótulos diferentes

◻ 1first não é permitido enquanto first1 está OK


33

Consultas
Estrutura da clausula da consulta
34

◻ MATCH
O padrão no grafo a ser detectado

◻ WHERE
Adiciona restrições (filtros) ao padrão procurado

◻ RETURN
O que deve ser retornado como resultado
Uso do Match
35

◻ Retornar todos os nós do grafo


MATCH (n) RETURN n
Uso do Match
36

◻ Retornar todos os nós do grafo


MATCH (n) RETURN n

◻ Retorna nós com um tipo de rótulo


MATCH (n:Friend) User
RETURN n.name

Friend Friend Friend


Resultado
■ Dilshad
■ Cesar
■ Becky
Clausula RETURN
37

◻ Expressa o que se quer retornar como resultado do


padrão encontrado no grafo
Exemplo: Retornar um nó

MATCH (n {name: 'B'})


RETURN n

Resultado
■ Node[1]{name:"B"}
Uso do Match
38

◻ Retornar o nome dos amigos de Anders


MATCH (a { name: ‘Anders' })--(b)
RETURN b.name

User
Resultado
■ Dilshad
■ Cesar Friend Enemy
Friend
■ Becky
Uso do Match
39

◻ Retornar amigos de usuário com nome Anders


MATCH (:User { name: ' Anders' })--(fr:Friend)
RETURN fr.name Não considera o sentido
da aresta

Resultado User

■ Dilshad
■ Cesar
Friend Friend Enemy
Retornar o tipo da relação
40

◻ Qual o tipo do relacionamento existe a partir de


um usuário com nome Anders
MATCH (:User { name: ‘Anders' })-[r]->(fr)
RETURN type(r)
User

Resultado
■ “KNOWS” Friend Enemy
Friend
Consulta por tipo de relação
41

◻ Recupere o nome das pessoas que Anders conhece


MATCH (:User { name: ‘Anders' })-[r:KNOWS]->(fr)
RETURN fr.name

Resultado User
■ Dilshad
■ Cesar
■ Becky Friend Friend Enemy
Consulta por diversos tipos de relação
42

◻ Quais pessoas Anders conhece e trabalho junto?


MATCH (:User { name: ‘Anders' })-[:KNOWS|: COWORKER]
->(fr)
RETURN fr.name
User Friend
COWORKER
name =
Resultado ‘John’

■ Dilshad
Friend Friend Enemy
■ Cesar
■ Becky
■ John
Retornar o tipo da relação com espaço
43

◻ Existe relacionamento a partir de usuário com nome


Anders do tipo ‘MARRIED WITH’?
MATCH (:User { name: ‘Anders' })-[r:’MARRIED
WITH’]->(fr)
RETURN type(r) MARRIED WITH
User COWORKER Friend
name = name =
‘Maria’ ‘John’

Resultado Friend Friend Enemy


■ “MARRIED WITH”
Uso de múltiplas relações
44

◻ Recupere do usuário com nome


Anders seu colega de trabalho e
seu gerente name =
‘Paul’
MATCH (:User { name: ‘Anders' MANAGER
})-[:COWORKER]->(fr)<-[:MANAGER]-( User Friend
COWORKER
man) name =
‘John’
RETURN fr.name, man.name
Friend Friend Enemy

Resultado
■ “John”
■ “Paul”
Exemplo de uso do Match
45

◻ Encontre o nome dos amigos de


uma pessoa chamada John

MATCH (john {name:


'John'})-[:friend]->(fr)
RETURN fr.name

Resultado
■ “Joe”
■ “Sara”
Exemplo de uso do Match
46

◻ Encontre os amigos dos amigos de


uma pessoa chamada John

MATCH (john {name:


'John'})-[:friend]->()-[:friend]->(f
of) RETURN fof.name

Resultado
■ “Steve”
■ “Maria”
Clausula WHERE
47

◻ Usada para filtrar os resultados


Uso de operadores booleanos
48

◻ MATCH (n)
WHERE n.name = 'Peter’ OR n.age < 30
RETURN n.name, n.age

◻ Resultado
“Peter” 35
“Tobias” 25
Filtro por rótulo de nós
49

◻ MATCH (n)
WHERE n:Swedish
RETURN n.name, n.age

◻ Resultado
“Andres” 36
Filtro por propriedade de nós
50

◻ MATCH (n)
WHERE n.age > 30
RETURN n.name, n.age

◻ Resultado
“Andres” 36
“Peter” 35
Filtro por propriedade de arestas
51

◻ MATCH (n)-[k:KNOWS]->(f)
WHERE k.since < 2000
RETURN f.name, f.age

◻ Resultado
“Peter” 35
Filtro por cadeia de caracteres
52

◻ MATCH (n)
WHERE n.name STARTS WITH 'Pet'
RETURN n.name, n.age

◻ MATCH (n)
WHERE n.name ENDS WITH 'ter'
RETURN n.name, n.age

◻ MATCH (n)
WHERE n.name CONTAINS 'ete'
RETURN n.name, n.age
Clausula RETURN
53

◻ Expressa o que se quer retornar como resultado do


padrão encontrado no grafo
Retorno de nós
54

◻ Retornar um nó
MATCH (n { name: 'B' })
RETURN n

Resultado
■ Node[1]{name:"B"}
Retorno de relações
55

◻ MATCH (n { name: 'A' })-[r:KNOWS]->(c)


RETURN r

◻ Resultado
:KNOWS[0]{}
Retorno de propriedades
56

◻ MATCH (n { name: 'A' })


RETURN n.name

◻ Resultado
“A”
Retorno de todos os elementos
57

◻ MATCH p = (a { name: 'A' })-[r]->(b)


RETURN *

◻ Resultado
a b p r
Node[0]{name Node[1]{name (0)-[BLOCKS,1] :BLOCKS[1]{}
:"A",happy:"Ye :"B"} ->(1)
s!",age:55}
Node[0]{name Node[1]{name (0)-[KNOWS,0] :KNOWS[0]{}
:"A",happy:"Ye :"B"} ->(1)
s!",age:55}
Retorna outras expressões
58

◻ MATCH (a { name: 'A' })


RETURN a.age > 30, "I'm a literal", (a)-->()

◻ Resultado

a.age > 30 "I'm a literal" (a)-->()


true "I'm a literal" (0)-[BLOCKS,1]->(1), (0)-[KNOWS,0]->(1)
Retorna resultados distintos
59

◻ MATCH (a { name: 'A' })-->(b)


RETURN DISTINCT b

◻ Resultado
Node[1]{name:"B"}
Exemplo
60

◻ Encontre os amigos das pessoas cujo


nome inicia com ‘S’
Exemplo
61

◻ Encontre os amigos das pessoas cujo


nome inicia com ‘S’

MATCH (user)-[:friend]->(fr)

WHERE user.name IN ['Joe', 'John',


'Sara', 'Maria', 'Steve’]
AND fr.name =~ ‘S.*’

RETURN user.name, fr.name


Exemplo
62

◻ Encontre os amigos das pessoas cujo


nome inicia com ‘S’
MATCH (user)-[:friend]->(fr)
WHERE user.name IN ['Joe', 'John',
'Sara', 'Maria', 'Steve']
AND fr.name =~ ‘S.*’
RETURN user.name, fr.name

Resultado
| user.name | fr.name |
| "Joe" | "Steve" |
| "John" | "Sara" |
Consulta com parâmetro
63

◻ { "name" : "Johan" }

◻ MATCH (n:Person) WHERE n.name = $name RETURN n

◻ MATCH (n:Person { name: $name }) RETURN n


Consulta com parâmetro
64

◻ { "name" : "Johan" }

◻ MATCH (n:Person) WHERE n.name = $name RETURN n

◻ MATCH (n:Person { name: $name }) RETURN n

◻MATCH (n:Person)
WHERE n.name STARTS WITH $name RETURN n.name
Agregação
65

◻ Encontre as pessoas com nome John


que possuem mais de 3 amigos

MATCH (john {name:


'John'})-[:friend]-(fri)
WITH john, count(fri) AS friendsCount
WHERE friendsCount > 3
RETURN john, friendsCount
Clausula ORDER BY
66

◻ Ordena os resultados

◻ MATCH (n)
RETURN n.name, n.age
ORDER BY n.name
Clausula ORDER BY
67

◻ Ordem decrescente

◻ MATCH (n)
RETURN n.name, n.age
ORDER BY n.name DESC
Clausula ORDER BY
68

◻ Ordena combinando atributos

◻ MATCH (n)
RETURN n.name, n.age
ORDER BY n.age, n.name
Clausula SKIP
69

◻ Define inicio do resultado


Retorna um subconjunto a partir do quarto resultado

◻ MATCH (n)
RETURN n.name
ORDER BY n.name
SKIP 3
Clausula LIMIT
70

◻ Limita o número de resultados

◻ MATCH (n)
RETURN n.name
ORDER BY n.name
LIMIT 3
Clausula LIMIT
71

◻ Limita o número de resultados

◻ MATCH (n)
RETURN n.name
ORDER BY n.name
SKIP 1
LIMIT 2
72

Atualização
Clausula SET
73

◻ Atualiza rótulo de nós e propriedades de nós e


arestas
Clausula SET
74

◻ MATCH (n { name: 'Andres' })


SET n.surname = 'Taylor'
RETURN n.name, n.surname
Clausula SET
75

◻ MATCH (n { name: 'Andres' })


SET n.surname = 'Taylor'
RETURN n.name, n.surname

◻ MATCH (n { name: 'Andres' })


SET n.name = NULL
RETURN n.name, n.age
Uso de parâmetros na clausula SET
76

◻ { "surname" : "Taylor" }

◻ MATCH (n { name: 'Andres' })


SET n.surname = $surname
RETURN n.name, n.surname
Modifica o rótulo de um nó
77

◻ MATCH (n { name: 'Stefan' })


SET n:German
RETURN n.name, labels(n) AS labels
German

◻ Resultado
Stefan German
Clausula SET com agregação
78

◻ Atualiza o grafo com o resultado


da agregação

MATCH (john {name:


'John'})-[:friend]-(fr)
WITH john, count(fr) AS friendsCount
SET john.friendsCount = friendsCount
RETURN john.friendsCount
79

Remoção
Clausula DELETE
80

◻ Usada para remover elementos do grafo

◻ Remove um nó
◻ MATCH (n:Person { name: 'UNKNOWN' })

DELETE n
Remove nó com seus relacionamentos
81

◻ MATCH (n { name: 'Andres' })


DETACH DELETE n
Remove apenas relacionamentos
82

◻ MATCH (n { name: 'Andres' })-[r:KNOWS]->()


DELETE r
Remove todos elementos do grafo
83

◻MATCH (n)
DETACH DELETE n

CUIDADO!
Remove uma propriedade
84

◻ MATCH (a { name: 'Andres' })


REMOVE a.age
RETURN a.name, a.age
Síntese da aula
85

◻ Banco de dados orientado a grafos desenvolvem


um papel central para consultas apurados em
modelo de dados bem conectados

◻ Aprendemos operações de criação de elementos do


grafo, consulta, atualização e remoção
Referências
86

1. Pramod J. Sadalage, Martin Fowler. NoSQL


Distilled: A Brief Guide to the Emerging World of
Polyglot Persistence. Pearson Education, Inc,
2013. ISBN: 978-0-321-82662-6
2. Ian Robinson, Jim Webber, Emil Eifrem.. Graph
databases: new opportunities for connected data.
Neo Technology, Inc, 2015. ISBN:
978-1-491-93200-1
3. https://neo4j.com/docs/developer-manual

Vous aimerez peut-être aussi