【问题标题】:remove label reference from neo4j从 neo4j 中删除标签引用
【发布时间】:2014-08-27 17:47:49
【问题描述】:

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

我的问题是,在内置的 Cypher 浏览器(Neo4j 2.1.3)中,正确和错误的标签都显示在节点列表上,即使有零个节点带有错误的标签。因此,虽然我成功删除了节点,但我不知道如何删除标签 - 不是从节点中删除,这很容易使用 REMOVE 命令,而是完全从数据库中删除。为什么它分配到的项目为零时不自动删除这个标签?

更具体地说,我可以单击 MEASURES 的节点标签并触发此查询:

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

这些结果:

Returned 0 rows in 77 ms

我想从数据库中完全删除标签“MEASURES”,因为没有人在使用它。如果您需要更多信息,请告诉我。

【问题讨论】:

    标签: neo4j


    【解决方案1】:

    我认为目前还没有一种内置方法可以完全从 neo4j 数据库中删除不再使用的标签。我还对在 neo4j 浏览器 Web UI 等地方仍然出现的过时标签感到恼火。

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

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

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

      ./bin/neo4j-shell -c "dump" > mydump.cql

    2. 关闭 neo4j(因为在数据库运行时删除或重命名 graph.db 是不安全的):

      ./bin/neo4j 停止

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

      mv 数据/graph.db 数据/graph.db.archive

    4. 重启neo4j,会自动新建一个graph.db文件夹:

      ./bin/neo4j 启动

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

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

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

    【讨论】:

    • 我想你明白了我的要求,我会在本周末有机会的时候尝试一下,然后再报告。事实上,我正在谈论的是 neo4j 浏览器 UI 中的按钮,以及为什么我知道数据库仍然知道标签。谢谢你的想法。
    • 我终于有时间做这个了。转储花费了相当长的时间,导致超过 700,000 行。然后我必须每千行插入 ;/commit/begin 行,以使文件读取过程不会崩溃。在 Notepad++ 中使用正则表达式查找/替换就可以了。正如您可以想象的那样,导入需要很长时间,但是有问题的标签已经消失了。这似乎是解决此问题的一种非常麻烦的方法。然而,在等待 2.1.5 社区发布(2.1.5 企业版已发布)时,我注意到企业版发布说明提到修复可能与此相关的错误。我们拭目以待。谢谢!
    【解决方案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) 使用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);
    

    如果您只想重命名标签,请记住创建新的索引和约束。

    在此之后,标签不应再出现在网络界面中。

    【讨论】:

      【解决方案3】:

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

      在这里,您查询 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多