@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/csharp-sqlite-practical-guide/#article>
    schema:about <https://comcomponent.com/knowledge/microsoft-data-sqlite/>, <https://comcomponent.com/knowledge/wal-mode/> ;
    schema:mentions <https://comcomponent.com/knowledge/system-data-sqlite/>, <https://comcomponent.com/knowledge/ef-core-sqlite-provider/>, <https://comcomponent.com/knowledge/sqlite-busy/>, <https://comcomponent.com/knowledge/sqlite-connection-pooling/>, <https://comcomponent.com/knowledge/sqlite-write-serialization/>, <https://comcomponent.com/knowledge/sqlite-transaction-batching/>, <https://comcomponent.com/knowledge/sqlite-commit-fsync-overhead/>, <https://comcomponent.com/knowledge/sqlite-file-handle-retention/>, <https://comcomponent.com/knowledge/sqlite-clearpool/>, <https://comcomponent.com/knowledge/sqlite-file-copy-backup/>, <https://comcomponent.com/knowledge/sqlite-corruption/>, <https://comcomponent.com/knowledge/vacuum-into/>, <https://comcomponent.com/knowledge/sqlite-backupdatabase/>, <https://comcomponent.com/knowledge/sqlite-backup-requirement/>, <https://comcomponent.com/knowledge/backupdatabase-write-blocking/>, <https://comcomponent.com/knowledge/sqlite-quick-check/>, <https://comcomponent.com/knowledge/sqlcipher/>, <https://comcomponent.com/knowledge/sqlite-encryption-requirement/>, <https://comcomponent.com/knowledge/sqlite-type-mapping/>, <https://comcomponent.com/knowledge/decimal-text-sort-bug/>, <https://comcomponent.com/knowledge/money-as-integer/>, <https://comcomponent.com/knowledge/new-sqlite-development/>, <https://comcomponent.com/knowledge/dpapi/>, <https://comcomponent.com/knowledge/app-secrets/> .

<https://comcomponent.com/knowledge/microsoft-data-sqlite/> a skos:Concept ;
    skos:prefLabel "Microsoft.Data.Sqlite"@ja ;
    skos:definition "MicrosoftがメンテナンスするSQLite向けの軽量ADO.NETプロバイダーで、ネイティブのSQLite本体もNuGetパッケージに同梱される。"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/new-sqlite-development/> ;
    ks:mitigates <https://comcomponent.com/knowledge/sqlite-busy/> ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/sqlite-encryption-requirement/> .

<https://comcomponent.com/knowledge/wal-mode/> a skos:Concept ;
    skos:prefLabel "WALモード(Write-Ahead Logging)"@ja ;
    skos:definition "変更をデータベース本体ではなく隣接する-walファイルへ追記していき、読み取りと書き込みを同時に進められるようにするSQLiteのジャーナリングモード。"@ja ;
    skos:altLabel "journal_mode=WAL" ;
    ks:mitigates <https://comcomponent.com/knowledge/sqlite-busy/> ;
    ks:incompatibleWith <https://comcomponent.com/knowledge/sqlite-file-copy-backup/> .

<https://comcomponent.com/knowledge/system-data-sqlite/> a skos:Concept ;
    skos:prefLabel "System.Data.SQLite"@ja ;
    skos:definition "SQLite開発チーム系列の老舗ADO.NETプロバイダーで、接続文字列や型の扱いがMicrosoft.Data.Sqliteとは互換性のない別物。"@ja .

<https://comcomponent.com/knowledge/ef-core-sqlite-provider/> a skos:Concept ;
    skos:prefLabel "Microsoft.EntityFrameworkCore.Sqlite"@ja ;
    skos:definition "内部でMicrosoft.Data.Sqliteを使う、EF Core向けのSQLiteデータプロバイダー。"@ja ;
    skos:altLabel "EF Core SQLiteプロバイダー"@ja ;
    skos:broader <https://comcomponent.com/knowledge/microsoft-data-sqlite/> ;
    ks:uses <https://comcomponent.com/knowledge/microsoft-data-sqlite/> .

<https://comcomponent.com/knowledge/new-sqlite-development/> a skos:Concept ;
    skos:prefLabel "新規開発でのSQLiteライブラリ採用"@ja ;
    skos:definition "これから作るアプリでC#からSQLiteを扱うためのADO.NETプロバイダーを新規に選定・採用すること。"@ja .

<https://comcomponent.com/knowledge/sqlite-busy/> a skos:Concept ;
    skos:prefLabel "SQLITE_BUSY(database is locked)"@ja ;
    skos:definition "他の接続が書き込みロックを持っているときにSQLiteが返すエラーで、Microsoft.Data.Sqliteはコマンドタイムアウトまで自動リトライする。"@ja ;
    skos:altLabel "database is locked" .

<https://comcomponent.com/knowledge/sqlite-write-serialization/> a skos:Concept ;
    skos:prefLabel "書き込み経路の一本化(Channelsによる書き込みキュー)"@ja ;
    skos:definition "複数スレッドが直接DBに書かず、System.Threading.Channelsのキューに投げて専任の書き込みループだけがコミットする設計。"@ja ;
    skos:altLabel "System.Threading.Channels書き込みキュー"@ja ;
    ks:mitigates <https://comcomponent.com/knowledge/sqlite-busy/> ;
    ks:uses <https://comcomponent.com/knowledge/sqlite-transaction-batching/> .

<https://comcomponent.com/knowledge/sqlite-transaction-batching/> a skos:Concept ;
    skos:prefLabel "明示的トランザクションによるINSERTのバッチ化"@ja ;
    skos:definition "複数件のINSERTをBeginTransactionで囲みまとめてCommitすることで、コミットごとのfsyncコストを削減する手法。"@ja ;
    ks:mitigates <https://comcomponent.com/knowledge/sqlite-commit-fsync-overhead/> .

<https://comcomponent.com/knowledge/sqlite-commit-fsync-overhead/> a skos:Concept ;
    skos:prefLabel "コミットごとの同期書き込み(fsync)コスト"@ja ;
    skos:definition "SQLiteがコミットのたびに行うストレージへの同期書き込みにかかるコストで、1件ずつ暗黙コミットするとSSDでも毎秒数百〜数千件で頭打ちになる。"@ja .

<https://comcomponent.com/knowledge/sqlite-file-copy-backup/> a skos:Concept ;
    skos:prefLabel "稼働中DBファイルの単純ファイルコピー"@ja ;
    skos:definition "SQLiteのDBファイルが稼働中のまま、OSのファイルコピー機能でそのまま複製するバックアップ方法。"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/sqlite-corruption/> ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/sqlite-backup-requirement/> .

<https://comcomponent.com/knowledge/sqlcipher/> a skos:Concept ;
    skos:prefLabel "SQLCipher"@ja ;
    skos:definition "SQLiteデータベースファイル全体を透過的に暗号化する、標準のSQLiteネイティブライブラリを置き換える形の拡張。"@ja ;
    skos:altLabel "SQLitePCLRaw.bundle_e_sqlcipher" ;
    ks:recommendedFor <https://comcomponent.com/knowledge/sqlite-encryption-requirement/> .

<https://comcomponent.com/knowledge/dpapi/> a skos:Concept ;
    skos:prefLabel "DPAPI"@ja ;
    skos:definition "実行中のマシン上でアプリの秘密情報を保護するWindowsのデータ保護API。"@ja ;
    skos:altLabel "データ保護API"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/app-secrets/> .

<https://comcomponent.com/knowledge/sqlite-connection-pooling/> a skos:Concept ;
    skos:prefLabel "Microsoft.Data.Sqliteの接続プーリング"@ja ;
    skos:definition "バージョン6.0以降Microsoft.Data.Sqliteで既定有効になっている、接続のOpen/Closeを高速化する仕組み。"@ja ;
    skos:broader <https://comcomponent.com/knowledge/microsoft-data-sqlite/> ;
    ks:mayCause <https://comcomponent.com/knowledge/sqlite-file-handle-retention/> .

<https://comcomponent.com/knowledge/sqlite-file-handle-retention/> a skos:Concept ;
    skos:prefLabel "プーリングによるDBファイルハンドルの保持"@ja ;
    skos:definition "接続をClose/Disposeしてもネイティブの接続がプールに残り、DBファイルのハンドルを掴み続けたままになる状態。"@ja ;
    skos:broader <https://comcomponent.com/knowledge/sqlite-connection-pooling/> .

<https://comcomponent.com/knowledge/sqlite-clearpool/> a skos:Concept ;
    skos:prefLabel "SqliteConnection.ClearPool"@ja ;
    skos:definition "指定した接続文字列に対応する接続プールを破棄し、DBファイルのハンドルを解放するMicrosoft.Data.SqliteのAPI。"@ja ;
    skos:altLabel "ClearAllPools" ;
    skos:broader <https://comcomponent.com/knowledge/sqlite-connection-pooling/> ;
    ks:prevents <https://comcomponent.com/knowledge/sqlite-file-handle-retention/> .

<https://comcomponent.com/knowledge/sqlite-corruption/> a skos:Concept ;
    skos:prefLabel "SQLiteデータベースの破損"@ja ;
    skos:definition "ディスク障害や不適切なファイル操作によってSQLiteのファイル構造が壊れ、正しく読み書きできなくなる状態。"@ja ;
    ks:verifiedBy <https://comcomponent.com/knowledge/sqlite-quick-check/> .

<https://comcomponent.com/knowledge/vacuum-into/> a skos:Concept ;
    skos:prefLabel "VACUUM INTO"@ja ;
    skos:definition "元のファイルを変更せず、断片化を解消した一貫性のある最小サイズのコピーを別ファイルへ作成できるSQLiteのSQL文。"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/sqlite-backup-requirement/> .

<https://comcomponent.com/knowledge/sqlite-backup-requirement/> a skos:Concept ;
    skos:prefLabel "稼働中SQLiteデータベースの一貫したバックアップ要件"@ja ;
    skos:definition "稼働中のSQLiteデータベースを、トランザクション途中の状態を混ぜずに一貫性のある形で複製したいという要件。"@ja .

<https://comcomponent.com/knowledge/sqlite-backupdatabase/> a skos:Concept ;
    skos:prefLabel "SqliteConnection.BackupDatabase"@ja ;
    skos:definition "SQLiteのBackup APIをラップした、稼働中でも接続オブジェクト間で一貫したスナップショットを作成できるMicrosoft.Data.SqliteのAPI。"@ja ;
    skos:altLabel "Backup API" ;
    skos:broader <https://comcomponent.com/knowledge/microsoft-data-sqlite/> ;
    ks:recommendedFor <https://comcomponent.com/knowledge/sqlite-backup-requirement/> ;
    ks:mayCause <https://comcomponent.com/knowledge/backupdatabase-write-blocking/> .

<https://comcomponent.com/knowledge/backupdatabase-write-blocking/> a skos:Concept ;
    skos:prefLabel "BackupDatabase完了までの書き込みブロック"@ja ;
    skos:definition "Microsoft.Data.SqliteのBackupDatabaseが可能な限り速くコピーする代わりに、完了するまで他の接続からの書き込みをブロックする現在の実装挙動。"@ja ;
    skos:broader <https://comcomponent.com/knowledge/sqlite-backupdatabase/> .

<https://comcomponent.com/knowledge/sqlite-quick-check/> a skos:Concept ;
    skos:prefLabel "PRAGMA quick_check"@ja ;
    skos:definition "完全なintegrity_checkより軽量に、SQLiteデータベースの整合性を検証できるPRAGMA文。"@ja .

<https://comcomponent.com/knowledge/sqlite-encryption-requirement/> a skos:Concept ;
    skos:prefLabel "SQLiteデータベース全体の暗号化要件"@ja ;
    skos:definition "SQLiteのデータベースファイル全体を暗号化して保存したいという要件。"@ja .

<https://comcomponent.com/knowledge/app-secrets/> a skos:Concept ;
    skos:prefLabel "アプリの秘密情報"@ja ;
    skos:definition "業務アプリが扱う接続文字列・APIキーなどの秘密情報。ログオン済みマシンではドライブ暗号化では守れない。"@ja ;
    skos:altLabel "接続文字列"@ja ;
    skos:altLabel "APIキー"@ja .

<https://comcomponent.com/knowledge/sqlite-type-mapping/> a skos:Concept ;
    skos:prefLabel "SQLiteの型マッピング(INTEGER/REAL/TEXT/BLOB)"@ja ;
    skos:definition "SQLiteが実際に保存できるINTEGER/REAL/TEXT/BLOBの4つの型に、.NETの型を割り当てるMicrosoft.Data.Sqliteの対応規則。"@ja .

<https://comcomponent.com/knowledge/decimal-text-sort-bug/> a skos:Concept ;
    skos:prefLabel "decimal列のTEXT保存による比較・集計の不整合"@ja ;
    skos:definition "decimalがTEXTとして保存されるため、SQLiteの型序列上TEXTが常に数値より大きく扱われ、WHERE比較やSUM等の集計が意図どおりに動かなくなる問題。"@ja ;
    skos:broader <https://comcomponent.com/knowledge/sqlite-type-mapping/> .

<https://comcomponent.com/knowledge/money-as-integer/> a skos:Concept ;
    skos:prefLabel "金額を最小通貨単位の整数で持つ設計"@ja ;
    skos:definition "金額をdecimalではなく、円などの最小通貨単位に換算したINTEGER(long)で保存する設計方針。"@ja ;
    ks:prevents <https://comcomponent.com/knowledge/decimal-text-sort-bug/> .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/microsoft-data-sqlite/> ;
    rdf:predicate ks:incompatibleWith ;
    rdf:object <https://comcomponent.com/knowledge/system-data-sqlite/> ;
    schema:description "接続文字列のキーワードも型の既定の扱い(例: Guidの保存形式)も異なる別物で、互換性がない。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/data/sqlite/connection-strings> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ef-core-sqlite-provider/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/microsoft-data-sqlite/> ;
    schema:description "EF CoreのSQLiteプロバイダーは、内部でMicrosoft.Data.Sqliteを使う。"@ja ;
    ks:evidence <https://learn.microsoft.com/ef/core/providers/sqlite/limitations> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/microsoft-data-sqlite/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/new-sqlite-development/> ;
    schema:description "新規開発で使うライブラリは、EF Coreチームがメンテナンスする軽量なMicrosoft.Data.Sqliteが基本とされる。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/data/sqlite/> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/system-data-sqlite/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/new-sqlite-development/> ;
    schema:description "既存アプリが安定稼働しているなら無理に移行する必要はないが、新規のコードはMicrosoft.Data.Sqliteに寄せるのが原則とされる。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/data/sqlite/connection-strings> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/wal-mode/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/sqlite-busy/> ;
    schema:description "WALモードでは読み取りと書き込みの並行性が上がり、database is lockedの大半が消える。ただし書き込み同士は依然として排他のため、SQLITE_BUSYが完全に無くなるわけではない。"@ja ;
    ks:evidence <https://www.sqlite.org/wal.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/microsoft-data-sqlite/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/sqlite-busy/> ;
    schema:description "Microsoft.Data.Sqliteはbusy/lockedエラーに対して、コマンドタイムアウト(既定30秒)まで自動でリトライする。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/data/sqlite/database-errors> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/sqlite-write-serialization/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/sqlite-busy/> ;
    schema:description "書き込み経路を1本のキューに寄せると、複数スレッドによる書き込みの衝突が構造的に起きなくなる。ただし他の接続が握る長いトランザクションや読み取りから書き込みへの昇格の衝突など、他の原因によるSQLITE_BUSYは残り得る。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/data/sqlite/database-errors> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/sqlite-transaction-batching/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/sqlite-commit-fsync-overhead/> ;
    schema:description "1,000件単位の明示的トランザクションにまとめるだけで、コミットごとのfsyncコストが減り毎秒数万〜数十万件のオーダーに届く。"@ja ;
    ks:evidence <https://www.sqlite.org/wal.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/sqlite-write-serialization/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/sqlite-transaction-batching/> ;
    schema:description "書き込みキューはチャネルに溜まった分を最大500件までまとめて1トランザクションで書くため、経路の一本化とバッチ化を同時に実現する。"@ja ;
    ks:evidence <https://www.sqlite.org/wal.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/wal-mode/> ;
    rdf:predicate ks:incompatibleWith ;
    rdf:object <https://comcomponent.com/knowledge/sqlite-file-copy-backup/> ;
    schema:description "WALモードでは変更が-walファイルに追記されるため、本体(.db)だけを単純コピーすると本体未反映の直近のコミットが抜け落ちる。"@ja ;
    ks:evidence <https://www.sqlite.org/wal.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/sqlcipher/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/dpapi/> ;
    schema:description "SQLCipher系バンドルでDB全体を暗号化する場合、その暗号化キー自体の保管には何らかの保護手段が必要になる。DPAPIはWindows環境で選ばれることが多い一例であり、鍵保護の唯一の手段ではない。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.security.cryptography.protecteddata> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/microsoft-data-sqlite/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/sqlite-connection-pooling/> ;
    schema:description "Pooling=Falseを指定しない既定構成では、Microsoft.Data.Sqliteはバージョン6.0から接続プーリングが既定で有効になっている。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/data/sqlite/connection-strings> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/sqlite-connection-pooling/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/sqlite-file-handle-retention/> ;
    schema:description "接続をClose/Disposeしてもネイティブの接続がプールに残り、DBファイルのハンドルを掴み続けることがある。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/data/sqlite/connection-strings> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/sqlite-clearpool/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/sqlite-file-handle-retention/> ;
    schema:description "ファイル操作の直前に対応する接続プールを空にすることで、DBファイルのハンドル保持を解消できる。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/data/sqlite/connection-strings> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/sqlite-file-copy-backup/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/sqlite-corruption/> ;
    schema:description "稼働中(トランザクション中)のDBファイルコピーは、SQLite公式が破損原因として明記している。"@ja ;
    ks:evidence <https://www.sqlite.org/howtocorrupt.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/vacuum-into/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/sqlite-backup-requirement/> ;
    schema:description "VACUUM INTOはSQL1文で、断片化を解消した一貫性のある最小サイズのコピーを稼働中でも作成できる。"@ja ;
    ks:evidence <https://www.sqlite.org/lang_vacuum.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/sqlite-backupdatabase/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/sqlite-backup-requirement/> ;
    schema:description "BackupDatabaseは接続オブジェクト間で稼働中でも一貫したスナップショットを作成できるが、完了まで他の接続の書き込みをブロックする点に注意が必要。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/data/sqlite/backup> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/sqlite-file-copy-backup/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/sqlite-backup-requirement/> ;
    schema:description "稼働中の単純ファイルコピーは、一貫したバックアップの手段としては禁止される。"@ja ;
    ks:evidence <https://www.sqlite.org/howtocorrupt.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/sqlite-backupdatabase/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/backupdatabase-write-blocking/> ;
    schema:description "現在の実装は可能な限り速くコピーする代わりに、完了まで他の接続からの書き込みをブロックする。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/data/sqlite/backup> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/sqlite-corruption/> ;
    rdf:predicate ks:verifiedBy ;
    rdf:object <https://comcomponent.com/knowledge/sqlite-quick-check/> ;
    schema:description "起動時にPRAGMA quick_checkを実行することで、SQLiteデータベースが破損していないかを確認できる。"@ja ;
    ks:evidence <https://www.sqlite.org/lang_vacuum.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/sqlcipher/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/sqlite-encryption-requirement/> ;
    schema:description "DB全体の暗号化が要件なら、SQLCipher系のネイティブライブラリへの差し替えが必要になる。"@ja ;
    ks:evidence <https://www.zetetic.net/sqlcipher/> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/microsoft-data-sqlite/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/sqlite-encryption-requirement/> ;
    schema:description "接続文字列のPasswordを指定しても、標準のネイティブライブラリは暗号化に対応していないため何も起きない。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/data/sqlite/connection-strings> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dpapi/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/app-secrets/> ;
    schema:description "少量の機密情報なら、DB全体の暗号化より先にWindowsのDPAPIによる保護を検討することが推奨される。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.security.cryptography.protecteddata> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/sqlite-type-mapping/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/decimal-text-sort-bug/> ;
    schema:description "decimalはREALでは精度が欠損するためTEXTとして保存され、TEXT列に対する比較・集計が文字列規則になり意図どおりに動かないことがある。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/data/sqlite/types> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/money-as-integer/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/decimal-text-sort-bug/> ;
    schema:description "金額を最小通貨単位の整数(INTEGER)で持てば、比較も集計も正確かつ高速になり型の罠が消える。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/data/sqlite/types> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ef-core-sqlite-provider/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/wal-mode/> ;
    schema:description "journal_modeを明示的に変更しない既定構成では、EF Coreが作成するSQLiteデータベースは最初からWALモードが既定で有効になっている。"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/data/sqlite/async> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ef-core-sqlite-provider/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/decimal-text-sort-bug/> ;
    schema:description "EF Coreを使っても型の事情は消えず、decimal等の等値以外の比較や並び替えはクライアント評価になる。"@ja ;
    ks:evidence <https://learn.microsoft.com/ef/core/providers/sqlite/limitations> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .
