Para os exemplos, consideraremos nós de artistas (Artista
) e filmes (Filme
) com relacionamentos de atuação (Elenco
).
// Criando artistas
CREATE (a1:Artista {nome: "Robert De Niro", altura: 177, local_nascto: "New York, USA"})
CREATE (a2:Artista {nome: "Al Pacino", altura: 170, local_nascto: "New York, USA"})
CREATE (a3:Artista {nome: "Fernanda Montenegro", altura: 160, local_nascto: "Rio de Janeiro, Brazil"})
// Criando filmes
CREATE (f1:Filme {titulo_original: "The Godfather Part II", ano_lancamento: 1974, generos: "Crime, Drama", duração: 200})
CREATE (f2:Filme {titulo_original: "Heat", ano_lancamento: 1995, generos: "Crime, Thriller", duração: 170})
CREATE (f3:Filme {titulo_original: "Central do Brasil", ano_lancamento: 1998, generos: "Drama", duração: 115})
// Criando relacionamentos de elenco
CREATE (a1)-[:Elenco {tipo_participação: "Actor"}]->(f1)
CREATE (a2)-[:Elenco {tipo_participação: "Actor"}]->(f1)
CREATE (a1)-[:Elenco {tipo_participação: "Actor"}]->(f2)
CREATE (a3)-[:Elenco {tipo_participação: "Actor"}]->(f3)
A função datetime()
permite capturar a data e hora atual, enquanto datetime(<var>).month
, .year
e .day
extraem mês, ano e dia de uma data.
// Obtendo a data e hora atual
RETURN datetime() AS Data_Atual
// Extraindo o mês e dia de uma data
RETURN datetime("2024-10-27T14:30:00").month AS Mes, datetime("2024-10-27T14:30:00").day AS Dia
Com duration.between()
, calculamos a duração entre duas datas.
// Calcular a diferença entre duas datas
RETURN duration.between(datetime("1974-12-20"), datetime("2024-10-27")) AS Duracao
WITH date('2024-10-28') AS data
RETURN
toString(data) AS DataString,
date('2024-10-28') AS DataConvertida;
Em geral, a configuração do Neo4J trabalha com o formato DD-MM-YYYY. Se tiver outros formatos de data você pode fazer conversões como abaixo.
// Convertendo DD/MM/YYYY para DATE
WITH '28/10/2024' AS dataString1
RETURN date(substring(dataString1, 6, 4) + '-' + substring(dataString1, 3, 2) + '-' + substring(dataString1, 0, 2)) AS Data1;
// Convertendo DD/MM/YY para DATE
WITH '28/10/24' AS dataString2
RETURN date('20' + substring(dataString2, 6, 2) + '-' + substring(dataString2, 3, 2) + '-' + substring(dataString2, 0, 2)) AS Data2;
// Usando YYYY-MM-DD diretamente
WITH '2024-10-28' AS dataString3
RETURN date(dataString3) AS Data3;
toInteger & toFloat. Para converter valores de atributos para tipos específicos, como toInteger()
, facilitando cálculos e funções de grupo.
// Convertendo altura dos artistas para tipo inteiro
MATCH (a:Artista)
SET a.altura = toInteger(a.altura)
RETURN a.nome, a.altura LIMIT 50
Aqui você encontra também o comando LIMIT
, que não havíamos empregado antes.
WITH '123' AS stringInt, '123.45' AS stringFloat
RETURN
toInteger(stringInt) AS Inteiro,
toFloat(stringFloat) AS Decimal;
toString. Aqui como converter dados numéricos para string.
// Conversão de altura para string e concatenação com o nome
MATCH (a:Artista)
RETURN a.nome + " tem altura de " + toString(a.altura) + " cm" AS Descricao_Artista
As funções de grupo permitem calcular média, contagem, soma, mínimo e máximo, e funcionam como as funções de agregação da SQL.
// Média de altura dos artistas
MATCH (a:Artista)
RETURN AVG(a.altura) AS Media_Altura
// Estatísticas sobre altura dos artistas
MATCH (a:Artista)
WHERE a.altura IS NOT NULL
RETURN COUNT(a) AS Contagem, AVG(a.altura) AS Media_Altura, MAX(a.altura) AS Maior_Altura, MIN(a.altura) AS Menor_Altura
Note que isso é o equivalente da SQL:
SELECT AVG(a.altura) AS Media_altura, ...
FROM artista a
Podemos agrupar os dados para calcular estatísticas por categorias.
// Estatísticas de altura agrupadas por local de nascimento
MATCH (a:Artista)
WHERE a.altura IS NOT NULL
RETURN a.local_nascto, COUNT(*) AS Contagem, AVG(a.altura) AS Media_Altura, MAX(a.altura) AS Maior_Altura, MIN(a.altura) AS Menor_Altura
ORDER BY Contagem DESC
Note que isso é o equivalente da SQL:
SELECT a.local_nascto, A COUNT(*) AS Contagem, ...,
FROM artista a
GROUP BY a.local_nascto
ORDER BY Contagem DESC
Note aqui mais um comando que não empregamos antes ORDER BY Contagem DESC
.
Aqui mais um exemplo de "GROUP BY",
MATCH (p:Pessoa)
RETURN p.idade AS Idade, count(p) AS Total
ORDER BY p.idade
Em SQL,
SELECT p.idade AS Idade, COUNT(*) AS Total
FROM Pessoa p
GROUP BY p.idade;
Podemos agrupar filmes por gênero e país para analisar sua distribuição.
// Contagem de filmes por gênero e país
MATCH (f:Filme)
WHERE f.generos IS NOT NULL AND f.pais IS NOT NULL
RETURN f.pais AS Pais, f.generos AS Generos, COUNT(*) AS Contagem_Genero
ORDER BY Contagem_Genero DESC
Qual seria aqui a SQL equivalente?
Filtrar filmes e artistas por critérios, como gênero de filme e participação do artista.
// Contagem de filmes de ficção científica com atrizes
MATCH (f:Filme)-[e:Elenco]->(a:Artista)
WHERE e.tipo_participação =~ '(?i).*actress.*' AND f.generos =~ '(?i).*sci-fi.*'
RETURN a.nome AS Artista, COUNT(e.tipo_participação) AS Qtde_Atuacoes
ORDER BY Qtde_Atuacoes DESC
Analisar quantos filmes um artista atuou dentro de critérios específicos, como país e gênero.
// Artistas brasileiros que atuaram em comédias
MATCH (f:Filme)-[e:Elenco]->(a:Artista)
WHERE e.tipo_participação =~ '(?i).*act.*' AND f.generos =~ '(?i).*comedy.*' AND toUpper(f.pais) CONTAINS 'BRA'
RETURN a.nome AS Artista, COUNT(e.tipo_participação) AS Qtde_Atuacoes
ORDER BY Qtde_Atuacoes DESC
Explorar as conexões entre artistas e filmes específicos para identificar colaborações.
// Todos que trabalharam com Robert De Niro
MATCH (a1:Artista)<-[e1:Elenco]-(f:Filme)-[e2:Elenco]->(a2:Artista)
WHERE a1.nome =~ '(?i).*robert.*' AND a1.nome =~ '(?i).*niro.*' AND a1 <> a2
RETURN a2.nome AS CoAtor, f.titulo_original AS Filme
'Quebrando' essa consulta,
- Buscar todos os filmes em que um artista específico atuou:
MATCH (a:Artista)-[e:Elenco]->(f:Filme)
WHERE a.nome = 'Robert De Niro'
RETURN f.titulo_original AS Filme;
- Encontrar todos os coatores de um artista específico:
MATCH (a1:Artista)<-[e:Elenco]-(f:Filme)-[e2:Elenco]->(a2:Artista)
WHERE a1.nome = 'Robert De Niro' AND a1 <> a2
RETURN DISTINCT a2.nome AS CoAtor;
- Contar quantas vezes um artista atuou em filmes:
MATCH (a:Artista)-[e:Elenco]->(f:Filme)
WHERE a.nome = 'Robert De Niro'
RETURN COUNT(f) AS NumeroDeFilmes;