Neste post vamos 比较 uma Consulta feita com SQL ea mesma Consulta feita com CYPHER;语言做 Neo4j。 Vamos pesquisar quais amigos dos meus amigos são meus inimigos。 Vamos usar os personagens 做动漫火影忍者。
- Neo4j
- Neo4j – Criando os 角色
- Neo4j – Criando relacionamentos de amizade
- Neo4j – Criando relacionamentos de inimizade
- Neo4j – Fazendo 咨询
- SQL
- SQL – Criando 操作系统角色
- SQL – Criando relacionamentos de amizade
- SQL – Criando relacionamentos de inimizade
- SQL – Fazendo 咨询
- 结论
Neo4j – Criando os 角色
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
火影忍者之友:
MATCH ( naruto :Ninja ),( sakura :Ninja ) WHERE naruto.name = 'Naruto Uzumaki' AND sakura.name = 'Sakura Haruno' CREATE ( naruto ) - [ :FRIEND_OF ] -> ( sakura ) RETURN naruto , sakura
MATCH ( naruto :Ninja ),( rock :Ninja ) WHERE naruto.name = 'Naruto Uzumaki' AND rock.name = 'Rock Lee' CREATE ( naruto ) - [ :FRIEND_OF ] -> ( rock ) RETURN naruto , rock
MATCH ( naruto :Ninja ),( gaara :Ninja ) WHERE naruto.name = 'Naruto Uzumaki' AND gaara.name = 'Gaara' CREATE ( naruto ) - [ :FRIEND_OF ] -> ( gaara ) RETURN naruto , gaara
MATCH ( n ) RETURN n
樱花之友:
MATCH ( sakura :Ninja ),( sasuke :Ninja ) WHERE sakura.name = 'Sakura Haruno' AND sasuke.name = 'Sasuke Uchiha' CREATE ( sakura ) - [ :FRIEND_OF ] -> ( sasuke ) RETURN sakura , sasuke
MATCH ( sakura :Ninja ),( rock :Ninja ) WHERE sakura.name = 'Sakura Haruno' AND rock.name = 'Rock Lee' CREATE ( sakura ) - [ :FRIEND_OF ] -> ( rock ) RETURN sakura , rock
MATCH ( n ) RETURN n
Neo4j – Criando relacionamentos de inimizade
Inimigos 火影忍者:
MATCH ( naruto :Ninja ),( sasuke :Ninja ) WHERE naruto.name = 'Naruto Uzumaki' AND sasuke.name = 'Sasuke Uchiha' CREATE ( naruto ) - [ :ENEMY_OF ] -> ( sasuke ) RETURN naruto , sasuke
MATCH ( naruto :Ninja ),( orochimaru :Ninja ) WHERE naruto.name = 'Naruto Uzumaki' AND orochimaru.name = 'Orochimaru' CREATE ( naruto ) - [ :ENEMY_OF ] -> ( orochimaru ) RETURN naruto , orochimaru
MATCH ( n ) RETURN n
Neo4j – Fazendo 咨询
火影忍者之友:
MATCH ( naruto :Ninja { name: 'Naruto Uzumaki' }) - [ :FRIEND_OF ] -> ( friends ) RETURN friends
Amigos dos amigos do 火影忍者:
MATCH ( naruto :Ninja { name: 'Naruto Uzumaki' }) - [ :FRIEND_OF ] -> ( friends ) MATCH ( friends ) - [ :FRIEND_OF ] -> ( friends_of_friends ) RETURN friends_of_friends
Amigos dos amigos do Naruto que são inimigos do Naruto:
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
SQL – Criando 操作系统角色
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
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
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 咨询
火影忍者之友:
SELECT DISTINCT f . ninja_2 , ( SELECT name FROM ninjas WHERE id = f . ninja_2 ) FROM ninjas n , friends f WHERE f . ninja_1 = 1 ;
樱花之友:
SELECT DISTINCT f . ninja_2 , ( SELECT name FROM ninjas WHERE id = f . ninja_2 ) FROM ninjas n , friends f WHERE f . ninja_1 = 3 ;
Amigos dos amigos do 火影忍者:
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 );
Amigos dos amigos do Naruto que são inimigos do Naruto:
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 ) );
结论
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 赞成 deixe seu comentário 🙂
原文: https://dev.to/maiquitome/sql-x-cypherneo4j-quais-amigos-dos-meus-amigos-sao-meus-inimigos-el4