【问题标题】:Export Neo4j.rb Nodes with Associations as JSON将具有关联的 Neo4j.rb 节点导出为 JSON
【发布时间】:2015-07-21 14:30:00
【问题描述】:

我有一个应用程序在一个只有几千个节点/关系的小型数据库上的 Rails 应用程序中使用 Neo4j.rb gem,我现在正在编写批量上传和下载脚本。主要用于备份/迁移目的。我现在有 2 个节点 - 条款和权限组。仅使用属性导出每个节点非常容易,但是我缺少每个节点内的关联。有没有办法导出每个节点及其属性和关联?

仅具有 2 个相互关联的节点的数据库示例:

# Create blank holding array
2.0.0-p353 :001 > bulk = []
 => []

# Iterate through each node and drop into array
2.0.0-p353 :002 > Term.all.each do |t|
2.0.0-p353 :003 >     bulk << t
2.0.0-p353 :004?>   end
 => [#<Term access_designation: nil, created_at: Mon, 20 Jul 2015 18:12:39 +0000, created_by: nil, data_availability: nil, definition: "New York", name: "Awesome Term", notes: nil, possible_values: nil, sensitivity_access_notes: nil, sensitivity_classification: nil, source_system: nil, updated_at: Mon, 20 Jul 2015 18:12:39 +0000, updated_by: nil>]
2.0.0-p353 :005 > PermissionGroup.all.each do |pg|
2.0.0-p353 :006 >     bulk << pg
2.0.0-p353 :007?>   end
 => [#<PermissionGroup created_at: Mon, 20 Jul 2015 18:14:29 +0000, created_by: nil, name: "my group", updated_at: Mon, 20 Jul 2015 18:14:29 +0000, updated_by: nil>]

# output result to json
2.0.0-p353 :008 > bulk.to_json
 => "[{\"term\":{\"name\":\"Awesome Term\",\"definition\":\"New York\",\"source_system\":null,\"possible_values\":null,\"notes\":null,\"data_availability\":null,\"sensitivity_classification\":null,\"access_designation\":null,\"sensitivity_access_notes\":null,\"created_at\":\"2015-07-20T18:12:39+00:00\",\"updated_at\":\"2015-07-20T18:12:39+00:00\",\"created_by\":null,\"updated_by\":null,\"id\":\"ed820017-24d9-4895-aea2-2a899c83987a\"}},{\"permission_group\":{\"name\":\"my group\",\"created_at\":\"2015-07-20T18:14:29+00:00\",\"updated_at\":\"2015-07-20T18:14:29+00:00\",\"created_by\":null,\"updated_by\":null,\"id\":\"7f6d87cf-a2d3-488e-be03-ca4087e48986\"}}]"

生成的 JSON 美化后如下所示:

[
    {
        "term": {
            "name": "Awesome Term",
            "definition": "New York",
            "source_system": null,
            "possible_values": null,
            "notes": null,
            "data_availability": null,
            "sensitivity_classification": null,
            "access_designation": null,
            "sensitivity_access_notes": null,
            "created_at": "2015-07-20T18:12:39+00:00",
            "updated_at": "2015-07-20T18:12:39+00:00",
            "created_by": null,
            "updated_by": null,
            "id": "ed820017-24d9-4895-aea2-2a899c83987a"
        }
    },
    {
        "permission_group": {
            "name": "my group",
            "created_at": "2015-07-20T18:14:29+00:00",
            "updated_at": "2015-07-20T18:14:29+00:00",
            "created_by": null,
            "updated_by": null,
            "id": "7f6d87cf-a2d3-488e-be03-ca4087e48986"
        }
    }
]

但它缺少关联。当我查询时我知道我有它们

2.0.0-p353 :010 > t = Term.first
 => #<Term access_designation: nil, created_at: Mon, 20 Jul 2015 18:12:39 +0000, created_by: nil, data_availability: nil, definition: "New York", name: "Awesome Term", notes: nil, possible_values: nil, sensitivity_access_notes: nil, sensitivity_classification: nil, source_system: nil, updated_at: Mon, 20 Jul 2015 18:12:39 +0000, updated_by: nil>
2.0.0-p353 :011 > t.permission_group
 => #<PermissionGroup created_at: Mon, 20 Jul 2015 18:14:29 +0000, created_by: nil, name: "my group", updated_at: Mon, 20 Jul 2015 18:14:29 +0000, updated_by: nil>
2.0.0-p353 :012 > t.permission_group.name
 => "my group"

所以我的问题是如何输出所有节点及其属性和关联?有没有花哨的 neo4j.rb 魔术方法,还是我必须手动写出密码查询?

【问题讨论】:

    标签: ruby-on-rails json batch-processing neo4j.rb


    【解决方案1】:

    这是个好问题。您刚刚提醒我,我想创建方法来获取关联的 ID。我只是整理了一些工作代码,这些代码将进入 master(仍然需要测试),它提供以下内容:

    t.permission_group_id # UUID
    t.permission_group_neo_id # Neo4j ID
    
    pg.term_ids
    pg.term_neo_ids
    

    显然,这将不会消失。此外,ActiveNodeto_json 需要更改以在 JSON 中输出这些 ID(可能基于一个选项)。还有一些 ActiveRel 模型需要考虑。

    说了这么多,我不确定这是否是进行备份的最佳方式。问题是,如果你去恢复,你会在关系的双方都有模型试图创建这种关系,这意味着你最终会得到两个关系。你可以做一个MERGE,但有时你也想要两个关系;)

    所以我建议使用内置的 Neo4j 备份工具。有neo4j-backup 工具:

    http://neo4j.com/docs/stable/re04.html

    虽然我认为这可能只在企业中(我没有在我的社区安装中看到它)。

    还有来自 Cypher 的 dump 命令:

    http://neo4j.com/docs/stable/shell-commands.html#_dumping_the_database_or_cypher_statement_results

    我在文档中指出的是一项实验性功能。

    这是否解决了您的问题?如果没有,我可以研究其他解决方案;)

    【讨论】:

    • 啊,看来只能在社区版中关闭复制文件夹了
    【解决方案2】:

    我仍然认为直接通过 Neo4j 备份是最好的。既然您说您的数据库不是很大,您应该能够像这样执行一些简单的 Cypher 查询:

    MATCH n RETURN n
    
    MATCH (a)-[r]->(b) RETURN a, r, b
    

    根据您从r 获得的信息,您可以这样做:

    MATCH ()-[r]->() RETURN r
    

    在 Neo4j.rb 中,您可以像这样运行 Cypher 查询:

    Neo4j::Session.current.query('MATCH n RETURN n')
    

    或者像这样:

    Neo4j::Session.current.query.match(:n).pluck(:n)
    

    【讨论】:

    • 哦,如果您的某些关系没有使用 ActiveRel 建模,那么它们将作为 CypherRelationship 对象出现,您可以调用 props on。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多