循環参照の制約
nehan では、データ処理の健全性を保つために、チェインデータソースおよび中間データにおける循環参照を禁止しています。
循環参照とは
循環参照とは、データの参照関係が循環(ループ)してしまう状態を指します。 A が B を参照し、B が C を参照し、C が再び A を参照するような状態です。
なぜ循環参照が禁止されているのか
循環参照が発生すると、以下の深刻な問題が生じます。
1. 無限ループの発生
データの更新処理が永遠に終わらなくなります。 A を更新すると B が更新され、B を更新すると C が更新され、C を更新すると A が更新され…という無限ループに陥ります。
2. データの整合性が保てない
循環参照があると、どのデータが「最新」なのか定義できなくなります。 すべてのデータが相互に依存しているため、正しい状態を決定できません。
3. 実行順序が決定できない
スケジュール実行時に、どのデータソースやワークフローを先に実行すべきか決められなくなります。
チェインデータソースにおける循環参照
チェインデータソースは、分析プロジェクト内のノードのデータを別のデータソースとして利用できる機能です。 この機能において、以下のようなケースが循環参照に該当します。
パターン 1: 自プロジェクトのチェインデータソースを読み込む
同一の分析プロジェクト内で作成したチェインデータソースを、その分析プロジェクト自身で読み込むことはできません。
分析プロジェクトA├── データの読み込み├── 加工処理├── チェインデータソース化 → チェインDS「X」として保存└── チェインDS「X」を読み込み ← NG(自プロジェクトで作成したチェインDSは読み込めない)パターン 2: 下流プロジェクトのチェインデータソースを読み込む
分析プロジェクト間でチェインデータソースを介した依存関係がある場合、下流(依存先)のプロジェクトで作成されたチェインデータソースを上流で読み込むことはできません。
分析プロジェクトA├── データの読み込み├── 加工処理└── チェインデータソース化 → チェインDS「X」として保存
分析プロジェクトB(プロジェクトAの下流)├── チェインDS「X」を読み込み├── 加工処理└── チェインデータソース化 → チェインDS「Y」として保存
分析プロジェクトA└── チェインDS「Y」を読み込み ← NG(下流プロジェクトBのチェインDSは読み込めない)この例では、プロジェクト A → プロジェクト B という依存関係があるため、プロジェクト B で作成されたチェインデータソースをプロジェクト A で読み込むと循環参照になります。
中間データにおける循環参照
中間データは、同一分析プロジェクト内の異なるワークフロー間でデータを受け渡す機能です。
パターン 1: 同一ツリー内での循環参照
同じワークフローの同じツリー内で、出力した中間データを再度読み込むことはできません。
ワークフロー1 ツリー1├── 中間データの読み込み ← 中間データ「A」を読み込み├── 加工処理└── 中間データ化 → 中間データ「A」として保存 ← NGパターン 2: 同一ワークフロー内の異なるツリー間での循環参照
同じワークフロー内であれば、異なるツリー間でも循環参照として判定されます。
ワークフロー1 ツリー1├── データの読み込み├── 加工処理└── 中間データ化 → 中間データ「A」として保存
ワークフロー1 ツリー2└── 中間データ「A」を読み込み ← NG(同一ワークフロー内のため循環参照)パターン 3: ワークフローを跨いだ循環参照
複数のワークフローを経由して元のワークフローに戻る場合も循環参照となります。
2 ワークフロー間の循環
ワークフロー1├── 中間データ「A」を読み込み├── 加工処理└── 中間データ「B」として保存
ワークフロー2├── 中間データ「B」を読み込み├── 加工処理└── 中間データ「A」として保存 ← NG3 ワークフロー以上を経由した循環
ワークフロー1 → 中間データA → ワークフロー2 → 中間データB → ワークフロー3 → 中間データC → ワークフロー1 ← NGパターン 4: 異なるツリーを経由した循環参照
ワークフローを跨いだ後、元のワークフローの別のツリーに到達する場合も循環参照となります。
ワークフロー1 ツリー1├── データの読み込み├── 加工処理└── 中間データ「A」として保存
ワークフロー2 ツリー1├── 中間データ「A」を読み込み├── 加工処理└── 中間データ「B」として保存
ワークフロー1 ツリー2└── 中間データ「B」を読み込み ← NG(ワークフロー1に戻るため循環参照)循環参照の検出
nehan では、チェインデータソースや中間データを作成・更新する際に、循環参照が発生しないかを自動的にチェックします。 循環参照が検出された場合は、エラーメッセージが表示され、操作がブロックされます。