3

RailsアプリでNeo4j.rb gemを使用しているアプリがあり、ノード/リレーションシップが数千しかない小規模なデータベースで、バッチアップロードおよびダウンロードスクリプトを作成しています。ほとんどの場合、バックアップ/移行を目的としています。今のところ、Terms と Permission Groups の 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.rb マジック メソッドはありますか、それともサイファー クエリを手動で書き出す必要がありますか?

4

2 に答える 2

2

これは良い質問です。関連付けの ID を取得するメソッドを作成したかったことを思い出しました。以下を提供するマスター(まだテストが必要)に入るいくつかの作業コードをまとめました:

t.permission_group_id # UUID
t.permission_group_neo_id # Neo4j ID

pg.term_ids
pg.term_neo_ids

明らかに、それは少しの間出ません。また、これらの ID を JSON で出力するようにto_jsonforActiveNodeを変更する必要があります (おそらくオプションに基づく)。また、考慮すべき ActiveRel モデルもあります。

そうは言っても、これがバックアップを行うための最良の方法であるかどうかはわかりません。問題は、復元しようとすると、その関係を作成しようとする関係の両側にモデルがあり、2 つの関係になってしまうことです。を行うこともできますがMERGE、2 つの関係が必要な場合もあります ;)

そのため、組み込みの Neo4j バックアップ ツールを使用することをお勧めします。ツールがありneo4j-backupます:

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

それは企業内だけかもしれないと思いますが(コミュニティのインストールでは見られません)。

dumpCypher からのコマンドもあります。

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

ドキュメントに記載されているのは実験的な機能です。

それはあなたの問題に対処していますか?そうでない場合は、他の解決策を検討できます;)

于 2015-07-21T15:12:39.090 に答える
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)
于 2015-07-21T15:24:39.893 に答える