2014-08-27 86 views
2

从电子表格导入大量数据时,我试图使用标签约定,其中节点大写为“This”,关系标签标记为“THIS”。在一种情况下,我不小心将关系标签格式用于一组节点。然后我删除了这些节点,并用正确的标签格式重新导入它们。 (旁边的问题 - 有没有办法重命名标签,我没有看到哪些可以避免删除/重新导入?)从neo4j中删除标签参考

我的问题是,在内置的Cypher浏览器(Neo4j 2.1.3)中,即使零节点标签错误,节点列表中也会显示正确和错误的标签。所以,虽然我成功地删除了节点,但我无法弄清楚如何从节点中删除标签 - 使用REMOVE命令很容易,但完全可以从数据库中删除标签。为什么当它被分配的项目达到零时,它会自动删除该标签?

更具体地讲,我可以点击措施的节点标签和这个查询大火于:

MATCH (n:`MEASURES`) RETURN n LIMIT 25 

与这些结果:

Returned 0 rows in 77 ms 

我想彻底删除标签“ MEASURES'从数据库,因为没有什么是使用它。如果您需要更多信息,请告诉我。

回答

5

我不认为现在还没有内置的方法来完全从neo4j数据库中删除不再使用的标签。我也被过时的标签所困扰,这些标签仍然出现在neo4j浏览器的网页界面中。

我知道一种方法可以将它们删除,但如果您的数据库数量巨大,它可能不实用,并且它可能不是完全安全的。因此,如果您选择执行以下操作,则应确保备份了原始数据库(例如,您应该复制原始文件夹或将其重命名)。

该技术其实很简单。您只需导出所有数据,关闭neo4j,删除或重命名原始文件graph.db,重新启动neo4j,然后重新导入数据。以下步骤假设您在linux环境中的neo4j安装文件夹中,并且neo4j未作为服务运行。

  1. 导出数据(CYPHER语句将重新创建数据):

    。/斌/ Neo4j的壳-c “倾销”> mydump.cql

  2. 关闭Neo4j的(因为它是不安全的删除或重命名graph.db而DB运行):

    ./bin/neo4j停止

  3. 重命名当前graph.db文件夹,以防万一你需要更换下面创建新文件夹:/

  4. RES

    MV数据/ graph.db数据graph.db.archive挞Neo4j的,它会自动创建一个新的文件夹graph.db

    ./bin/neo4j开始

  5. 重新导入从转储数据:

    ./bin/neo4j-shell -file mydump .cql

过时的标签应该从任何地方消失(您应该重新加载所有neo4j网页)。

+0

我想你已经得到了我所要求的,当我在这个周末有机会时,我会试试这个,然后回报。的确,我在谈论的是neo4j浏览器UI中的按钮,为什么我知道数据库仍然知道标签。感谢这个想法。 – 2014-08-29 15:21:34

+0

我终于开始这样做了。转储花了相当长的一段时间,导致超过700,000行。然后,我必须插入; /提交/开始行每千行,以便文件读取过程不会崩溃。在Notepad ++中使用正则表达式查找/替换的技巧。 正如你可以想象的那样,导入永远持续下去,但是违规标签已经消失。这似乎是解决这个问题的一个非常麻烦的方法。但是,在等待2.1.5社区发布(2.1.5企业版)时,我注意到企业版发行说明提到了修复可能与此相关的错误。我们拭目以待。谢谢! – 2014-10-16 19:30:29

1

标签除了使用它们的节点之外并不存在。您始终可以查询不存在的标签,并且您将始终返回零节点。

在这里,您正在查询MEASURES并且什么也没有。这与标签不存在非常相似。

这里有一个数据库中,我刚才所说的例子:

$ neo4j-shell -path test 
NOTE: Local Neo4j graph database service at 'test' 
Welcome to the Neo4j Shell! Enter 'help' for a list of commands 


neo4j-sh (?)$ MATCH (m:TotallyNonExistantLabel) return m; 
+---+ 
| m | 
+---+ 
+---+ 
0 row 
1946 ms 

因此,底线是,你不能真正从不是删除所有使用它们的节点的其它数据库中删除标签。你可以是这样做的:

MATCH (f:ThisLabelGonnaDieSucka) 
REMOVE f:ThisLabelGonnaDieSucka 
RETURN f; 

这基本上是从数据库中删除ThisLabelGonnaDieSucka

2

这是怎么做到的。

你必须确保那是什么

  • 1)无节点使用标签
  • 2),并没有指标或约束删除标签

1) /用cypher查询重命名节点上的标签:

MATCH (n:OldLabel) 
SET n:NewLabel /* Optional line if you want to rename the label */ 
REMOVE n:OldLabel 
RETURN n 

2a)检查i ˚F指数或约束在neo4j-shell使用使用schema命令标签:

$ neo4j-shell 
Welcome to the Neo4j Shell! Enter 'help' for a list of commands 
NOTE: Remote Neo4j graph database service 'shell' at port 1337 

neo4j-sh (?)$ schema 
Indexes 
    ON :OldLabel(id)   ONLINE (for uniqueness constraint) 
    ON :Person(name)   ONLINE (for uniqueness constraint) 
    ON :Person(id)    ONLINE (for uniqueness constraint) 

Constraints 
    ON (person:Person) ASSERT person.name IS UNIQUE 
    ON (person:Person) ASSERT person.id IS UNIQUE 
    ON (oldlabel:OldLabel) ASSERT oldlabel.id IS UNIQUE 

2B)在cypher查询中删除索引和约束:

DROP CONSTRAINT ON (n:OldLabel) 
    ASSERT n.id IS UNIQUE; 
DROP INDEX ON :OldLabel(id); 

请记住,对新指数和约束,如果你只是想重新命名标签。

之后,标签不应再出现在Web界面中。