Skip to content

循環参照の制約

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」として保存 ← NG

3 ワークフロー以上を経由した循環

ワークフロー1 → 中間データA → ワークフロー2 → 中間データB → ワークフロー3 → 中間データC → ワークフロー1 ← NG

パターン 4: 異なるツリーを経由した循環参照

ワークフローを跨いだ後、元のワークフローの別のツリーに到達する場合も循環参照となります。

ワークフロー1 ツリー1
├── データの読み込み
├── 加工処理
└── 中間データ「A」として保存
ワークフロー2 ツリー1
├── 中間データ「A」を読み込み
├── 加工処理
└── 中間データ「B」として保存
ワークフロー1 ツリー2
└── 中間データ「B」を読み込み ← NG(ワークフロー1に戻るため循環参照)

循環参照の検出

nehan では、チェインデータソースや中間データを作成・更新する際に、循環参照が発生しないかを自動的にチェックします。 循環参照が検出された場合は、エラーメッセージが表示され、操作がブロックされます。