πŸ”΅SQL X Cypher/Neo4j: ΠΊΠ°ΠΊΠΈΠ΅ Π΄Ρ€ΡƒΠ·ΡŒΡ ΠΌΠΎΠΈΡ… Π΄Ρ€ΡƒΠ·Π΅ΠΉ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΌΠΎΠΈΠΌΠΈ Π²Ρ€Π°Π³Π°ΠΌΠΈ?

Π’ этом постС ΠΌΡ‹ сравним запрос, сдСланный с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SQL, ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ запрос, сдСланный с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ CYPHER – языка Neo4j. ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΊΠ°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ Π΄Ρ€ΡƒΠ·ΡŒΡ ΠΌΠΎΠΈΡ… Π΄Ρ€ΡƒΠ·Π΅ΠΉ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΌΠΎΠΈΠΌΠΈ Π²Ρ€Π°Π³Π°ΠΌΠΈ. ΠœΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ пСрсонаТСй ΠΈΠ· Π°Π½ΠΈΠΌΠ΅ “Наруто”.

  • Neo4j
    • Neo4j – Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ символов
    • Neo4j – Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ друТСских ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ
    • Neo4j – Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ Π²Ρ€Π°ΠΆΠ΄Ρ‹
    • Neo4j – Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ запроса
  • SQL
    • SQL – Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ символов
    • SQL – Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ друТСских ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ
    • SQL – Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ Π²Ρ€Π°ΠΆΠ΄Ρ‹
    • SQL – Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ запроса
  • Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Neo4j – Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ символов

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 – Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ друТСских ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ

Π”Ρ€ΡƒΠ·ΡŒΡ Наруто

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 – Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ Π²Ρ€Π°ΠΆΠ΄Ρ‹

Π’Ρ€Π°Π³ΠΈ Наруто

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 – Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ запроса

Π”Ρ€ΡƒΠ·ΡŒΡ Наруто

MATCH (naruto :Ninja {name:'Naruto Uzumaki'})-[:FRIEND_OF]->(friends)
RETURN friends
Π’ΠΎΠΉΠ΄ΠΈΡ‚Π΅ Π² полноэкранный Ρ€Π΅ΠΆΠΈΠΌ Π’Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· полноэкранного Ρ€Π΅ΠΆΠΈΠΌΠ°

Π”Ρ€ΡƒΠ·ΡŒΡ Π΄Ρ€ΡƒΠ·Π΅ΠΉ Наруто:

MATCH (naruto :Ninja {name:'Naruto Uzumaki'})-[:FRIEND_OF]->(friends)
MATCH (friends)-[:FRIEND_OF]->(friends_of_friends)
RETURN friends_of_friends
Π’ΠΎΠΉΠ΄ΠΈΡ‚Π΅ Π² полноэкранный Ρ€Π΅ΠΆΠΈΠΌ Π’Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· полноэкранного Ρ€Π΅ΠΆΠΈΠΌΠ°

Π”Ρ€ΡƒΠ·ΡŒΡ Π΄Ρ€ΡƒΠ·Π΅ΠΉ Наруто, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π²Ρ€Π°Π³Π°ΠΌΠΈ Наруто:

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 – Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ символов

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 – Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ друТСских ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ

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 – Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ Π²Ρ€Π°ΠΆΠ΄Ρ‹

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 – составлСниС запроса

Π”Ρ€ΡƒΠ·ΡŒΡ Наруто

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;
Π’ΠΎΠΉΠ΄ΠΈΡ‚Π΅ Π² полноэкранный Ρ€Π΅ΠΆΠΈΠΌ Π’Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· полноэкранного Ρ€Π΅ΠΆΠΈΠΌΠ°

Π”Ρ€ΡƒΠ·ΡŒΡ Π΄Ρ€ΡƒΠ·Π΅ΠΉ Наруто:

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
);
Π’ΠΎΠΉΠ΄ΠΈΡ‚Π΅ Π² полноэкранный Ρ€Π΅ΠΆΠΈΠΌ Π’Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· полноэкранного Ρ€Π΅ΠΆΠΈΠΌΠ°

Π”Ρ€ΡƒΠ·ΡŒΡ Π΄Ρ€ΡƒΠ·Π΅ΠΉ Наруто, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π²Ρ€Π°Π³Π°ΠΌΠΈ Наруто:

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
    )
);
Π’ΠΎΠΉΠ΄ΠΈΡ‚Π΅ Π² полноэкранный Ρ€Π΅ΠΆΠΈΠΌ Π’Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· полноэкранного Ρ€Π΅ΠΆΠΈΠΌΠ°

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄, Ρ‡Ρ‚ΠΎ этот запрос Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ языка Cypher. Π’ Ρ‚Π°ΠΊΠΈΡ… случаях Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°Π·Ρƒ Π΄Π°Π½Π½Ρ‹Ρ… Π³Ρ€Π°Ρ„ΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Neo4j. Если Ρƒ ΠΊΠΎΠ³ΠΎ-Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ простой способ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ этот запрос с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ SQL, поТалуйста, ΠΎΡΡ‚Π°Π²ΡŒΡ‚Π΅ свой ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ πŸ™‚

ΠžΡ†Π΅Π½ΠΈΡ‚Π΅ ΡΡ‚Π°Ρ‚ΡŒΡŽ
Procodings.ru
Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ