IngaDB 0.1 · 製品ドキュメント
IngaDB/ドキュメントAPI v1
ドキュメントを参照
利用例

IngaDBの利用例

架空の包装ラインpackaging-lineを使い、IngaDBの主な機能を6つの例で説明します。 コード例はすべてクイックスタートで構築した環境を前提としており、 そのまま実行できます。

解説とハンズオンAPI v1ingactl
このページの読み方

各例は独立しているため、関心のあるものから読めます。 3番目では、AIエージェントを使って報告書から証拠レコードを作る手順を説明します。

curlとingactlの使い分け

/db/v1はバージョン管理されたHTTP APIで、SDKや独自の連携処理から利用します。 1と2では、リクエストの内容が分かるようにcurlを使います。ingactlは、インスタンスから取得したカタログを基に、/api以下の 読み取り・書き込みAPIを呼び出すCLIです。3〜6ではingactlを使用します。 どちらも同じデータを操作します。

1. フォールトツリーをデータとして管理する

ホワイトボード上のフォールトツリーを、検索・差分確認・履歴追跡ができる 型付きトポロジーとして保存します。

イベントとゲートは型付きデータとして書き込みます。トポロジー全体の置換は一括して行われるため、 読み取り側に更新途中の状態が返ることはありません。

ターミナルbash
curl -s -X PUT "localhost:9876/db/v1/graphs/$GID/topology" \
  -H "X-Org-Id: $ORG" -H 'content-type: application/json' -d '{
  "events": [
    {"id":"E_BEARING","label":"軸受摩耗","component":"conveyor","failure_mode":"wear"},
    {"id":"E_SEAL","label":"シール漏れ","component":"pump","failure_mode":"seal_leak"}
  ],
  "gates": [
    {"id":"G_TOP","label":"ライン停止","type":"OR","inputs":["E_BEARING","E_SEAL"]}
  ]
}'

curl -s -X POST "localhost:9876/db/v1/graphs/$GID/views/analysis" \
  -H "X-Org-Id: $ORG" -d '{}' \
  | jq '{p_top: .analysis.gate_quantities.G_TOP, rev: .analysis.graph_revision}'

描画ツールとは異なり、ツリーを検索でき、すべての変更をリビジョン単位で追跡できます。 各分析結果には、計算に使ったリビジョンが記録されます。

2. 故障メカニズムからフォールトツリーを生成する

ハザードごとにツリーを描くのではなく、設備の故障モード・伝播・冗長性を「メカニズム事実」として 一度だけ登録します。必要になった時点で、対象のハザードに対応するツリーを生成できます。

ターミナルbash
curl -s -X POST localhost:9876/api/mechanism -H "X-Org-Id: $ORG" -d '{
  "source": "manual",
  "facts": [
    {"component":"pump","fact_type":"failure_mode","subject":"pump","object":"seal_leak","params":{}},
    {"component":"line","fact_type":"propagates_to","subject":"pump","object":"line",
     "params":{"class":"omission","rule":"or"}},
    {"component":"pump_house","fact_type":"redundancy","subject":"pumps","object":"pump",
     "params":{"k":1,"n":2}}
  ]
}'

curl -s -X POST "localhost:9876/db/v1/graphs/$GID/compile" -H "X-Org-Id: $ORG" \
  -d '{"component":"line","class":"omission"}' \
  | jq '{top_gate_id, written, cut_branches: (.cut_branches|length)}'

writtenは常にfalseです。この処理はメカニズム事実から生成した ツリーを返すだけで、データベースを更新しません。フィードバックループなど、 フォールトツリーでは表せないため処理を打ち切った枝は、理由とともにcut_branchesへ列挙されます。ポンプを二重化する場合は、冗長性の事実を追加して もう一度生成します。

レスポンスには生成されたツリーが含まれます。以下は、実際の値を変えずに抜粋し、注釈を付けたものです。

実際のcompile応答(抜粋)json
{
  "written": false,                          ← ①
  "top_gate_id": "G_LINE_OMISSION",
  "nodes": [
    { "id": "E_CONVEYOR_BEARING_WEAR", … },
    { "id": "G_PUMPS_OMISSION",
      "label": "pumps fails (2 of 2)",       ← ②
      "properties": { "gate_type": "AND" } },
    …
  ],
  "provenance": [
    { "gate_id": "G_LINE_OMISSION",
      "rule": "or",
      "from_facts": [
        "propagates_to(conveyor -> line)",   ← ③
        "redundancy(pump_house, pumps)" ] } ],
  "cut_branches": []                         ← ④
}
  1. ① 読み取り専用の生成処理なので、データベースは更新されません。
  2. ② 冗長性の事実(k=1, n=2)がANDゲートに変換されています。
  3. ③ 各ゲートの根拠になったメカニズム事実です。
  4. ④ 打ち切った枝の一覧です。このモデルには該当する枝がありません。

3. 報告書から証拠レコードを作成する

過去のインシデント報告書から、出典付きの証拠レコードを作成します。 IngaDBは、そのレコードを基にイベントの確率を計算します。たとえば、入力となる報告書は次のような内容です。

incident-reports.txttext
【報告書26-041】5/12夜勤
充填ライン3号機、段取り替え後の立ち上げ中に停止。調査の結果、
供給ポンプP-101のメカニカルシールから微量の漏れを確認。
シール交換で復旧。停止時間45分。

【報告書26-055】6/3日勤
3号機のポンプでまた圧力低下。前回と同じ箇所からの漏れ。
予備シールに交換。次回定修で軸受も点検のこと。

【報告書26-072】7/18夜勤
コンベアC-3の軸受から異音。振動値は管理値内だが
摩耗の初期兆候あり。グリスアップして経過観察。

Claude CodeやCodexなどのコーディングエージェントを使うと、文章から型付きレコードの候補を 抽出できます。まず、ingactl skillが出力する操作ガイドをエージェントに渡します。 このガイドはインスタンスのカタログから生成されるため、サーバーが提供するAPIと一致します。

ターミナルbash
ingactl sync
ingactl skill   # 検索 → 契約確認 → ドライラン → 実行、の操作ガイドを出力

指示には次の3点を明記します。候補をIngaDBが受け付ける型に限定すること、根拠箇所を 原文のまま引用すること、表記揺れの対応表を先に作ることです。この例では、 「供給ポンプP-101」と「3号機のポンプ」を同じ設備として対応付けます。 エージェントが出力する候補JSONは、次のようになります。

candidates.jsonjson
{
  "aliases": [
    {"component": "pump",
     "mentions": ["供給ポンプP-101", "3号機のポンプ"]}
  ],
  "incidents": [
    {"id": "INC-26-041", "event_id": "E_SEAL",
     "component": "pump", "failure_mode": "seal_leak",
     "occurred_at": "2026-05-12", "confidence": "high",
     "source_span": "供給ポンプP-101のメカニカルシールから微量の漏れを確認"},
    {"id": "INC-26-055", "event_id": "E_SEAL",
     "component": "pump", "failure_mode": "seal_leak",
     "occurred_at": "2026-06-03", "confidence": "high",
     "source_span": "3号機のポンプでまた圧力低下。前回と同じ箇所からの漏れ"},
    {"id": "INC-26-072", "event_id": "E_BEARING",
     "component": "conveyor", "failure_mode": "wear",
     "occurred_at": "2026-07-18", "confidence": "medium",
     "source_span": "コンベアC-3の軸受から異音。…摩耗の初期兆候あり"}
  ]
}

source_spanには原文をそのまま記録します。レビュー時は、候補と元の報告書を 照合して内容を確認します。報告書26-072をmediumとした理由が「故障ではなく初期兆候」だという 判断も、この形式なら確認できます。

人が承認した候補だけを登録します。mutateと記されたルートでは実行前に確認が入り、--projectで指定したプロジェクトIDは、カタログで定義された位置に設定されます。 インシデントはcomponentとfailure_modeを使って、手書きか自動生成かを問わず、 ツリー上のイベントに対応付けられます。

ターミナルbash
cat > approved-incidents.json <<'EOF'
{"incidents": [
  {"component": "pump", "failure_mode": "seal_leak",
   "symptom": "シール漏れによる停止45分(報告書26-041)"},
  {"component": "pump", "failure_mode": "seal_leak",
   "symptom": "圧力低下・同一箇所の漏れ(報告書26-055)"},
  {"component": "conveyor", "failure_mode": "wear",
   "symptom": "軸受異音・摩耗の初期兆候(報告書26-072)"}
]}
EOF

ingactl api call data/incidents/append \
  --project 'packaging-line' --file approved-incidents.json \
  --dry-run   # 解決済みリクエストを、送信せずに確認

ingactl api call data/incidents/append \
  --project 'packaging-line' --file approved-incidents.json

登録後は、読み取り専用のAPIで証拠レコードと分析結果を確認します。

ターミナルbash
ingactl api call data/event-evidence \
  --project 'packaging-line' --param node_id=E_SEAL -o json
ingactl api call data/analysis --project 'packaging-line' -o json
実際の運用例

当社の故障ナレッジ基盤「Causation」は、 不具合報告書や保全記録をAIで構造化し、対策効果を計算するSaaSです。 IngaDBと同じ因果分析エンジンを使い、 「抽出はAI、承認は人、計算は決定論的エンジン」という役割分担で運用しています。

AIの出力は人が確認する

AIによる抽出結果は、そのまま登録せず候補として扱います。 人が内容を確認して承認し、IngaDBが入力を検証して計算します。エージェントには必要な読み取り権限だけを与え、 書き込みは承認済みのレコードに限定します。これにより、計算結果から引用元までたどれます。

4. 分析結果が最新か確認する

週次のリスクレビューで使う分析結果が最新かを確認します。無効になっている場合は、 計算後に何が変わったのかを差分で確認できます。

ターミナルbash
ingactl api call data/analysis --project 'packaging-line' -o json
# → 計算済みビュー、staleの状態、changes_sinceの差分

curl -s "localhost:9876/db/v1/graphs/$GID/deltas?from=0" \
  -H "X-Org-Id: $ORG" | jq '.deltas[] | {revision, kind}'

これにより、「先週から証拠が3件増え、トポロジーは変わっていない」といった変更点と、 再計算後の確率を確認してから会議に提示できます。

5. 保存データを変更せずに対策案を比較する

シール強化への投資を検討するため、対策前後の最上位事象の確率を比較します。 What-if分析は保存データを変更せずに実行できます。

ターミナルbash
# 強化シール導入後の想定値でモデルを評価する(結果は保存されない)
ingactl api call pipeline/what-if \
  --project 'packaging-line' \
  --set 'overrides=[{"target_id":"E_SEAL","value":0.005}]' -o json

What-if分析の結果は保存されません。結果には、評価の基準にしたリビジョンが含まれます。 稟議書には、対策前後の確率と基準リビジョンを記載できます。

6. AIエージェントの回答に分析結果を使う

「ライン停止の一番の要因は?」という質問に対し、エージェント自身の記憶ではなく、 IngaDBが決定論的に計算した重要度指標を使って回答します。

ターミナルbash
# 1. 対象を探す
ingactl api call data/tree/search \
  --project 'packaging-line' --param query=シール -o json

# 2. 最上位事象までの因果経路を辿る
ingactl api call data/causal-path \
  --project 'packaging-line' --param node_id=E_SEAL -o json

# 3. 重要度で「一番の要因」に答える
ingactl api call data/importance \
  --project 'packaging-line' --param node_id=E_SEAL -o json

各レスポンスには計算に使ったリビジョンが含まれます。そのため、エージェントは 「rev 42時点で、Fussell-Vesely重要度が最も高いのはシール漏れです」のように、 計算時点を明示して回答できます。

次に進む