/** * WPML compatibility functions * * @global array $duplicated_posts Array to store the posts being duplicated. * * @package Yoast\WP\Duplicate_Post * @since 3.2 */ add_action( 'admin_init', 'duplicate_post_wpml_init' ); /** * Add handlers for WPML compatibility. */ function duplicate_post_wpml_init() { if ( defined( 'ICL_SITEPRESS_VERSION' ) ) { add_action( 'dp_duplicate_page', 'duplicate_post_wpml_copy_translations', 10, 3 ); add_action( 'dp_duplicate_post', 'duplicate_post_wpml_copy_translations', 10, 3 ); add_action( 'shutdown', 'duplicate_wpml_string_packages', 11 ); } } global $duplicated_posts; // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: Renaming a global variable is a BC break. $duplicated_posts = []; /** * Copy post translations. * * @global SitePress $sitepress Instance of the Main WPML class. * @global array $duplicated_posts Array of duplicated posts. * * @param int $post_id ID of the copy. * @param WP_Post $post Original post object. * @param string $status Status of the new post. */ function duplicate_post_wpml_copy_translations( $post_id, $post, $status = '' ) { global $sitepress; global $duplicated_posts; remove_action( 'dp_duplicate_page', 'duplicate_post_wpml_copy_translations', 10 ); remove_action( 'dp_duplicate_post', 'duplicate_post_wpml_copy_translations', 10 ); $current_language = $sitepress->get_current_language(); $trid = $sitepress->get_element_trid( $post->ID ); if ( ! empty( $trid ) ) { $translations = $sitepress->get_element_translations( $trid ); $new_trid = $sitepress->get_element_trid( $post_id ); foreach ( $translations as $code => $details ) { if ( $code !== $current_language ) { if ( $details->element_id ) { $translation = get_post( $details->element_id ); if ( ! $translation ) { continue; } $new_post_id = duplicate_post_create_duplicate( $translation, $status ); if ( ! is_wp_error( $new_post_id ) ) { $sitepress->set_element_language_details( $new_post_id, 'post_' . $translation->post_type, $new_trid, $code, $current_language ); } } } } // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: see above. $duplicated_posts[ $post->ID ] = $post_id; } } /** * Duplicate string packages. * * @global array() $duplicated_posts Array of duplicated posts. */ function duplicate_wpml_string_packages() { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: renaming the function would be a BC-break. global $duplicated_posts; foreach ( $duplicated_posts as $original_post_id => $duplicate_post_id ) { // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: using WPML native filter. $original_string_packages = apply_filters( 'wpml_st_get_post_string_packages', false, $original_post_id ); // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: using WPML native filter. $new_string_packages = apply_filters( 'wpml_st_get_post_string_packages', false, $duplicate_post_id ); if ( is_array( $original_string_packages ) ) { foreach ( $original_string_packages as $original_string_package ) { $translated_original_strings = $original_string_package->get_translated_strings( [] ); foreach ( $new_string_packages as $new_string_package ) { $cache = new WPML_WP_Cache( 'WPML_Package' ); $cache->flush_group_cache(); $new_strings = $new_string_package->get_package_strings(); foreach ( $new_strings as $new_string ) { if ( isset( $translated_original_strings[ $new_string->name ] ) ) { foreach ( $translated_original_strings[ $new_string->name ] as $language => $translated_string ) { do_action( // phpcs:ignore WordPress.NamingConventions.PrefixAllGlobals -- Reason: using WPML native filter. 'wpml_add_string_translation', $new_string->id, $language, $translated_string['value'], $translated_string['status'] ); } } } } } } } } 全体のシナリオ – Raqqa

全体のシナリオ

製造業の社長(あるいは事業部長)が、ある日こう言います。

「先月、粗利益率がガクッと落ちたよね。
原因を、“報告書”じゃなくて、“グラフと因果関係”で見せてほしい。
ちゃんと、どのプロセスとどの材料が効いているのか、裏付けの証拠つきで。」

そこに、Neo4j+DeciKG+KPIデータを組み合わせたこのシステムが登場し、
Q00〜Q13 のクエリが次々と「対話型ドリルダウン」として実行されていきます。


Q00. 「そもそも、何がどれくらい入っているの?」

問いのイメージ
「このデモ環境には、会社・期間・KPI・結果・コンポーネント・材料・工程・ステップ・スキル・証拠が、どれくらい入っているの?」

物語:
まずデータ担当は、「このグラフや分析はどのくらいの情報量の上に成り立っているのか」を一瞬で示します。
「会社 demo が1社あって、その会社に対して、何ヶ月分の期間、いくつのKPI定義、何件のKPI結果、何種類のコンポーネント、どれだけの材料・プロセス・ステップ・スキル・証拠が紐づいているか」を一行で出す。

これで、社長は「おお、ちゃんと“構造化された世界”の上で話をしているんだな」と腹落ちします。


Q01. 「粗利益率のトレンドをまず見せて」

問いのイメージ
「ここ数ヶ月の**粗利益率(gross_margin_rate)**がどう推移しているかを、期間ごとに並べて。」

物語:
次に、粗利益率だけを取り出して、月次の時系列を表示します。
9月までは安定していたが、10月でストンと落ち、11月に戻ったのか……といった**「症状の時系列」**をまず見せる。

ここで社長は、「やっぱりこの10月がおかしいんだな」という共通認識を持ちます。


Q02. 「9月と10月だけ、ピンポイントで比較して」

問いのイメージ
2025年9月と10月の粗利益率だけを取り出して、その差分ポイントを計算して。」

物語:
時系列全体が見えたら、焦点を問題の月に絞ります。
システムは、9月の粗利益率・10月の粗利益率・その差(何ポイント下がったか)を1行で示します。

社長は、「5ポイント下がった」「10ポイントも落ちた」といった具体的なショックを数字で認識します。
ここから、「じゃあ、この差分は何が作っているのか?」という因果の探索に入っていきます。


Q03. 「10月の粗利益率の“犯人候補コンポーネント”を教えて」

問いのイメージ
2025-10 の粗利益率に対して、どのコンポーネントがどれくらいマイナス(またはプラス)の寄与をしているのか、スコア順に一覧で。」

物語:
ここで、KPIResult(粗利益率)と、それに紐づくコンポーネントが登場します。

  • 「材料価格要因」
  • 「材料使用量要因」
  • 「プロセスコスト要因」
  • 「手戻り・歩留まり要因」

などが並び、contribution_score が大きいものほど「今回の粗利悪化に効いている可能性が高い」ことを示します。

社長は、「どうやら材料価格プロセスコストが怪しいな」という“容疑者リスト”をここで掴みます。


Q04. 「そのKPI結果を支えている“証拠資料”は何?」

問いのイメージ
「同じ 2025-10 の粗利益率について、紐づいている**エビデンス(Evidence)**を一覧で出して。どんな資料・ソースがあるの?」

物語:
「データが悪いから変だったんじゃないの?」という疑いを晴らすために、
KPI結果に紐づけておいた 証拠テーブル(価格表・仕入先レポート・社内分析メモなど) を一覧にします。

  • どのシステムから来たのか(source_system)
  • どのテーブル・どのレコードか(source_table, source_ref)
  • どんな概要なのか(summary)

が並び、**「このKPIの裏には、こういう一次情報がある」**という安心感を与えます。
社長は、「ちゃんと根拠を持って話しているんだな」と納得し始めます。


Q05. 「材料価格のKPIに紐づく証拠だけを見せて」

問いのイメージ
「**material_price_variance(材料価格差異)**というKPIの結果と、紐づくエビデンスだけに絞って見せて。」

物語:
粗利益率の悪化の中でも、「材料価格が怪しい」と目星がついたので、
今度は材料価格差異KPIにフォーカスし、どのような証拠が紐づいているかを取り出します。

例えば、

  • 「10月から鋼板の仕入価格が5%値上げされた」
  • 「特定仕入先との契約更新により単価が上昇」

といった Evidence が並びます。
これで、「材料価格の悪化が、粗利益率の下落に強く効いていそうだ」というストーリーの一部が確定します。


Q06. 「そもそも、このKPIの“設計”はどうなっていたっけ?」

問いのイメージ
「粗利益率KPIは、どのコンポーネントで構成されている想定だったのか?
設計上の**重み付け(weight)**や役割(role)はどうなっている?」

物語:
ここでは、「システムに埋め込んだKPIの設計図」を静的に確認します。

  • 粗利益率 = 売上高 −(材料コスト + プロセスコスト + …)のように分解されている
  • どのコンポーネントが「main」なのか、「補足」なのか
  • 設計上はどのコンポーネントにどれくらい注目すべきなのか

などが一目で分かります。

社長は、「このKPIは、もともとこういう観点で分解して見る前提なんだね」と理解し、
**“設計図”と“実際の異常(Q03〜Q05)”**を頭の中で結び始めます。


Q07. 「プロセスコスト・コンポーネントの内訳プロセスを見せて」

問いのイメージ
「プロセスコストコンポーネント(CMP-PROC-COST)に、どのプロセスがどの重みでぶら下がっているか?」

物語:
ここからは、プロセス側の掘り下げです。

「CMP-PROC-COST」(プロセスコスト要因)コンポーネントに対して、

  • Welding Process(溶接工程)
  • Assembly Process(組立工程)
  • 仕上げ工程 …など

HAS_PROCESS_DRIVER でどのような重み(weight)と役割(role)で結びついているかを一覧表示します。

これで、「プロセスコストの中でも、溶接プロセスの重みが大きい」ということが見えてきます。
社長は、「じゃあ、溶接工程周りをもっと詳しく見せて」と次の質問に進みます。


Q08. 「溶接・組立プロセスの中の“ステップ”を見せて」

問いのイメージ
「溶接(PROC-WELD)と組立(PROC-ASSEMBLE)のプロセスの下に、どんなステップが並んでいて、どの順番・優先度になっている?」

物語:
プロセスの内部をさらに分解して、Step 単位で見に行きます。

  • STEP-WELD-01(溶接準備)
  • STEP-WELD-02(本溶接)
  • STEP-GRIND(研磨)
  • STEP-ASSEMBLE(組立)

といったステップが、各プロセスに対して HAS_STEP でシーケンス付きでぶら下がっている様子が分かります。

「溶接プロセスの中でも、このステップがコストの要因になっているのでは?」という
**“ボトルネック候補”**がさらに絞り込まれます。


Q09. 「そのステップを回すのに、どんなスキルが要るの?」

問いのイメージ
「溶接の主要ステップ(STEP-WELD-01, STEP-WELD-02, STEP-GRIND)に対して、どのスキルがどのレベルで必要なの?」

物語:
ここで、ステップとスキルの関係を見ます。

  • 溶接準備 → 溶接スキルA(必須度・重要度10)
  • 本溶接 → 溶接スキルA(重要度8)
  • 研磨 → 研磨スキル(重要度7)

といった関係が REQUIRES_SKILL として出てきます。

これにより、「10月、溶接Aランクの人員が不足して、残業や外注が増えた」など、
人材面の要因をストーリーに組み込むことができます。
将来的には、ここに勤怠情報やスキルマトリクスを重ねると、もっと強い示唆が出せます。


Q10. 「同じステップの標準工数はどうなっている?」

問いのイメージ
「さっきのようなキーステップに対して、標準工数(std_minutes)や労務タイプ(直間区分など)はどう定義されている?」

物語:
今度は、「そのステップは本来、何分ぐらいで終わるべきなのか?」という標準時間を見に行きます。

  • STEP-WELD-01 → 15分(直接工)
  • STEP-WELD-02 → 30分(直接工)
  • STEP-ASSEMBLE → 20分(直接工)

といった StandardLaborTimeHAS_STANDARD_LABOR で結びついています。

もし標準工数と実績工数の差異を Neo4j に載せていけば、
「このステップの標準時間からの乖離が、粗利に与えている影響」を
グラフベースでトレースすることも可能になります。


Q11. 「材料コストコンポーネントの内訳材料を見せて」

問いのイメージ
「材料コストコンポーネント(CMP-MAT-COST)に、どの材料がどれくらいの重みで紐づいている?」

物語:
プロセス側を見たので、次は材料側のドライバーです。

CMP-MAT-COST に対して、

  • MAT-STEEL-SHEET(鋼板)
  • MAT-WIRE(溶接ワイヤー)
  • MAT-PAINT(塗料)

などが HAS_MATERIAL_DRIVER で紐づき、それぞれの weight や role が分かります。

これで、「材料コストの中でも、鋼板が最重要ドライバーだ」ということが分かり、
「さっきの材料価格差異KPIと、この鋼板の価格改定Evidenceが結びつく」わけです。


Q12. 「鋼板を使っているステップと、その標準使用量を見せて」

問いのイメージ
「鋼板(MAT-STEEL-SHEET)を使うステップはどれで、それぞれ標準使用量はいくつ? 単位や使用区分は?」

物語:
材料とプロセスをつなぐ最後のピースです。

  • 「どのステップが鋼板をどれだけ使う想定なのか(標準量)」
  • 「そのステップが、さっきまで見てきた溶接プロセスのどの部分なのか」

USES_MATERIALHAS_STANDARD_MATERIAL を通じて一覧にします。

これで、「鋼板の仕入価格が上がった」と「鋼板を多く使うステップが粗利に効いている」が一本の線で繋がり、
「10月の粗利益率悪化は、鋼板価格×使用ステップの組み合わせで説明できそうだ」という感覚が生まれます。


Q13. 「2025-10 の粗利悪化を、1本の経路で“物語として”見せて」

問いのイメージ
「2025-10 の粗利益率(KPIResult)から、
コンポーネント → プロセス/材料ドライバー → エビデンスまで、
1本のテーブルとして“説明パス”を一覧で出して。」

物語:
最後に、このシステムが本当にやりたいこと──
**「症状 → 原因候補 → ドライバー → 証拠」**を、一発でテーブルにします。

  • KPIResult(2025-10, gross_margin_rate, 値そのもの)
  • それに効いている Component(材料価格・プロセスコスト…)
  • Component に紐づく Process / Material(溶接、鋼板…)
  • それらを裏付ける Evidence(仕入価格表、契約変更、社内レポート…)

が、1行ずつ「ストーリーの1パターン」として並びます。

社長は、画面を見ながらこう言えます。

「なるほど。10月の粗利益率が落ちたのは、
主に鋼板価格の上昇と、それを多く使う溶接プロセスの工数・使用量が影響していて、
それはこの価格表とこのレポートに裏付けがあるんだね。」

ここまで出せると、単なる「グラフの可視化」ではなく、
**“説明可能な管理会計グラフ”**として、コンサルの仕事をそのまま支えるツールだ、ということが伝わります。

1. 会社・組織まわり

COMPANY

  • 分析の単位になる「会社」マスタ。会社コード(company_key)、名称、通貨など。

ORG_UNIT

  • 事業部・部門・課などの「組織ユニット」。どの会社の、どんな種類の組織かを持つ。

COST_CENTER

  • 原価を集計するための「コストセンター」マスタ。製造部門・間接部門などの区分もここ。

ORG_COST_CENTER_LINK

  • 組織とコストセンターの対応表。
    「この部署はこのコストセンターを持っている」という関係を表すリンクテーブル。

2. プロセス・ステップ・スキル・材料

PROCESS

  • 製造や業務の「プロセス」(例:溶接プロセス、組立プロセス)マスタ。

STEP

  • プロセスをさらに分解した「ステップ」(作業ステップ)マスタ。

SKILL

  • 作業に必要な「スキル」(資格・技量レベルなど)のマスタ。

MATERIAL

  • 製造やサービスに使う「材料・部材」マスタ。品目、カテゴリ、単位(UoM)など。

3. 標準値(標準工数・標準使用量)

STANDARD_LABOR_TIME

  • ステップごとの「標準工数(何分かかる想定か)」を定義するテーブル。
    直課/間接などの区分や有効期間も含む。

STANDARD_MATERIAL_QTY

  • ステップごとの「標準材料使用量」を定義するテーブル。
    どのステップで、どの材料を、どれくらい使う前提かを持つ。

4. プロセス構造・ステップとスキル/材料の紐づけ

PROCESS_STEP_MAP

  • プロセスとステップの対応表。
    どのプロセスが、どの順番でどのステップから構成されるか(sequence / is_primary)を持つ。

STEP_REQUIRED_SKILL

  • ステップに必要なスキルのマッピング。
    「このステップには溶接スキルAが必須で、重要度は10」のような情報。

STEP_MATERIAL_MAP

  • ステップで使う材料のマッピング。
    「このステップは鋼板を使用する」といった、使用有無・種別を表現。

5. KPI とコンポーネント

KPI_DEF

  • 管理会計で使う「KPI定義」マスタ。KPIコード、名称、カテゴリ、単位など。

COMPONENT_DEF

  • KPIを分解するための「コンポーネント」定義。
    例:材料コスト要因、プロセスコスト要因、歩留まり要因…などの“説明要素”。

KPI_COMPONENT_MAP

  • KPIとコンポーネントの対応表。
    どのKPIを、どのコンポーネントで、どれくらいの重み(weight)で分解するかを定義。

COMPONENT_MATERIAL_DRIVER_MAP

  • コンポーネントと「材料ドライバー」の対応表。
    材料コスト要因コンポーネント ↔ 鋼板などの材料に、重みや役割を付けて紐づける。

COMPONENT_PROCESS_DRIVER_MAP

  • コンポーネントと「プロセスドライバー」の対応表。
    プロセスコスト要因コンポーネント ↔ 溶接・組立などのプロセスを紐づける。

6. 期間・KPI実績・寄与度

PERIOD

  • 月次や四半期などの「期間」マスタ。期間キー、種別、開始日・終了日、表示ラベルを持つ。

KPI_RESULT

  • 会社×期間×KPIごとの「実績値」。
    粗利益率や材料差異などの値、計算根拠(calc_basis)、メモ(notes)を保存。

KPI_COMPONENT_CONTRIBUTION

  • 各KPI結果に対する「コンポーネント別の寄与度」。
    「2025-10の粗利率を、材料コスト要因が何ポイント悪化させたか」などのスコアを表現。

7. 証拠(Evidence)とその紐づけ

EVIDENCE

  • KPIや分析結果を裏づける「証拠情報」のマスタ。
    どのシステムの、どのテーブル・どのレコードに紐づくか、概要(summary)も含む。

KPI_EVIDENCE_MAP

  • KPI_RESULT と EVIDENCE の対応表。
    「このKPI結果は、この証拠資料によって説明されている」というリンク+関係種別(relation_type)・メモなど。


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です