我有一个使用Neo4j的应用程序。在一个小型数据库上的Rails应用程序中,只有几千个节点/关系,我现在正在编写一个批量上传和下载脚本。主要用于备份/迁移目的。我现在有2个节点-术语和权限组。导出只包含属性的每个节点非常容易,但是我缺少每个节点内的关联。是否有一种方法可以导出每个节点及其属性和关联?
在一个只有2个节点且彼此有关联的DB上的示例:
# 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。还是我必须手写出密码查询?
这是个好问题。您刚才提醒了我,我想创建方法来获取关联的id。我只是把一些工作代码放在一起,将进入master(仍然需要测试),它提供以下内容:
t.permission_group_id # UUID
t.permission_group_neo_id # Neo4j ID
pg.term_ids
pg.term_neo_ids
很明显,它一时半会儿还不会出来。此外,ActiveNode
的to_json
需要更改以在JSON中输出这些id(可能基于选项)。还有ActiveRel模型需要考虑。
话虽如此,我不确定这是进行备份的最佳方式。问题是,如果你去恢复你会在关系的两边都有模型试图创建那个关系这意味着你最终会得到两个关系。你可以做一个MERGE
,但也有时候你想要两个关系;)
所以我建议使用内置的Neo4j备份工具。有neo4j-backup
工具:
虽然我认为这可能只在企业(我没有看到它在我的社区安装)。
还有Cypher的dump
命令:
http://neo4j.com/docs/stable/shell-commands.html _dumping_the_database_or_cypher_statement_results
我在文档中指出这是一个实验性的功能。
这能解决你的问题吗?如果不行,我可以寻找其他解决方案;)
我仍然认为直接通过Neo4j进行备份是最好的。既然你说你的数据库不是很大,你应该能够做一些简单的Cypher查询,像这样:
MATCH n RETURN n
MATCH (a)-[r]->(b) RETURN a, r, b
根据你得到的r
的信息,你可以这样做:
MATCH ()-[r]->() RETURN r
Neo4j 。你可以像这样运行一个Cypher查询:
Neo4j::Session.current.query('MATCH n RETURN n')
或者像这样:
Neo4j::Session.current.query.match(:n).pluck(:n)