🔵 SQL X Cypher/Neo4j: quais amigos dos meus amigos são meus inimigos?
Tags: neo4j, cypher, nosql, braziliandevs
Published: 2022-05-29 22:50:48

Neste post vamos comparar uma consulta feita com SQL e a mesma consulta feita com CYPHER; linguagem do Neo4j. Vamos pesquisar quais amigos dos meus amigos são meus inimigos. Vamos usar os personagens do anime Naruto.

* Neo4j
 - [Neo4j - Criando os personagens](#criando-personagens)
 - [Neo4j - Criando relacionamentos de amizade](#relacionamentos-amizade)
 - [Neo4j - Criando relacionamentos de inimizade](#relacionamentos-inimizade)
 - [Neo4j - Fazendo a consulta](#fazendo-consulta)
* SQL
 - [SQL - Criando os personagens](#criando-personagens-sql)
 - [SQL - Criando relacionamentos de amizade](#relacionamentos-amizade-sql)
 - [SQL - Criando relacionamentos de inimizade](#relacionamentos-inimizade-sql)
 - [SQL - Fazendo a consulta](#fazendo-consulta-sql)
* [Conclusão](#conclusao)

[![A Jornada do Autodidata em Inglês](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pkoqkmh9hic17tnddjf6.png)](https://go.hotmart.com/R93865620U)

# Neo4j - Criando os personagens <a name="criando-personagens">

```cypher
CREATE (:Ninja {name: 'Naruto Uzumaki'})
CREATE (:Ninja {name: 'Sasuke Uchiha'})
CREATE (:Ninja {name: 'Sakura Haruno'})
CREATE (:Ninja {name: 'Gaara'})
CREATE (:Ninja {name: 'Rock Lee'})
CREATE (:Ninja {name: 'Orochimaru'})
```

# Neo4j - Criando relacionamentos de amizade <a name="relacionamentos-amizade">

Amigos do Naruto:
```cypher
MATCH (naruto :Ninja),(sakura :Ninja)
WHERE naruto.name = 'Naruto Uzumaki' AND  sakura.name = 'Sakura Haruno'
CREATE (naruto)-[:FRIEND_OF]->(sakura)
RETURN naruto, sakura
```
```cypher
MATCH (naruto :Ninja),(rock :Ninja)
WHERE naruto.name = 'Naruto Uzumaki' AND  rock.name = 'Rock Lee'
CREATE (naruto)-[:FRIEND_OF]->(rock)
RETURN naruto, rock
```
```cypher
MATCH (naruto :Ninja),(gaara :Ninja)
WHERE naruto.name = 'Naruto Uzumaki' AND  gaara.name = 'Gaara'
CREATE (naruto)-[:FRIEND_OF]->(gaara)
RETURN naruto, gaara
```
```cypher
MATCH (n) RETURN n
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hqgpz2lfute7nv6gmlk6.png)

Amigos da Sakura:
```cypher
MATCH (sakura :Ninja),(sasuke :Ninja)
WHERE sakura.name = 'Sakura Haruno' AND  sasuke.name = 'Sasuke Uchiha'
CREATE (sakura)-[:FRIEND_OF]->(sasuke)
RETURN sakura, sasuke
```
```cypher
MATCH (sakura :Ninja),(rock :Ninja)
WHERE sakura.name = 'Sakura Haruno' AND  rock.name = 'Rock Lee'
CREATE (sakura)-[:FRIEND_OF]->(rock)
RETURN sakura, rock
```
```cypher
MATCH (n) RETURN n
```
 ![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xpuj77bidv52rfrqt3jb.png)

[![Formação TS](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/isxopdurvofcx18iptvb.png)](https://go.hotmart.com/H93763859E)
 
# Neo4j - Criando relacionamentos de inimizade <a name="relacionamentos-inimizade">


Inimigos do Naruto:

```cypher
MATCH (naruto :Ninja),(sasuke :Ninja)
WHERE naruto.name = 'Naruto Uzumaki' AND  sasuke.name = 'Sasuke Uchiha'
CREATE (naruto)-[:ENEMY_OF]->(sasuke)
RETURN naruto, sasuke
```
```cypher
MATCH (naruto :Ninja),(orochimaru :Ninja)
WHERE naruto.name = 'Naruto Uzumaki' AND  orochimaru.name = 'Orochimaru'
CREATE (naruto)-[:ENEMY_OF]->(orochimaru)
RETURN naruto, orochimaru
```
```cypher
MATCH (n) RETURN n
```
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gjkm32o2bookxqn5bu9z.png)
 

# Neo4j - Fazendo a consulta <a name="fazendo-consulta">

Amigos do Naruto:
```cypher
MATCH (naruto :Ninja {name:'Naruto Uzumaki'})-[:FRIEND_OF]->(friends)
RETURN friends
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lx997q0vciyfxkirgj94.png) 

Amigos dos amigos do Naruto:

```cypher
MATCH (naruto :Ninja {name:'Naruto Uzumaki'})-[:FRIEND_OF]->(friends)
MATCH (friends)-[:FRIEND_OF]->(friends_of_friends)
RETURN friends_of_friends
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7w6zwfcnwfethzwbsfwy.png) 

Amigos dos amigos do Naruto que são inimigos do Naruto:

```cypher
MATCH (naruto :Ninja {name:'Naruto Uzumaki'})-[:FRIEND_OF]->(friends)
MATCH (friends)-[:FRIEND_OF]->(friends_of_friends)
MATCH (naruto)-[:ENEMY_OF]->(friends_of_friends)
RETURN naruto,friends_of_friends
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1c3iychan0ve9lu7hnji.png)

[![Formação TS](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/72gnny6fjwnmku1x3rr4.png)](https://go.hotmart.com/H93763859E)


# SQL - Criando os personagens <a name="criando-personagens-sql">

```sql
CREATE TABLE ninjas(
	id SERIAL PRIMARY KEY,
	name VARCHAR(255)
);

INSERT INTO 
	ninjas (name) 
VALUES
    ('Naruto Uzumaki'),
    ('Sasuke Uchiha'),
    ('Sakura Haruno'),
    ('Gaara'),
    ('Rock Lee'),
    ('Orochimaru');

SELECT * FROM ninjas;
```
 
# SQL - Criando relacionamentos de amizade <a name="relacionamentos-amizade-sql">

```sql
CREATE TABLE friends(
	id SERIAL PRIMARY KEY,
	ninja_1 INTEGER,
	ninja_2 INTEGER,
	FOREIGN KEY (ninja_1) REFERENCES ninjas (id),
	FOREIGN KEY (ninja_2) REFERENCES ninjas (id),
	UNIQUE(ninja_1, ninja_2)
);

-- Amigos do Naruto:
INSERT INTO 
    friends (ninja_1, ninja_2) 
VALUES
    (1, 3),
    (1, 4),
    (1, 5);

-- Amigos da Sakura:
INSERT INTO 
    friends (ninja_1, ninja_2) 
VALUES
    (3, 2),
    (3, 5);
    
SELECT * FROM friends;
```

# SQL - Criando relacionamentos de inimizade <a name="relacionamentos-inimizade-sql">

```sql
CREATE TABLE enemies(
	id SERIAL PRIMARY KEY,
	ninja_1 INTEGER,
	ninja_2 INTEGER,
	FOREIGN KEY (ninja_1) REFERENCES ninjas (id),
	FOREIGN KEY (ninja_2) REFERENCES ninjas (id),
	UNIQUE(ninja_1, ninja_2)
);

-- Inimigos do Naruto:
INSERT INTO 
	enemies (ninja_1, ninja_2) 
VALUES
    (1, 2),
    (1, 6);
    
SELECT * FROM enemies;
```

# SQL - Fazendo a consulta <a name="fazendo-consulta-sql">

Amigos do Naruto:

```sql
SELECT DISTINCT
  f.ninja_2,
  (SELECT name FROM ninjas WHERE id = f.ninja_2)
FROM 
  ninjas n,
  friends f
WHERE 
  f.ninja_1 = 1;
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/myr684iso5zay6istn1b.png)

Amigos da Sakura:
 
```sql
SELECT DISTINCT
  f.ninja_2,
  (SELECT name FROM ninjas WHERE id = f.ninja_2)
FROM 
  ninjas n,
  friends f
WHERE 
  f.ninja_1 = 3;
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/aum9d7clz0bfffjpbr2h.png) 

Amigos dos amigos do Naruto:


```sql
SELECT DISTINCT
  f.ninja_2,
  (SELECT name FROM ninjas WHERE id = f.ninja_2)
FROM 
  ninjas n,
  friends f
WHERE 
  f.ninja_1
IN
(
	SELECT DISTINCT
	  f.ninja_2
	FROM 
	  ninjas n,
	  friends f
	WHERE 
	  f.ninja_1 = 1
);
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fgiaa0ts23ujjl236tsl.png) 


Amigos dos amigos do Naruto que são inimigos do Naruto:

```sql
SELECT 
	e.ninja_2,
	(SELECT name FROM ninjas WHERE id = e.ninja_2)
FROM 
	enemies e
WHERE
	ninja_2 
IN
(
	SELECT DISTINCT
	  f.ninja_2
	FROM 
	  ninjas n,
	  friends f
	WHERE 
	  f.ninja_1
	IN
	(
		SELECT DISTINCT
		  f.ninja_2
		FROM 
		  ninjas n,
		  friends f
		WHERE 
		  f.ninja_1 = 1
	)
);
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zx7ni3tnomhi2fcoybvh.png)

 
# Conclusão <a name="conclusao">

Conseguimos concluir que essa consulta é bem mais simples fazer com a linguagem Cypher. Nesses casos é bom usar um banco de dados de grafos como o Neo4j. Se alguém tiver um jeito mais simples de fazer essa consulta com SQL por favor deixe seu comentário :)

[![Formação TS](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/72gnny6fjwnmku1x3rr4.png)](https://go.hotmart.com/H93763859E)