81289d0663
Reviewers: buda Reviewed By: buda Subscribers: matej.gradicek Differential Revision: https://phabricator.memgraph.io/D122
396 lines
9.3 KiB
Gherkin
396 lines
9.3 KiB
Gherkin
#
|
|
# Copyright 2017 "Neo Technology",
|
|
# Network Engine for Objects in Lund AB (http://neotechnology.com)
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
|
|
Feature: DeleteAcceptance
|
|
|
|
Scenario: Delete nodes
|
|
Given an empty graph
|
|
And having executed:
|
|
"""
|
|
CREATE ()
|
|
"""
|
|
When executing query:
|
|
"""
|
|
MATCH (n)
|
|
DELETE n
|
|
"""
|
|
Then the result should be empty
|
|
And the side effects should be:
|
|
| -nodes | 1 |
|
|
|
|
Scenario: Detach delete node
|
|
Given an empty graph
|
|
And having executed:
|
|
"""
|
|
CREATE ()
|
|
"""
|
|
When executing query:
|
|
"""
|
|
MATCH (n)
|
|
DETACH DELETE n
|
|
"""
|
|
Then the result should be empty
|
|
And the side effects should be:
|
|
| -nodes | 1 |
|
|
|
|
Scenario: Delete relationships
|
|
Given an empty graph
|
|
And having executed:
|
|
"""
|
|
UNWIND range(0, 2) AS i
|
|
CREATE ()-[:R]->()
|
|
"""
|
|
When executing query:
|
|
"""
|
|
MATCH ()-[r]-()
|
|
DELETE r
|
|
"""
|
|
Then the result should be empty
|
|
And the side effects should be:
|
|
| -relationships | 3 |
|
|
|
|
Scenario: Deleting connected nodes
|
|
Given an empty graph
|
|
And having executed:
|
|
"""
|
|
CREATE (x:X)
|
|
CREATE (x)-[:R]->()
|
|
CREATE (x)-[:R]->()
|
|
CREATE (x)-[:R]->()
|
|
"""
|
|
When executing query:
|
|
"""
|
|
MATCH (n:X)
|
|
DELETE n
|
|
"""
|
|
Then a ConstraintVerificationFailed should be raised at runtime: DeleteConnectedNode
|
|
|
|
Scenario: Detach deleting connected nodes and relationships
|
|
Given an empty graph
|
|
And having executed:
|
|
"""
|
|
CREATE (x:X)
|
|
CREATE (x)-[:R]->()
|
|
CREATE (x)-[:R]->()
|
|
CREATE (x)-[:R]->()
|
|
"""
|
|
When executing query:
|
|
"""
|
|
MATCH (n:X)
|
|
DETACH DELETE n
|
|
"""
|
|
Then the result should be empty
|
|
And the side effects should be:
|
|
| -nodes | 1 |
|
|
| -relationships | 3 |
|
|
|
|
Scenario: Detach deleting paths
|
|
Given an empty graph
|
|
And having executed:
|
|
"""
|
|
CREATE (x:X), (n1), (n2), (n3)
|
|
CREATE (x)-[:R]->(n1)
|
|
CREATE (n1)-[:R]->(n2)
|
|
CREATE (n2)-[:R]->(n3)
|
|
"""
|
|
When executing query:
|
|
"""
|
|
MATCH p = (:X)-->()-->()-->()
|
|
DETACH DELETE p
|
|
"""
|
|
Then the result should be empty
|
|
And the side effects should be:
|
|
| -nodes | 4 |
|
|
| -relationships | 3 |
|
|
|
|
Scenario: Undirected expand followed by delete and count
|
|
Given an empty graph
|
|
And having executed:
|
|
"""
|
|
CREATE ()-[:R]->()
|
|
"""
|
|
When executing query:
|
|
"""
|
|
MATCH (a)-[r]-(b)
|
|
DELETE r, a, b
|
|
RETURN count(*) AS c
|
|
"""
|
|
Then the result should be:
|
|
| c |
|
|
| 2 |
|
|
And the side effects should be:
|
|
| -nodes | 2 |
|
|
| -relationships | 1 |
|
|
|
|
Scenario: Undirected variable length expand followed by delete and count
|
|
Given an empty graph
|
|
And having executed:
|
|
"""
|
|
CREATE (n1), (n2), (n3)
|
|
CREATE (n1)-[:R]->(n2)
|
|
CREATE (n2)-[:R]->(n3)
|
|
"""
|
|
When executing query:
|
|
"""
|
|
MATCH (a)-[*]-(b)
|
|
DETACH DELETE a, b
|
|
RETURN count(*) AS c
|
|
"""
|
|
Then the result should be:
|
|
| c |
|
|
| 6 |
|
|
And the side effects should be:
|
|
| -nodes | 3 |
|
|
| -relationships | 2 |
|
|
|
|
Scenario: Create and delete in same query
|
|
Given an empty graph
|
|
And having executed:
|
|
"""
|
|
CREATE ()
|
|
"""
|
|
When executing query:
|
|
"""
|
|
MATCH ()
|
|
CREATE (n)
|
|
DELETE n
|
|
"""
|
|
Then the result should be empty
|
|
And the side effects should be:
|
|
| +nodes | 1 |
|
|
| -nodes | 1 |
|
|
|
|
Scenario: Delete optionally matched relationship
|
|
Given an empty graph
|
|
And having executed:
|
|
"""
|
|
CREATE ()
|
|
"""
|
|
When executing query:
|
|
"""
|
|
MATCH (n)
|
|
OPTIONAL MATCH (n)-[r]-()
|
|
DELETE n, r
|
|
"""
|
|
Then the result should be empty
|
|
And the side effects should be:
|
|
| -nodes | 1 |
|
|
|
|
Scenario: Delete on null node
|
|
Given an empty graph
|
|
When executing query:
|
|
"""
|
|
OPTIONAL MATCH (n)
|
|
DELETE n
|
|
"""
|
|
Then the result should be empty
|
|
And no side effects
|
|
|
|
Scenario: Detach delete on null node
|
|
Given an empty graph
|
|
When executing query:
|
|
"""
|
|
OPTIONAL MATCH (n)
|
|
DETACH DELETE n
|
|
"""
|
|
Then the result should be empty
|
|
And no side effects
|
|
|
|
Scenario: Delete on null path
|
|
Given an empty graph
|
|
When executing query:
|
|
"""
|
|
OPTIONAL MATCH p = ()-->()
|
|
DETACH DELETE p
|
|
"""
|
|
Then the result should be empty
|
|
And no side effects
|
|
|
|
Scenario: Delete node from a list
|
|
Given an empty graph
|
|
And having executed:
|
|
"""
|
|
CREATE (u:User)
|
|
CREATE (u)-[:FRIEND]->()
|
|
CREATE (u)-[:FRIEND]->()
|
|
CREATE (u)-[:FRIEND]->()
|
|
CREATE (u)-[:FRIEND]->()
|
|
"""
|
|
And parameters are:
|
|
| friendIndex | 1 |
|
|
When executing query:
|
|
"""
|
|
MATCH (:User)-[:FRIEND]->(n)
|
|
WITH collect(n) AS friends
|
|
DETACH DELETE friends[$friendIndex]
|
|
"""
|
|
Then the result should be empty
|
|
And the side effects should be:
|
|
| -nodes | 1 |
|
|
| -relationships | 1 |
|
|
|
|
Scenario: Delete node from a list
|
|
Given an empty graph
|
|
And having executed:
|
|
"""
|
|
CREATE (u:User)
|
|
CREATE (u)-[:FRIEND]->()
|
|
CREATE (u)-[:FRIEND]->()
|
|
CREATE (u)-[:FRIEND]->()
|
|
CREATE (u)-[:FRIEND]->()
|
|
"""
|
|
And parameters are:
|
|
| friendIndex | 1 |
|
|
When executing query:
|
|
"""
|
|
MATCH (:User)-[:FRIEND]->(n)
|
|
WITH collect(n) AS friends
|
|
DETACH DELETE friends[$friendIndex]
|
|
"""
|
|
Then the result should be empty
|
|
And the side effects should be:
|
|
| -nodes | 1 |
|
|
| -relationships | 1 |
|
|
|
|
Scenario: Delete relationship from a list
|
|
Given an empty graph
|
|
And having executed:
|
|
"""
|
|
CREATE (u:User)
|
|
CREATE (u)-[:FRIEND]->()
|
|
CREATE (u)-[:FRIEND]->()
|
|
CREATE (u)-[:FRIEND]->()
|
|
CREATE (u)-[:FRIEND]->()
|
|
"""
|
|
And parameters are:
|
|
| friendIndex | 1 |
|
|
When executing query:
|
|
"""
|
|
MATCH (:User)-[r:FRIEND]->()
|
|
WITH collect(r) AS friendships
|
|
DETACH DELETE friendships[$friendIndex]
|
|
"""
|
|
Then the result should be empty
|
|
And the side effects should be:
|
|
| -relationships | 1 |
|
|
|
|
Scenario: Delete nodes from a map
|
|
Given an empty graph
|
|
And having executed:
|
|
"""
|
|
CREATE (:User), (:User)
|
|
"""
|
|
When executing query:
|
|
"""
|
|
MATCH (u:User)
|
|
WITH {key: u} AS nodes
|
|
DELETE nodes.key
|
|
"""
|
|
Then the result should be empty
|
|
And the side effects should be:
|
|
| -nodes | 2 |
|
|
|
|
Scenario: Delete relationships from a map
|
|
Given an empty graph
|
|
And having executed:
|
|
"""
|
|
CREATE (a:User), (b:User)
|
|
CREATE (a)-[:R]->(b)
|
|
CREATE (b)-[:R]->(a)
|
|
"""
|
|
When executing query:
|
|
"""
|
|
MATCH (:User)-[r]->(:User)
|
|
WITH {key: r} AS rels
|
|
DELETE rels.key
|
|
"""
|
|
Then the result should be empty
|
|
And the side effects should be:
|
|
| -relationships | 2 |
|
|
|
|
Scenario: Detach delete nodes from nested map/list
|
|
Given an empty graph
|
|
And having executed:
|
|
"""
|
|
CREATE (a:User), (b:User)
|
|
CREATE (a)-[:R]->(b)
|
|
CREATE (b)-[:R]->(a)
|
|
"""
|
|
When executing query:
|
|
"""
|
|
MATCH (u:User)
|
|
WITH {key: collect(u)} AS nodeMap
|
|
DETACH DELETE nodeMap.key[0]
|
|
"""
|
|
Then the result should be empty
|
|
And the side effects should be:
|
|
| -nodes | 1 |
|
|
| -relationships | 2 |
|
|
|
|
Scenario: Delete relationships from nested map/list
|
|
Given an empty graph
|
|
And having executed:
|
|
"""
|
|
CREATE (a:User), (b:User)
|
|
CREATE (a)-[:R]->(b)
|
|
CREATE (b)-[:R]->(a)
|
|
"""
|
|
When executing query:
|
|
"""
|
|
MATCH (:User)-[r]->(:User)
|
|
WITH {key: {key: collect(r)}} AS rels
|
|
DELETE rels.key.key[0]
|
|
"""
|
|
Then the result should be empty
|
|
And the side effects should be:
|
|
| -relationships | 1 |
|
|
|
|
Scenario: Delete paths from nested map/list
|
|
Given an empty graph
|
|
And having executed:
|
|
"""
|
|
CREATE (a:User), (b:User)
|
|
CREATE (a)-[:R]->(b)
|
|
CREATE (b)-[:R]->(a)
|
|
"""
|
|
When executing query:
|
|
"""
|
|
MATCH p = (:User)-[r]->(:User)
|
|
WITH {key: collect(p)} AS pathColls
|
|
DELETE pathColls.key[0], pathColls.key[1]
|
|
"""
|
|
Then the result should be empty
|
|
And the side effects should be:
|
|
| -nodes | 2 |
|
|
| -relationships | 2 |
|
|
|
|
Scenario: Delete relationship with bidirectional matching
|
|
Given an empty graph
|
|
And having executed:
|
|
"""
|
|
CREATE ()-[:T {id: 42}]->()
|
|
"""
|
|
When executing query:
|
|
"""
|
|
MATCH p = ()-[r:T]-()
|
|
WHERE r.id = 42
|
|
DELETE r
|
|
"""
|
|
Then the result should be empty
|
|
And the side effects should be:
|
|
| -relationships | 1 |
|