从Neo4j数据库中删除一行

从Neo4j数据库中删除一行,neo4j,Neo4j,我有一个小图表: CREATE (Thing:Class {title:'Thing'}) CREATE (Places:Class{title:'Places'}) CREATE (Lemma:Class {title:'Lemma'}) CREATE (Country:Class {title:'Country'}) CREATE (Region:Class {title:'Region'}) CREATE (loc1:Index {title:'loc00001'}) CREATE (lo

我有一个小图表:

CREATE (Thing:Class {title:'Thing'})
CREATE (Places:Class{title:'Places'})
CREATE (Lemma:Class {title:'Lemma'})
CREATE (Country:Class {title:'Country'})
CREATE (Region:Class {title:'Region'})
CREATE (loc1:Index {title:'loc00001'})
CREATE (loc1_1:Index {title:'loc00001.01'})
CREATE (Abc:Placename {title:'Abc', gender:'n'})
CREATE
  (Thing)-[:HAS_SUBCLASS]->(Places),
  (Thing)-[:HAS_SUBCLASS]->(Lemma),
  (Places)-[:HAS_SUBCLASS]->(Country),
  (Country)-[:HAS_SUBCLASS]->(Region),
  (Country)-[:HAS_SUBCLASS]->(Region),
  (Places)-[:HAS_INDIVID]->(loc1),
  (loc1)-[:HAS_LA_VAR]->(loc1_1),
  (loc1_1) -[:HAS_VAR_NAME]->(Abc)
我犯了一个错误,定义了(国家)-[:HAS_SUBCLASS]->(地区)关系两次。 如果我运行此查询:

MATCH (n { title: 'Country'})-[r]-() DELETE n,r
它将删除所有与国家相关的节点,并且所有节点都有_子类关系,这有点像我的小数据库的一半
有没有办法只删除数据库中的一行而不丢失


在这一点上,我可以很容易地从我的数据库中删除所有节点和rel,以彻底清理它,并从头开始重建一切。但稍后,当我将有数千个条目时,这种更正错误的方式将太耗时…

您需要添加标签,将其缩小到title=“Country”的类。在这里:

在我的neo4j外壳中,测试数据如下所示:

$ MATCH (n:Class { title: 'Country'})-[r]-() DELETE n,r;
+-------------------+
| No data returned. |
+-------------------+
Nodes deleted: 1
Relationships deleted: 3
请注意,删除节点时,必须删除所有事件关系

考虑到您提供的数据示例,这是可行的

现在还有一件事——您没有在这些节点上创建许多不同的属性。如果您有一个数据集,其中此查询匹配多个节点:

MATCH (n:Class { title: "Country" }) return n;

那么节点的定义可能太宽了。如果只想删除一个这样的节点,则需要该节点的ID或使其与其他节点不同的其他属性。

您需要添加标签,以便将其范围缩小到title=“Country”的类。在这里:

在我的neo4j外壳中,测试数据如下所示:

$ MATCH (n:Class { title: 'Country'})-[r]-() DELETE n,r;
+-------------------+
| No data returned. |
+-------------------+
Nodes deleted: 1
Relationships deleted: 3
请注意,删除节点时,必须删除所有事件关系

考虑到您提供的数据示例,这是可行的

现在还有一件事——您没有在这些节点上创建许多不同的属性。如果您有一个数据集,其中此查询匹配多个节点:

MATCH (n:Class { title: "Country" }) return n;

那么节点的定义可能太宽了。如果只想删除一个这样的节点,则需要该节点的ID,或使其与其他节点不同的其他属性。

请参见下文。请记住,关系ID对您来说是不同的,但这只是为了说明

好的,首先让我们找出哪一个关系是重复的(参见对其他答案的评论)

现在只查询其中一个关系以演示

neo4j-sh (?)$ start r=relationship(9170) return r;
+-----------------------+
| r                     |
+-----------------------+
| :HAS_SUBCLASS[9170]{} |
+-----------------------+
1 row
204 ms
现在只删除第一个

neo4j-sh (?)$ start r=relationship(9170) delete r;
+-------------------+
| No data returned. |
+-------------------+
Relationships deleted: 1
16 ms
现在演示原始查询现在只返回1个关系

    neo4j-sh (?)$ match (n:Class {title: "Country"})->[r:HAS_SUBCLASS)   Region:Class                                                                                 match (n:Class {title:"Country"})-[r:HAS_SUBCLASS]->(Region:Class {title:"Region"}) return r;
+-----------------------+
| r                     |
+-----------------------+
| :HAS_SUBCLASS[9171]{} |
+-----------------------+
1 row
11 ms

见下文。请记住,关系ID对您来说是不同的,但这只是为了说明

好的,首先让我们找出哪一个关系是重复的(参见对其他答案的评论)

现在只查询其中一个关系以演示

neo4j-sh (?)$ start r=relationship(9170) return r;
+-----------------------+
| r                     |
+-----------------------+
| :HAS_SUBCLASS[9170]{} |
+-----------------------+
1 row
204 ms
现在只删除第一个

neo4j-sh (?)$ start r=relationship(9170) delete r;
+-------------------+
| No data returned. |
+-------------------+
Relationships deleted: 1
16 ms
现在演示原始查询现在只返回1个关系

    neo4j-sh (?)$ match (n:Class {title: "Country"})->[r:HAS_SUBCLASS)   Region:Class                                                                                 match (n:Class {title:"Country"})-[r:HAS_SUBCLASS]->(Region:Class {title:"Region"}) return r;
+-----------------------+
| r                     |
+-----------------------+
| :HAS_SUBCLASS[9171]{} |
+-----------------------+
1 row
11 ms

我的查询删除了完全相同数量的节点和关系。我不想删除特定的节点,但只想删除一个冗余行,定义一个关系(国家)-[:HAS_SUBCLASS]->(地区),你能更具体地说“一个冗余行”是什么意思吗?你是说你上面提供的一行密码吗?上面的cypher的问题是,它只为每个节点定义一个属性。因此,如果您通过该属性查找对象,它可能没有足够的选择性。我的意思是我添加了两行相同的错误:(国家)-[:HAS_子类]->(地区),(国家)-[:HAS_子类]->(地区)我想知道如何在不破坏一半数据库的情况下简单地纠正这个错误我的查询删除了完全相同数量的节点和关系。我不想删除特定的节点,但只想删除一个冗余行,定义一个关系(国家)-[:HAS_SUBCLASS]->(地区),你能更具体地说“一个冗余行”是什么意思吗?你是说你上面提供的一行密码吗?上面的cypher的问题是,它只为每个节点定义一个属性。所以,如果你通过这个属性找到东西,它可能没有足够的选择性。我的意思是我已经添加了两行相同的错误:(国家)-[:HAS_SUBCLASS]->(地区),(国家)-[:HAS_SUBCLASS]->(地区)我想知道如何在不破坏一半数据库的情况下简单地纠正这个错误谢谢,这看起来是我需要的!我会尝试一下,一旦我有这个问题再次)谢谢你,这似乎是我需要的!我会尝试一下,一旦我有这个问题再次)