Neo4j では、結果に満足するまでデータベース内のパターンの各世代を単純に維持し、冗長な世代を削除するだけでうまくいきますか? たとえば、ノードを作成できます
(t1:Transformation {transformationId:1})
一連の変換のインデックスまたはアンカーとして機能し、新しい世代のパターンを作成して、順序付けプロパティを持つ関係を持つ変換ノードに関連付けます。
(t1)-[:STEP {order:0}]->(root)-[:..*]->(branch) //tree
(t1)-[:STEP {order:1}]->(transformedRoot)-[:..*]->(transformedBranch) //first transformed tree
(t1)-[:STEP {order:2}]->(transformedRoot2)-[:..*]->(transformedBranch2) //second transformed tree
変換で変更されていないノードは、新しいパターンに直接含めることができます
(t1)-[:STEP {order:3}]->(transformedRoot)-[:..*]->(originalBranch) // transformed tree with original branch
それらが実際に変更されるまで
(t1)-[:STEP {order:4}]->(transformedRoot)-[:..*]->(transformedBranch)
必要な限り各変換のスナップショットを保持し、ダンプをエクスポート/インポートする代わりに、DB 内でそれを操作してロールバック、比較、または必要なことを行うことができます。
編集:
あなたのコメントについて
1)
Neo4j はあなたの C++ 実装を拡張または置き換えますか? 置換する場合、データの初期量を Neo4j にインポートするためのツールがいくつかあります (特に注1および2 ) 。
拡張する場合は、データをどのように操作するかによって異なります。私が知る限り、C ++用の非常に優れた Neo4j ドライバーはありません。サーバーとして Neo4j を実行し、 Cypherと(デ) シリアル化されたJSONを使用して通信する RESTful クライアント ( 1、2、3 )を構築します。時間をかけて、優れた暗号クエリを作成し、トランザクション サーバー エンドポイントを利用する方法を学びました。. ただし、これはJavaまたはPython、またはNeo4jの適切なドライバーサポートを備えた他の言語で行いますが、おそらくC ++ではありません。
2)
データなしで例を挙げるのは難しい。まずモデリングの例を見てから、 Google グループのディスカッションを検索して、ドメインをモデル化し、クエリを設計する方法について詳しく説明しているスレッドを探してください。たとえば、こことここでは、リレーションシップを順序付ける 2 つの異なる方法が参照されています。関係プロパティ別および関係タイプ別。次に、モデリングやクエリのヘルプが必要な場合は、サンプル データをNeo4j コンソールに入力し、SO に関する質問とともにリンクを共有してください。(リンクされたコンソールにクエリを含む小さなサンプルを配置しました。それで遊んでみることができます。)