@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ks: <https://comcomponent.com/vocab/> .

<https://comcomponent.com/blog/2026/03/07/001-file-integration-locking-best-practices-komurasoft-style/#article>
    schema:about <https://comcomponent.com/knowledge/file-handoff-protocol/>, <https://comcomponent.com/knowledge/atomic-claim/>, <https://comcomponent.com/knowledge/temp-then-rename-publish/> ;
    schema:mentions <https://comcomponent.com/knowledge/exists-then-create-antipattern/>, <https://comcomponent.com/knowledge/done-manifest-file/>, <https://comcomponent.com/knowledge/lock-file-lease/>, <https://comcomponent.com/knowledge/stale-lock/>, <https://comcomponent.com/knowledge/idempotent-processing/>, <https://comcomponent.com/knowledge/advisory-lock/>, <https://comcomponent.com/knowledge/byte-range-lock/>, <https://comcomponent.com/knowledge/size-stability-completion-check/>, <https://comcomponent.com/knowledge/shared-file-mutual-update-antipattern/>, <https://comcomponent.com/knowledge/duplicate-processing/>, <https://comcomponent.com/knowledge/partial-write-read/>, <https://comcomponent.com/knowledge/direct-final-write-antipattern/>, <https://comcomponent.com/knowledge/atomic-creation/>, <https://comcomponent.com/knowledge/cross-volume-rename-fallback/>, <https://comcomponent.com/knowledge/rename-fails-on-open-handle/>, <https://comcomponent.com/knowledge/smb-share-file-handoff/>, <https://comcomponent.com/knowledge/file-timestamp-unreliability/>, <https://comcomponent.com/knowledge/change-notification-loss/>, <https://comcomponent.com/knowledge/periodic-directory-listing/>, <https://comcomponent.com/knowledge/os-file-lock/>, <https://comcomponent.com/knowledge/heterogeneous-system-integration/>, <https://comcomponent.com/knowledge/memory-mapped-file/> .

<https://comcomponent.com/knowledge/file-handoff-protocol/> a skos:Concept ;
    skos:prefLabel "受け渡しプロトコル"@ja ;
    skos:definition "ファイル連携において、いつ読んでよいか・誰が処理権を持つか・失敗時にどう回復するかを明示的に設計する取り決め。OSロックだけに頼らず、temp->rename公開・原子的claim・done/manifest・lease化したlock file・idempotencyを組み合わせて構成する。"@ja ;
    skos:altLabel "ファイル連携プロトコル"@ja ;
    skos:altLabel "File Handoff Protocol" ;
    ks:uses <https://comcomponent.com/knowledge/atomic-claim/> ;
    ks:uses <https://comcomponent.com/knowledge/temp-then-rename-publish/> ;
    ks:uses <https://comcomponent.com/knowledge/done-manifest-file/> ;
    ks:uses <https://comcomponent.com/knowledge/lock-file-lease/> ;
    ks:uses <https://comcomponent.com/knowledge/idempotent-processing/> .

<https://comcomponent.com/knowledge/atomic-claim/> a skos:Concept ;
    skos:prefLabel "原子的claim"@ja ;
    skos:definition "複数ワーカーが同じ入力ファイルを同時に処理しないよう、処理権の確保を1操作で行うこと。incomingからprocessing/<worker>/へのrenameのほか、FileMode.CreateNewやO_CREAT|O_EXCLによる原子的なファイル作成でも実現できる。"@ja ;
    skos:altLabel "claim" ;
    skos:altLabel "Atomic Claim" ;
    ks:prevents <https://comcomponent.com/knowledge/duplicate-processing/> ;
    ks:recommendedFor <https://comcomponent.com/knowledge/exists-then-create-antipattern/> .

<https://comcomponent.com/knowledge/temp-then-rename-publish/> a skos:Concept ;
    skos:prefLabel "temp -> close -> rename/replaceでの公開"@ja ;
    skos:definition "生成中のファイルをtemp名に閉じ込め、closeしたあとで同一ディレクトリ・同一ボリューム上のfinal名へrename/replaceする、書き込み途中のファイルを読ませないための公開パターン。"@ja ;
    skos:altLabel "temp->rename公開パターン"@ja ;
    ks:prevents <https://comcomponent.com/knowledge/partial-write-read/> .

<https://comcomponent.com/knowledge/done-manifest-file/> a skos:Concept ;
    skos:prefLabel "done/manifestファイル"@ja ;
    skos:definition "本体ファイルとは別に、ファイル名・サイズ・ハッシュ・レコード数・idempotency keyなどを記録し、受信側が完全性を検証するための説明ファイル。doneファイルはその最小版。"@ja ;
    skos:altLabel "完了明示ファイル"@ja ;
    skos:altLabel "manifest" ;
    ks:recommendedFor <https://comcomponent.com/knowledge/size-stability-completion-check/> ;
    ks:recommendedFor <https://comcomponent.com/knowledge/file-timestamp-unreliability/> .

<https://comcomponent.com/knowledge/lock-file-lease/> a skos:Concept ;
    skos:prefLabel "lease化したlock file"@ja ;
    skos:definition "ownerId・host・pid・acquiredAt・expiresAt・heartbeatAtを持つ、有効期限付きの所有情報として実装するlock file。更新停止をstale判定の材料にし、削除は原則として作成者だけが行う。"@ja ;
    skos:altLabel "有効期限付きlock file"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/stale-lock/> ;
    ks:requires <https://comcomponent.com/knowledge/atomic-creation/> .

<https://comcomponent.com/knowledge/idempotent-processing/> a skos:Concept ;
    skos:prefLabel "idempotency(冪等性)を前提にした処理"@ja ;
    skos:definition "同じ入力をもう一度処理しても結果が変わらない性質を前提に、排他が破れた場合の二重実行を処理済み台帳への記録で吸収する設計。"@ja ;
    skos:altLabel "冪等な処理設計"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/duplicate-processing/> .

<https://comcomponent.com/knowledge/os-file-lock/> a skos:Concept ;
    skos:prefLabel "OSファイルロック(OSロック)"@ja ;
    skos:definition "advisory lockやbyte-range lockなど、ファイルシステムやOSが提供する排他制御の総称。同一アプリ群・同一前提の中では有効だが、受け渡しプロトコルの代わりにはならない。"@ja ;
    skos:altLabel "ロックAPI"@ja ;
    ks:uses <https://comcomponent.com/knowledge/byte-range-lock/> ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/heterogeneous-system-integration/> .

<https://comcomponent.com/knowledge/atomic-creation/> a skos:Concept ;
    skos:prefLabel "原子的作成(CreateNew / O_CREAT|O_EXCL)"@ja ;
    skos:definition "「無ければ作る」を1操作で行うファイル作成方法。.NETのFileMode.CreateNew系やPOSIXのO_CREAT | O_EXCLで実現し、確認と確保が分離した二段階チェックの隙間を無くす。"@ja ;
    skos:altLabel "原子的作成"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/exists-then-create-antipattern/> .

<https://comcomponent.com/knowledge/duplicate-processing/> a skos:Concept ;
    skos:prefLabel "二重処理(二重計上・二重送信・更新の消失)"@ja ;
    skos:definition "同じ入力ファイルが複数ワーカーに掴まれて重複処理される、または同じ更新が競合して片方の結果が消えてしまうことによる、処理の重複や更新の消失。"@ja ;
    skos:altLabel "二重処理"@ja ;
    skos:altLabel "Lost Update" .

<https://comcomponent.com/knowledge/exists-then-create-antipattern/> a skos:Concept ;
    skos:prefLabel "Exists->Createの二段階チェック"@ja ;
    skos:definition "ファイルの有無を確認してから作成する、確認と確保が別操作になった実装。間に他プロセスが割り込めるため排他にならない。"@ja ;
    skos:altLabel "確認と確保の分離アンチパターン"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/duplicate-processing/> .

<https://comcomponent.com/knowledge/direct-final-write-antipattern/> a skos:Concept ;
    skos:prefLabel "最終ファイル名への直接書き込み"@ja ;
    skos:definition "受信側が「その名前が見えたら読んでよい」と解釈しているのに、送信側が最終ファイル名に直接書き始めてしまう実装。書き込み途中の内容がそのまま見えてしまう。"@ja ;
    skos:altLabel "final名への直接書き込み"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/partial-write-read/> .

<https://comcomponent.com/knowledge/partial-write-read/> a skos:Concept ;
    skos:prefLabel "書き込み途中ファイルの読み込み事故"@ja ;
    skos:definition "受信側が、送信側がまだ書き込み中のファイルを最終ファイル名として検知し読み始めてしまうことで、JSONの閉じ括弧欠落やCSVの行数不足などの不完全なデータを処理してしまう事故。"@ja ;
    skos:altLabel "途中ファイルの誤読"@ja .

<https://comcomponent.com/knowledge/size-stability-completion-check/> a skos:Concept ;
    skos:prefLabel "ファイルサイズ安定待ちによる完了判定"@ja ;
    skos:definition "ファイルサイズが一定時間変化しないことをもって転送完了とみなす判定方法。ネットワーク越しのコピーの一時停止などで容易に誤判定する。"@ja ;
    skos:altLabel "サイズ安定待ち"@ja .

<https://comcomponent.com/knowledge/shared-file-mutual-update-antipattern/> a skos:Concept ;
    skos:prefLabel "共有ファイルの相互更新アンチパターン"@ja ;
    skos:definition "1つのstatus.csvやcounter.jsonを複数プロセスが読み書きして状態を共有しようとする設計。読み取り後の更新がタイミングによって互いに上書きされ、後に書いた側で先の更新が消える。"@ja ;
    skos:altLabel "みんなで更新するstatus.csv"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/duplicate-processing/> .

<https://comcomponent.com/knowledge/stale-lock/> a skos:Concept ;
    skos:prefLabel "stale lock"@ja ;
    skos:definition "持ち主が異常終了したのに残っているlockやclaimの状態。生きているのか死んでいるのか判定できないと、後続処理が永遠に待つことになる。"@ja ;
    skos:altLabel "持ち主不明のロック"@ja .

<https://comcomponent.com/knowledge/byte-range-lock/> a skos:Concept ;
    skos:prefLabel "byte-range lock(範囲ロック)"@ja ;
    skos:definition "ファイル全体ではなく指定した範囲だけを対象にするロック。WindowsのLockFileEx/FileStream.Lockが代表で、通常のファイルI/Oに対してはOSが強制するが、メモリマップファイル経由のアクセスには効かない。"@ja ;
    skos:altLabel "範囲ロック"@ja ;
    skos:altLabel "LockFileEx" .

<https://comcomponent.com/knowledge/heterogeneous-system-integration/> a skos:Concept ;
    skos:prefLabel "異種システム連携"@ja ;
    skos:definition "異なる言語・製品・実装同士がファイルを介して連携するシステム構成。参加者全員が同じロックの約束を守るとは限らない。"@ja ;
    skos:altLabel "異なる実装間の連携"@ja .

<https://comcomponent.com/knowledge/advisory-lock/> a skos:Concept ;
    skos:prefLabel "advisory lock"@ja ;
    skos:definition "参加者全員が約束を守る前提でだけ効くロック。OSが強制しないため、無視して読み書きするプログラムも書ける。Linuxのflockが該当する。"@ja ;
    skos:altLabel "勧告的ロック"@ja .

<https://comcomponent.com/knowledge/cross-volume-rename-fallback/> a skos:Concept ;
    skos:prefLabel "クロスボリュームのrenameフォールバック(コピー+削除)"@ja ;
    skos:definition "renameの対象がボリューム(共有)をまたぐ場合、WindowsのMoveFileExがMOVEFILE_COPY_ALLOWED指定時にコピーと削除で移動を代替すること。原子性が失われ、途中状態が見えるようになる。"@ja ;
    skos:altLabel "MOVEFILE_COPY_ALLOWED" .

<https://comcomponent.com/knowledge/smb-share-file-handoff/> a skos:Concept ;
    skos:prefLabel "共有フォルダ(SMB)越しのファイル連携"@ja ;
    skos:definition "SMB共有フォルダを介してtemp->rename公開やclaimを行う運用。同一共有内では原子性が保たれる一方、ボリュームをまたぐ移動・他プロセスによる開放中の失敗・タイムスタンプの不確実性・変更通知の取りこぼしが追加のリスクになる。"@ja ;
    skos:altLabel "SMB越しの連携"@ja .

<https://comcomponent.com/knowledge/rename-fails-on-open-handle/> a skos:Concept ;
    skos:prefLabel "renameが開いているだけで失敗する"@ja ;
    skos:definition "共有フォルダでは、ウイルス対策・検索インデクサー・他拠点のクライアントなど把握していない相手がアクセスしているだけで、publishやclaimのrenameが失敗し得ること。"@ja ;
    skos:altLabel "開放中ファイルへのrename失敗"@ja .

<https://comcomponent.com/knowledge/file-timestamp-unreliability/> a skos:Concept ;
    skos:prefLabel "ファイルタイムスタンプの不確実性"@ja ;
    skos:definition "ファイルのタイムスタンプは書き込み用ハンドルを閉じるまで完全には更新されず、ファイルシステムごとの粒度やSMB越しのサーバー時計依存もあるため、完了判定の材料にならないこと。"@ja ;
    skos:altLabel "タイムスタンプは判断材料にならない"@ja .

<https://comcomponent.com/knowledge/periodic-directory-listing/> a skos:Concept ;
    skos:prefLabel "定期的なディレクトリ列挙"@ja ;
    skos:definition "イベント通知だけに頼らず、一定間隔でディレクトリを列挙して未検知のファイルを拾う監視方式。"@ja ;
    skos:altLabel "定期再走査"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/change-notification-loss/> .

<https://comcomponent.com/knowledge/change-notification-loss/> a skos:Concept ;
    skos:prefLabel "変更通知の取りこぼし"@ja ;
    skos:definition "共有フォルダの監視をイベント通知だけに頼ると変更を取りこぼすことがあり、定期的なディレクトリ列挙と併用すると安定すること。"@ja ;
    skos:altLabel "通知の取りこぼし"@ja .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/file-handoff-protocol/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/atomic-claim/> ;
    schema:description "受け渡しプロトコルは、複数ワーカーが同じ入力を同時に処理しないよう原子的claimを構成要素として使う"@ja ;
    ks:evidence <https://pubs.opengroup.org/onlinepubs/9799919799/functions/rename.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/file-handoff-protocol/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/temp-then-rename-publish/> ;
    schema:description "受け渡しプロトコルは、書き込み途中のファイルを読ませないためにtemp->close->rename/replaceでの公開を構成要素として使う"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/fileio/moving-and-replacing-files> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/file-handoff-protocol/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/done-manifest-file/> ;
    schema:description "受け渡しプロトコルは、完了をタイムスタンプやサイズで推測せず明示するためにdone/manifestファイルを構成要素として使う"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/windows/win32/sysinfo/file-times> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/file-handoff-protocol/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/lock-file-lease/> ;
    schema:description "受け渡しプロトコルは、補助的な排他手段としてlease化したlock fileを構成要素として使う"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/windows/win32/fileio/locking-and-unlocking-byte-ranges-in-files> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/file-handoff-protocol/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/idempotent-processing/> ;
    schema:description "受け渡しプロトコルは、排他が破れた場合の最後の受け皿としてidempotencyを前提にした処理を構成要素として使う"@ja ;
    ks:evidence <https://www.rfc-editor.org/rfc/rfc9110.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/file-handoff-protocol/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/os-file-lock/> ;
    schema:description "同一アプリ群・同一前提の参加者だけで動く場合、受け渡しプロトコルは補助手段としてOSファイルロックも使う(異種システム連携では前提が崩れるため使えない)"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/windows/win32/fileio/locking-and-unlocking-byte-ranges-in-files> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/atomic-claim/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/atomic-creation/> ;
    schema:description "renameではなくファイル作成そのもので原子性を確保する場合、原子的claimは.NETのFileMode.CreateNew系やPOSIXのO_CREAT|O_EXCLによる原子的作成でも実現できる"@ja ;
    ks:evidence <https://pubs.opengroup.org/onlinepubs/9799919799/functions/open.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/atomic-claim/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/duplicate-processing/> ;
    schema:description "incomingからprocessing/<worker>/へのrenameが成功したワーカーだけを所有者にすることで、複数ワーカーによる同一ファイルの二重処理を防ぐ"@ja ;
    ks:evidence <https://pubs.opengroup.org/onlinepubs/9799919799/functions/rename.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/exists-then-create-antipattern/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/duplicate-processing/> ;
    schema:description "有無の確認とファイル作成が別操作になっているため、間に他プロセスが割り込んで同じファイルを両方が処理してしまう"@ja ;
    ks:evidence <https://pubs.opengroup.org/onlinepubs/9799919799/functions/open.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/atomic-claim/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/exists-then-create-antipattern/> ;
    schema:description "Exists->Createの二段階チェックが抱える競合問題に対し、本記事はrenameによる原子的claimを推奨している"@ja ;
    ks:evidence <https://pubs.opengroup.org/onlinepubs/9799919799/functions/rename.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/atomic-creation/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/exists-then-create-antipattern/> ;
    schema:description "Exists->Createの二段階チェックが抱える競合問題に対し、本記事はFileMode.CreateNew系やO_CREAT|O_EXCLによる原子的作成も推奨している"@ja ;
    ks:evidence <https://pubs.opengroup.org/onlinepubs/9799919799/functions/open.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/direct-final-write-antipattern/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/partial-write-read/> ;
    schema:description "最終ファイル名に直接書き始めると、受信側がその名前を検知した時点でまだ書き込み中の内容を読んでしまう"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/fileio/moving-and-replacing-files> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/temp-then-rename-publish/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/partial-write-read/> ;
    schema:description "生成中のファイルをtemp名に閉じ込め、closeしてからfinal名にrenameすることで、final名が見えた時点では内容が完成済みという約束を作る"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/fileio/moving-and-replacing-files> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/size-stability-completion-check/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/partial-write-read/> ;
    schema:description "ファイルサイズが一定時間変化しないことを完了とみなす判定は、ネットワーク越しのコピーの一時停止などで容易に完了と誤判定し、読み込み再開時に不完全な内容を読ませ得る"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/windows/win32/sysinfo/file-times> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/done-manifest-file/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/size-stability-completion-check/> ;
    schema:description "完了をサイズの安定で推測する代わりに、done/manifestファイルで完了を明示することを本記事は推奨している"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/windows/win32/sysinfo/file-times> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/shared-file-mutual-update-antipattern/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/duplicate-processing/> ;
    schema:description "1つのstatus.csvやcounter.jsonを複数プロセスが読んで更新すると、後から書いた側の更新で先の更新が消える"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/windows/win32/fileio/locking-and-unlocking-byte-ranges-in-files> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/idempotent-processing/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/duplicate-processing/> ;
    schema:description "排他が完全に守られない場合でも、同じ入力の再処理が結果を変えないようにしておくことを本記事は推奨している"@ja ;
    ks:evidence <https://www.rfc-editor.org/rfc/rfc9110.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/lock-file-lease/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/stale-lock/> ;
    schema:description "ownerId・expiresAt・heartbeatAtを持つlease形式のlock fileにすることで、持ち主不明のまま残るstale lockへの対処を本記事は推奨している"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/windows/win32/fileio/locking-and-unlocking-byte-ranges-in-files> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/lock-file-lease/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/atomic-creation/> ;
    schema:description "lease化したlock fileも、作成自体は原子的に行う必要がある"@ja ;
    ks:evidence <https://pubs.opengroup.org/onlinepubs/9799919799/functions/open.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/os-file-lock/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/byte-range-lock/> ;
    schema:description "OSファイルロックの具体例として、Windowsのbyte-range lock(LockFileEx / FileStream.Lock)がある"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/windows/win32/fileio/locking-and-unlocking-byte-ranges-in-files> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/os-file-lock/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/duplicate-processing/> ;
    schema:description "OSファイルロックは、同一アプリ群・同一前提で動く参加者同士の間でだけ、同一ファイルの同時処理を軽減できる"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/windows/win32/fileio/locking-and-unlocking-byte-ranges-in-files> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/os-file-lock/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/heterogeneous-system-integration/> ;
    schema:description "OSロックは全参加者が同じ約束で動くときだけ効くため、異種システム連携でロックAPI単体に完了通知や所有権の設計まで背負わせるのは推奨されない"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/windows/win32/fileio/locking-and-unlocking-byte-ranges-in-files> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/advisory-lock/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/heterogeneous-system-integration/> ;
    schema:description "Linuxのflockはadvisory lockなので、約束を無視して読み書きするプログラムも書けてしまい、異種システム連携でこれだけに頼るのは推奨されない"@ja ;
    ks:evidence <https://man7.org/linux/man-pages/man2/flock.2.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/temp-then-rename-publish/> ;
    rdf:predicate ks:incompatibleWith ;
    rdf:object <https://comcomponent.com/knowledge/cross-volume-rename-fallback/> ;
    schema:description "tempとfinal(共有をまたぐ場合など)が別ボリュームにあると、rename/MoveFileExがコピーと削除で移動を代替し、原子的な公開という前提が崩れる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-movefileexa> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/smb-share-file-handoff/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/cross-volume-rename-fallback/> ;
    schema:description "共有フォルダ越しの連携で、tempとfinal(またはincomingとprocessing)を別の共有に置くと、rename/MoveFileExがコピーと削除に代替され得る"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-movefileexa> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/smb-share-file-handoff/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/rename-fails-on-open-handle/> ;
    schema:description "共有フォルダにはウイルス対策・検索インデクサー・他拠点のクライアントなど把握していない相手がアクセスするため、publishやclaimのrenameが単に開かれているだけで失敗し得る"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/fileio/moving-and-replacing-files> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/done-manifest-file/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/file-timestamp-unreliability/> ;
    schema:description "書き込み用ハンドルを閉じるまで最終更新時刻が完全には更新されず、ファイルシステムやSMB越しの時計依存で粒度もずれるため、完了判定を時刻ではなくdone/manifestで行うことを本記事は推奨している"@ja ;
    ks:evidence <https://learn.microsoft.com/ja-jp/windows/win32/sysinfo/file-times> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/periodic-directory-listing/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/change-notification-loss/> ;
    schema:description "共有フォルダの監視をイベント通知だけに頼ると変更を取りこぼすことがあるため、定期的なディレクトリ列挙の併用を本記事は推奨している"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/smb-share-file-handoff/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/change-notification-loss/> ;
    schema:description "共有フォルダ越しの連携では、変更通知イベントの取りこぼしが起こり得る"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .
