N-Triplesとは:RDFを1行1トリプルで表す標準形式
N-Triplesは、RDFグラフを機械処理しやすいプレーンテキストへ変換するための標準形式です。接頭辞や省略構文を使わず、原則として1行に1つのトリプルを書くため、生成、差分確認、ストリーミング、テストに向きます。
| 項目 | 内容 |
|---|---|
| 名称 | N-Triples |
| 分類 | RDFグラフの行指向シリアライズ形式 |
| 標準 | W3C RDF 1.1 N-Triples Recommendation |
| 基本単位 | 1行に主語・述語・目的語と終端のピリオド |
| 文字コード | UTF-8 |
| 拡張子 | .nt |
| Media Type | application/n-triples |
| 主な用途 | RDFの機械生成、交換、行単位処理、テスト、検証 |
| 公式仕様 | RDF 1.1 N-Triples |
| 確認日 | 2026-07-14 |
N-Triplesは、RDFグラフをプレーンテキストで表現するための行指向シリアライズ形式です。
基本形は、主語、述語、目的語、終端のピリオドを1行に記述します。
<https://example.com/person/alice> <https://schema.org/name> "Alice" .N-Triplesは、RDFそのものではありません。
RDFは、主語・述語・目的語からなるトリプルの集合として情報を表すデータモデルです。N-Triplesは、そのRDFグラフをファイルや通信データとして書き出す方法の1つです。
同じRDFグラフは、次の形式でも表現できます。
- Turtle
- JSON-LD
- RDF/XML
- RDFa
- TriG
- N-Quads
N-Triplesの最大の特徴は、表現が単純で曖昧さが少ないことです。接頭辞、相対IRI、述語や主語の省略構文を使わず、原則として1行に1トリプルを書きます。
そのため、人が手書きするには冗長ですが、次の用途に適しています。
- RDFデータの機械生成
- ストリーミング処理
- 行単位の差分確認
- テスト用の期待値
- RDFグラフの交換
- 大量データの分割処理
- パーサーや変換処理の検証
結論:機械処理と検証にはN-Triples、人手編集にはTurtle、Web連携にはJSON-LD
Section titled “結論:機械処理と検証にはN-Triples、人手編集にはTurtle、Web連携にはJSON-LD”N-Triplesが向いているのは、RDFトリプルを単純な行形式で出力し、ツール間で安定して受け渡したい場合です。
特に、接頭辞展開や省略構文を避け、各トリプルを独立した形で扱いたい処理に向きます。
一方、N-Triplesは同じIRIを何度も完全な形で記述するため、ファイルが大きくなりやすく、人間には読みにくい形式です。
人が設計・レビューするRDFではTurtle、既存のJSON処理やWeb APIと統合する場合はJSON-LDの方が適することがあります。
N-Triplesが向く人
Section titled “N-Triplesが向く人”- RDFデータをプログラムから生成する開発者
- ナレッジグラフの入出力処理を作る人
- RDFパーサー、変換器、検証ツールを開発する人
- 大量のトリプルを行単位で処理する人
- TurtleやJSON-LDを正規化に近い単純な表現へ変換したい人
- RDFテストケースの期待結果を管理する人
N-Triplesを避ける条件
Section titled “N-Triplesを避ける条件”- 人が大量のデータを直接記述・編集する
- 接頭辞を使ってIRIを短く書きたい
- 1つの主語に対する複数の述語をまとめて読みたい
- Web APIで一般的なJSON構造として返したい
- 複数の名前付きグラフを1ファイルで表したい
- ファイルサイズと可読性を重視する
- RDFを理解せず、単なる4列CSVとして処理しようとしている
- N-TriplesはRDFグラフのシリアライズ形式
- RDFはデータモデル、N-Triplesはその記述形式
- 基本は1行1トリプル
- 1行は主語、述語、目的語、
.で構成される - 主語はIRIまたは空白ノード
- 述語はIRI
- 目的語はIRI、空白ノード、リテラル
- 接頭辞や相対IRIは使えない
- 文字列には言語タグまたはデータ型を付けられる
- Turtleは人が読み書きしやすい
- JSON-LDはJSONベースのWeb連携に向く
- N-Triplesは機械生成、変換、テスト、行単位処理に向く
- 構文検証とRDFデータ品質検証は別に行う
- 取り込んだIRIやリテラルを、そのままHTMLやコマンドへ埋め込まない
RDF、トリプル、N-Triplesの違い
Section titled “RDF、トリプル、N-Triplesの違い”| 用語 | 意味 |
|---|---|
| RDF | Resource Description Framework。グラフ型のデータモデル |
| RDF triple | 主語、述語、目的語の3要素で表す文 |
| RDF graph | RDFトリプルの集合 |
| N-Triples | RDFグラフを1行1トリプルで表すシリアライズ形式 |
| Turtle | 接頭辞や省略構文を使えるRDFシリアライズ形式 |
| JSON-LD | JSONを使ってLinked Dataを表現する形式 |
| IRI | リソースを識別する国際化識別子 |
| Literal | 文字列、数値、日付などの値 |
| Blank node | グローバルなIRIを持たないRDFノード |
| Vocabulary | RDFで利用するクラスやプロパティの定義群 |
| SPARQL | RDFグラフを問い合わせるクエリ言語 |
N-Triplesはデータベースでもクエリ言語でもありません。
N-TriplesファイルをRDFストアへ読み込み、SPARQLで問い合わせることはできますが、N-Triples自体には検索や更新の命令は含まれません。
N-Triplesの基本構造
Section titled “N-Triplesの基本構造”1つのRDF文を次の形で書きます。
subject predicate object .例:
<https://example.com/person/alice> <https://schema.org/name> "Alice" .各要素は空白で区切り、文末にピリオドを書きます。
主語に使えるのは、基本的に次の2つです。
- IRI
- 空白ノード
IRIの例:
<https://example.com/person/alice>空白ノードの例:
_:address1リテラルは主語にできません。
次は無効です。
"Alice" <https://schema.org/knows> <https://example.com/person/bob> .述語はIRIです。
<https://schema.org/name>空白ノードやリテラルは述語にできません。
目的語には次を使えます。
- IRI
- 空白ノード
- リテラル
IRI:
<https://example.com/person/bob>空白ノード:
_:address1リテラル:
"Alice"実行例1:人物データをN-Triplesで表す
Section titled “実行例1:人物データをN-Triplesで表す”次の情報を表します。
Aliceという人物がいる名前はAliceBobを知っているN-Triples:
<https://example.com/person/alice> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://schema.org/Person> .<https://example.com/person/alice> <https://schema.org/name> "Alice" .<https://example.com/person/alice> <https://schema.org/knows> <https://example.com/person/bob> .1行目は、Aliceがschema:Person型であることを表します。
2行目は名前、3行目はBobとの関係です。
N-TriplesにはTurtleのような接頭辞宣言がないため、IRIを完全な形で記述します。
実行例2:言語タグとデータ型を使う
Section titled “実行例2:言語タグとデータ型を使う”言語タグ付き文字列
Section titled “言語タグ付き文字列”<https://example.com/book/1> <https://schema.org/name> "セマンティックWeb入門"@ja .<https://example.com/book/1> <https://schema.org/name> "Introduction to the Semantic Web"@en .同じプロパティに、日本語と英語のラベルを付けています。
言語タグ付きリテラルは、自然言語テキストの言語を表します。
データ型付きリテラル
Section titled “データ型付きリテラル”<https://example.com/product/1> <https://schema.org/price> "1980"^^<http://www.w3.org/2001/XMLSchema#integer> .<https://example.com/product/1> <https://schema.org/releaseDate> "2026-07-10"^^<http://www.w3.org/2001/XMLSchema#date> .<https://example.com/product/1> <https://schema.org/inStock> "true"^^<http://www.w3.org/2001/XMLSchema#boolean> .N-Triplesでは、数値や真偽値も字句表現を引用符で囲み、必要に応じてデータ型IRIを付けます。
Turtleでは数値や真偽値を短縮構文で書けますが、N-Triplesでは完全なリテラル表現を使います。
実行例3:空白ノードで住所を表す
Section titled “実行例3:空白ノードで住所を表す”住所に公開IRIを付けず、人物に結び付いた構造として表します。
<https://example.com/person/alice> <https://schema.org/address> _:address1 ._:address1 <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://schema.org/PostalAddress> ._:address1 <https://schema.org/addressCountry> "JP" ._:address1 <https://schema.org/addressLocality> "Tokyo" ._:address1は空白ノード識別子です。
空白ノードの注意
Section titled “空白ノードの注意”空白ノード識別子は、対象RDF文書やデータセット内でノードを区別するためのラベルです。
別ファイルに同じ_:address1が書かれていても、通常は同一の実世界リソースを意味するとは限りません。
ファイルを結合する処理では、空白ノード識別子の衝突やスコープを、利用ライブラリがどのように扱うか確認します。
長期的に外部参照する対象には、安定したIRIを付ける方が適する場合があります。
1行1トリプルの意味
Section titled “1行1トリプルの意味”N-Triplesでは、各トリプルが独立した行として記述されます。
<https://example.com/person/alice> <https://schema.org/name> "Alice" .<https://example.com/person/alice> <https://schema.org/email> "alice@example.com" .この単純さには利点があります。
- 行単位で生成できる
- 一部を順次読み込める
- Unix系ツールで行数を確認しやすい
- Git diffで追加・削除を確認しやすい
- 並列分割しやすい
- 壊れた行の位置を特定しやすい
一方、同じ主語と述語IRIを繰り返すため、Turtleより冗長です。
コメントと空行
Section titled “コメントと空行”コメントは#から行末までです。
## Aliceの基本情報<https://example.com/person/alice> <https://schema.org/name> "Alice" .空行も利用できます。
ただし、文字列リテラル内の#はコメント開始ではありません。
<https://example.com/document/1> <https://schema.org/text> "Section #1" .IRIの書き方
Section titled “IRIの書き方”IRIは山括弧で囲みます。
<https://example.com/resource/1>N-Triplesでは、Turtleの接頭辞付き名前を使えません。
無効:
ex:alice schema:name "Alice" .有効:
<https://example.com/alice> <https://schema.org/name> "Alice" .相対IRIも使わず、絶対IRIを記述します。
IRI内のエスケープ
Section titled “IRI内のエスケープ”IRIには、構文上そのまま書けない文字があります。
Unicodeエスケープを使う場合があります。
<https://example.com/resource/\u00E9>\uは4桁、\Uは8桁の16進数でUnicodeコードポイントを表します。
ただし、IRI正規化、percent encoding、Unicodeエスケープは同じ処理ではありません。
生成ライブラリに任せ、文字列置換だけでIRIを組み立てない方が安全です。
文字列リテラルとエスケープ
Section titled “文字列リテラルとエスケープ”文字列は二重引用符で囲みます。
"Alice"引用符やバックスラッシュを含める場合はエスケープします。
<https://example.com/message/1> <https://schema.org/text> "She said \"Hello\"." .<https://example.com/path/1> <https://schema.org/text> "C:\\data\\file.txt" .代表的なエスケープ:
| 表記 | 意味 |
|---|---|
\t | タブ |
\b | バックスペース |
\n | 改行 |
\r | キャリッジリターン |
\f | フォームフィード |
\" | 二重引用符 |
\' | 一重引用符 |
\\ | バックスラッシュ |
\uXXXX | 4桁Unicodeエスケープ |
\UXXXXXXXX | 8桁Unicodeエスケープ |
N-Triplesの文字列リテラルは1行で記述します。
Turtleの長い文字列リテラルのような三重引用符は使いません。
改行を含む文字列
Section titled “改行を含む文字列”実際の改行をリテラル内へ直接入れず、\nとして表します。
<https://example.com/message/1> <https://schema.org/text> "line 1\nline 2" .N-TriplesとTurtleの違い
Section titled “N-TriplesとTurtleの違い”同じRDFグラフを比較します。
N-Triples
Section titled “N-Triples”<https://example.com/person/alice> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://schema.org/Person> .<https://example.com/person/alice> <https://schema.org/name> "Alice" .<https://example.com/person/alice> <https://schema.org/knows> <https://example.com/person/bob> .Turtle
Section titled “Turtle”@prefix schema: <https://schema.org/> .@prefix ex: <https://example.com/person/> .
ex:alice a schema:Person ; schema:name "Alice" ; schema:knows ex:bob .| 観点 | N-Triples | Turtle |
|---|---|---|
| 基本単位 | 1行1トリプル | 複数トリプルをまとめられる |
| 接頭辞 | 使えない | 使える |
| 相対IRI | 使えない | Base IRIと組み合わせて利用可能 |
| 省略構文 | ほぼない | ;、,、aなどがある |
| 空白ノード構文 | 識別子形式 | []や入れ子表現がある |
| コレクション | 明示トリプル | ()による短縮構文 |
| 人間の可読性 | 低い | 高い |
| 機械生成 | 単純 | 比較的複雑 |
| 行単位処理 | しやすい | 文が複数行にまたがる場合がある |
| ファイル拡張子 | .nt | .ttl |
| Media Type | application/n-triples | text/turtle |
Turtleが向く場面
Section titled “Turtleが向く場面”- オントロジーや語彙を人が編集する
- GitHubでRDFをレビューする
- 接頭辞でIRIを短くしたい
- 同一主語の情報をまとめて読みたい
- SPARQLに近い構文へ慣れたい
N-Triplesが向く場面
Section titled “N-Triplesが向く場面”- 自動生成
- テストデータ
- 行ストリーム処理
- 単純な交換形式
- Turtleの省略構文を展開した形で確認する
- グラフ差分処理の前段
N-TriplesとJSON-LDの違い
Section titled “N-TriplesとJSON-LDの違い”同じ情報を表します。
N-Triples
Section titled “N-Triples”<https://example.com/person/alice> <http://www.w3.org/1999/02/22-rdf-syntax-ns#type> <https://schema.org/Person> .<https://example.com/person/alice> <https://schema.org/name> "Alice" .JSON-LD
Section titled “JSON-LD”{ "@context": { "schema": "https://schema.org/" }, "@id": "https://example.com/person/alice", "@type": "schema:Person", "schema:name": "Alice"}| 観点 | N-Triples | JSON-LD |
|---|---|---|
| 基盤 | 行指向テキスト | JSON |
| RDFとの対応 | トリプルを直接記述 | Contextを使いJSONをRDFへ対応付ける |
| 人間の可読性 | 冗長 | JSON利用者には読みやすい |
| Web API | そのままでは一般的でない | 既存JSON基盤と統合しやすい |
| 接頭辞・用語短縮 | ない | @contextで定義 |
| ストリーム処理 | 行単位で扱いやすい | JSON文書全体の構造に依存 |
| 変換処理 | 単純 | expansion、compaction、flatteningなどがある |
| 外部参照 | 基本的にない | Remote Contextを参照できる |
| セキュリティ注意 | IRI・リテラル処理 | Remote Context取得、JSON処理も注意 |
| 拡張子 | .nt | .jsonld |
| Media Type | application/n-triples | application/ld+json |
JSON-LDが向く場面
Section titled “JSON-LDが向く場面”- Web APIのレスポンス
- JavaScriptやJSONツールとの統合
- Schema.orgなどの構造化データ
- 既存JSONをLinked Dataへ対応させる
- Contextを使って用語を管理する
N-Triplesが向く場面
Section titled “N-Triplesが向く場面”- JSON構造に依存しない単純なトリプル列
- 大量データのエクスポート
- RDF変換結果の検証
- 行単位での分割・結合
- Context解決を避けたい処理
N-Triples、N-Quads、TriGの違い
Section titled “N-Triples、N-Quads、TriGの違い”N-Triplesは1つのRDFグラフを表します。
名前付きグラフを含むRDF Datasetを表したい場合は、N-QuadsやTriGを使います。
N-Triples
Section titled “N-Triples”<https://example.com/alice> <https://schema.org/name> "Alice" .N-Quads
Section titled “N-Quads”<https://example.com/alice> <https://schema.org/name> "Alice" <https://example.com/graph/users> .N-Quadsでは、主語、述語、目的語の後ろにグラフ名を追加できます。
| 形式 | 対象 | 特徴 |
|---|---|---|
| N-Triples | RDF Graph | 1行1トリプル |
| Turtle | RDF Graph | 人が読みやすい省略構文 |
| N-Quads | RDF Dataset | 1行にグラフ名を追加可能 |
| TriG | RDF Dataset | Turtle風の名前付きグラフ構文 |
| JSON-LD | RDF Graph / Dataset | JSONベース |
複数の出典、テナント、バージョン、グラフを区別したい場合は、N-TriplesだけでなくRDF Dataset形式を検討します。
用途別の選定表
Section titled “用途別の選定表”| 用途 | 第一候補 | 理由 |
|---|---|---|
| 人がRDFを編集する | Turtle | 接頭辞と省略構文で読みやすい |
| Web APIで返す | JSON-LD | JSONツールと統合しやすい |
| 大量トリプルを行処理する | N-Triples | 1行1トリプル |
| RDFテストの期待値 | N-Triples | 表現の揺れが少ない |
| 名前付きグラフを行処理する | N-Quads | グラフ名を含められる |
| 名前付きグラフを人が編集する | TriG | Turtleに近い |
| HTMLへ埋め込む構造化データ | JSON-LD | <script type="application/ld+json">で利用 |
| RDFストア間の交換 | N-Triples / N-Quads | 実装対応とDataset要否で選ぶ |
| オントロジー定義 | Turtle | 可読性と接頭辞利用 |
| Git diff中心のデータ管理 | N-Triplesまたは正規化済み形式 | 行単位差分を取りやすい |
1. 表現するのはRDF GraphかRDF Datasetか
Section titled “1. 表現するのはRDF GraphかRDF Datasetか”RDF Graph: N-Triples、Turtle、JSON-LDなどを比較します。
RDF Dataset: N-Quads、TriG、JSON-LDを比較します。
2. 人が直接編集するか
Section titled “2. 人が直接編集するか”はい: Turtleを第一候補にします。
いいえ: 次へ進みます。
3. JSONベースのAPIやフロントエンドと統合するか
Section titled “3. JSONベースのAPIやフロントエンドと統合するか”はい: JSON-LDを検討します。
いいえ: 次へ進みます。
4. 行単位で分割・並列処理したいか
Section titled “4. 行単位で分割・並列処理したいか”はい: N-Triplesを検討します。
名前付きグラフが必要ならN-Quadsです。
5. 同一グラフのシリアライズ差を比較したいか
Section titled “5. 同一グラフのシリアライズ差を比較したいか”N-Triplesへ変換すると、Turtleの接頭辞・省略構文を展開した状態を確認できます。
ただし、空白ノード識別子やトリプル順序は同一グラフでも異なり得るため、単純なテキスト比較だけでは不十分です。
N-Triplesを検証する
Section titled “N-Triplesを検証する”検証には複数の段階があります。
1. 構文検証
Section titled “1. 構文検証”ファイルがN-Triples文法として正しいか確認します。
確認項目:
- 各文末に
.がある - 主語がIRIまたは空白ノード
- 述語がIRI
- 目的語が正しい形式
- 文字列の引用符が閉じている
- バックスラッシュが正しくエスケープされている
- 言語タグとデータ型の組み合わせが正しい
- IRIに禁止文字が直接入っていない
- UTF-8として扱える
2. RDFデータモデルとしての確認
Section titled “2. RDFデータモデルとしての確認”構文が正しくても、データとして正しいとは限りません。
例:
<https://example.com/product/1> <https://schema.org/price> "free"^^<http://www.w3.org/2001/XMLSchema#integer> .N-Triples構文として読み込めても、freeはxsd:integerの字句空間に合いません。
利用ライブラリや検証方式が、この不整合をどこまで検出するか確認します。
3. 語彙・形状検証
Section titled “3. 語彙・形状検証”次のような要件は、N-Triples構文だけでは確認できません。
Productにはnameが必須priceは0以上emailは1件までPersonのbirthDateは日付SHACLなどのRDF検証言語を使います。
4. アプリケーション要件の確認
Section titled “4. アプリケーション要件の確認”- IRIが実際の命名規則に従っているか
- 重複リソースがないか
- 個人情報を公開していないか
- 必須の出典やライセンスがあるか
- 語彙バージョンが正しいか
- 空白ノードをIRIにすべき対象ではないか
実行例4:Python RDFLibで読み込んで変換する
Section titled “実行例4:Python RDFLibで読み込んで変換する”PythonのRDFLibを使う例です。
from pathlib import Path
from rdflib import Graph
source_path = Path("people.nt")output_path = Path("people.ttl")
graph = Graph()
try: graph.parse(source_path, format="nt")except Exception as exc: raise SystemExit(f"N-Triplesの解析に失敗しました: {exc}") from exc
print(f"triples: {len(graph)}")
turtle = graph.serialize(format="turtle")output_path.write_text(turtle, encoding="utf-8")実行前にRDFLibをインストールします。
python -m pip install rdflibこの例では、N-Triplesを読み込み、Turtleへ変換します。
- ライブラリのバージョンを固定する
- 信頼できない巨大ファイルへメモリ一括読み込みを使わない
- エラー行をログへ出す際に機密情報を漏らさない
- 出力時の空白ノード識別子やトリプル順序が入力と同じとは限らない
- 同一RDFグラフでもテキストが一致するとは限らない
実行例5:Apache Jena RIOTで検証・変換する
Section titled “実行例5:Apache Jena RIOTで検証・変換する”Apache JenaのRIOTツールを使う例です。
構文を確認しながらTurtleへ変換します。
riot --syntax=NTRIPLES --output=TURTLE people.ntN-Triplesとして読み込み、N-Triplesへ再出力します。
riot --syntax=NTRIPLES --output=NTRIPLES people.ntファイルへ保存します。
riot --syntax=NTRIPLES --output=TURTLE people.nt > people.ttlコマンドライン引数や対応形式名は、使用するApache Jenaバージョンの公式ドキュメントで確認してください。
RDFグラフの比較で注意すること
Section titled “RDFグラフの比較で注意すること”次の2つは、同じ内容を表す可能性があります。
ファイルA:
<https://example.com/alice> <https://schema.org/name> "Alice" .<https://example.com/alice> <https://schema.org/knows> _:b1 ._:b1 <https://schema.org/name> "Bob" .ファイルB:
_:person2 <https://schema.org/name> "Bob" .<https://example.com/alice> <https://schema.org/knows> _:person2 .<https://example.com/alice> <https://schema.org/name> "Alice" .違い:
- トリプルの順番
- 空白ノード識別子
RDFグラフでは、トリプル順序に意味はありません。
空白ノードのローカルな識別子名も、通常はグラフの意味そのものではありません。
そのため、次の比較は信頼できません。
diff file-a.nt file-b.nt単純diffは変更の確認には便利ですが、RDFグラフの同値性を完全には判定できません。
RDF Dataset Canonicalizationやグラフ同型性を扱えるツールを検討します。
正規化とcanonicalization
Section titled “正規化とcanonicalization”N-Triplesは単純な形式ですが、同じRDFグラフに対して常に同じバイト列になるわけではありません。
違いが生じる要因:
- トリプル順序
- 空白ノード識別子
- Unicode表現
- リテラルの字句表現
- 実装ごとの出力順序
デジタル署名、ハッシュ、厳密な差分、重複排除に使う場合は、単にN-Triplesへ変換するだけでは足りません。
W3CのRDF Dataset Canonicalization仕様や、利用ライブラリのcanonicalization実装を確認します。
RDF GraphとRDF Datasetでは対象範囲が異なる点にも注意します。
失敗しやすい点
Section titled “失敗しやすい点”N-TriplesをRDFそのものだと思う
Section titled “N-TriplesをRDFそのものだと思う”RDFはデータモデルです。
N-Triplesは、そのRDFグラフを記述する形式の1つです。
4列のテキストとしてsplitする
Section titled “4列のテキストとしてsplitする”次のような単純処理は危険です。
parts = line.split(" ")文字列リテラルには空白を含められます。
<https://example.com/alice> <https://schema.org/name> "Alice Smith" .IRI、リテラル、エスケープ、コメントを正しく扱うRDFパーサーを使います。
ピリオドを付け忘れる
Section titled “ピリオドを付け忘れる”無効:
<https://example.com/alice> <https://schema.org/name> "Alice"有効:
<https://example.com/alice> <https://schema.org/name> "Alice" .Turtle構文を混ぜる
Section titled “Turtle構文を混ぜる”無効なN-Triples:
@prefix schema: <https://schema.org/> .
<https://example.com/alice> schema:name "Alice" .接頭辞宣言やprefixed nameはTurtleの機能です。
文字列の引用符をエスケープしない
Section titled “文字列の引用符をエスケープしない”無効:
<https://example.com/message/1> <https://schema.org/text> "She said "Hello"." .有効:
<https://example.com/message/1> <https://schema.org/text> "She said \"Hello\"." .ファイル順序に意味があると思う
Section titled “ファイル順序に意味があると思う”RDFグラフではトリプルの順番に意味はありません。
処理順序が必要なら、rdf:List、順序値、時刻、インデックスなどをデータとして表現します。
空白ノードIDを永続IDとして使う
Section titled “空白ノードIDを永続IDとして使う”_:b1は外部から安定して参照するためのグローバルIRIではありません。
API、別ファイル、将来バージョンから参照する対象にはIRIを検討します。
言語タグとデータ型を同時に付ける
Section titled “言語タグとデータ型を同時に付ける”次のような表現は使いません。
"Hello"@en^^<http://www.w3.org/2001/XMLSchema#string>言語タグ付き文字列とデータ型付きリテラルの関係は、対象RDF仕様で確認します。
テキストdiffだけでグラフ同値性を判定する
Section titled “テキストdiffだけでグラフ同値性を判定する”トリプル順序と空白ノード名が異なるだけでdiffが発生します。
RDFグラフ比較ツールを使います。
拡張子だけで形式を判定する
Section titled “拡張子だけで形式を判定する”.ntでも内容がTurtleや不正なテキストになっている可能性があります。
Media Type、明示された形式、実際の構文を確認します。
セキュリティと保守上の注意
Section titled “セキュリティと保守上の注意”N-Triplesはデータ形式ですが、読み込んだデータを利用する処理にはセキュリティ上の注意が必要です。
IRIを安全なURLとみなさない
Section titled “IRIを安全なURLとみなさない”RDF内のIRIは識別子です。
そのIRIを自動的にHTTP取得する、ブラウザへリンクとして出す、リダイレクト先に使う場合は検証が必要です。
確認項目:
- 許可するscheme
- 内部ネットワーク宛てのURL
- localhost
- link-local address
- file URI
- 資格情報付きURL
- 長すぎるIRI
- Unicodeの見た目が似た文字
- リダイレクト
- DNS rebinding
外部IRIを自動取得する実装ではSSRFの危険があります。
リテラルをHTMLへ直接出力しない
Section titled “リテラルをHTMLへ直接出力しない”<https://example.com/item/1> <https://schema.org/name> "<script>alert(1)</script>" .N-Triplesとしては文字列データです。
Web画面へ表示する際は、出力先に応じてHTMLエスケープします。
コマンドへ埋め込まない
Section titled “コマンドへ埋め込まない”IRIやリテラルをシェルコマンドの文字列へ直接連結しません。
RDF変換ツールを呼ぶ場合も、引数配列、安全な一時ファイル、入力サイズ制限を使います。
大容量・悪意ある入力に備える
Section titled “大容量・悪意ある入力に備える”- ファイルサイズ上限
- 1行の最大長
- トリプル数上限
- リテラル長上限
- タイムアウト
- メモリ上限
- ストリーミングパーサー
- 圧縮爆弾
- 不正UTF-8
- 大量の空白ノード
- 大量の重複トリプル
を考慮します。
個人情報と公開範囲
Section titled “個人情報と公開範囲”RDFはデータを連結しやすい形式です。
単独では匿名に見える識別子も、他データセットとのリンクによって個人を特定できる場合があります。
- 氏名
- メールアドレス
- 住所
- 位置情報
- 医療情報
- 行動履歴
- 永続的な個人識別IRI
を公開する前に、利用目的、法令、同意、保持期間、削除方法を確認します。
Remote Contextとの違い
Section titled “Remote Contextとの違い”N-Triples自体には、JSON-LDのRemote Contextのような外部Context取得機能はありません。
ただし、N-Triples内のIRIをアプリケーションが自動取得する設計なら、同様に外部通信の管理が必要です。
更新状況の確認方法
Section titled “更新状況の確認方法”安定した基準として、W3CのRDF 1.1 N-Triplesは2014年2月25日のW3C Recommendationです。
一方、W3CではRDF 1.2関連仕様の策定も進められています。
公開時には、次を分けて確認します。
| 文書種別 | 扱い |
|---|---|
| W3C Recommendation | 安定した標準として参照 |
| Candidate Recommendation | 実装経験を集める段階 |
| Working Draft | 変更される可能性がある |
| Editor’s Draft | 最新作業版だが標準確定版ではない |
| Group Note | 仕様以外のガイダンス等 |
記事本文の構文説明は、採用する仕様バージョンを明記します。
実際に使うRDFライブラリやトリプルストアが、RDF 1.1、RDF 1.2、RDF-star関連構文のどこまで対応しているかも確認します。
保守チェックリスト
Section titled “保守チェックリスト”[ ] RDFグラフとN-Triples形式を区別している[ ] ファイルのMedia Typeを確認した[ ] UTF-8として処理している[ ] 各トリプルの末尾にピリオドがある[ ] 主語・述語・目的語の型を確認した[ ] Turtleの接頭辞構文を混ぜていない[ ] 相対IRIを使っていない[ ] 文字列の引用符とバックスラッシュをエスケープした[ ] 改行を文字列内へ直接入れていない[ ] 言語タグを検証した[ ] データ型IRIと字句表現を検証した[ ] 空白ノードIDを外部永続IDにしていない[ ] テキストdiffだけで同値判定していない[ ] RDFパーサーを使っている[ ] SHACLなどによるデータ形状検証を検討した[ ] 入力ファイルサイズと1行長を制限した[ ] IRIを自動取得する場合にSSRF対策をした[ ] リテラルをHTMLへ出す際にエスケープした[ ] 個人情報とリンク可能性を確認した[ ] 対象仕様とライブラリのバージョンを記録したよくある質問
Section titled “よくある質問”N-Triplesはプログラミング言語ですか
Section titled “N-Triplesはプログラミング言語ですか”いいえ。
RDFグラフをテキストとして表現するシリアライズ形式です。条件分岐、関数、変数などを持つ汎用プログラミング言語ではありません。
N-TriplesとRDFは同じですか
Section titled “N-TriplesとRDFは同じですか”同じではありません。
RDFはデータモデル、N-TriplesはRDFグラフのシリアライズ形式です。
N-TriplesはTurtleの一部ですか
Section titled “N-TriplesはTurtleの一部ですか”RDF 1.1仕様では、N-TriplesはTurtleと密接な関係を持つ単純な形式です。
多くのN-Triples文はTurtleとしても読み込めますが、実際の入力形式はMedia Typeや明示設定で区別します。
N-Triplesで接頭辞を使えますか
Section titled “N-Triplesで接頭辞を使えますか”使えません。
完全なIRIを山括弧で囲んで記述します。
<https://schema.org/name>接頭辞を使いたい場合はTurtleを検討します。
N-TriplesにJSONを埋め込めますか
Section titled “N-TriplesにJSONを埋め込めますか”JSON文字列をリテラルとして格納することはできます。
<https://example.com/item/1> <https://example.com/rawJson> "{\"enabled\":true}" .ただし、RDFとしてJSON内部の項目を問い合わせたいなら、各項目をRDFトリプルとしてモデル化する、または適切なRDFデータ型・JSON-LDを検討します。
N-Triplesで名前付きグラフを表せますか
Section titled “N-Triplesで名前付きグラフを表せますか”N-Triplesは単一のRDFグラフを表す形式です。
名前付きグラフを含むRDF DatasetにはN-QuadsやTriGを使います。
行を並べ替えても同じデータですか
Section titled “行を並べ替えても同じデータですか”トリプルの集合が同じであれば、行順に意味はありません。
ただし、空白ノードを含むグラフの比較では、識別子名だけを見ずグラフ同型性を確認します。
ファイルをsortすれば正規化できますか
Section titled “ファイルをsortすれば正規化できますか”単純な行ソートは差分を安定させる助けになりますが、空白ノード識別子の違いは解決できません。
署名や厳密なハッシュにはRDF Dataset Canonicalizationを検討します。
N-Triplesの拡張子とMedia Typeは何ですか
Section titled “N-Triplesの拡張子とMedia Typeは何ですか”一般的な拡張子は.nt、W3C仕様で登録されたMedia Typeはapplication/n-triplesです。
N-Triplesは、RDFグラフを1行1トリプルで表現するシンプルなシリアライズ形式です。
基本構造は次のとおりです。
<subject-iri> <predicate-iri> "object literal" .RDFとN-Triplesは役割が異なります。
- RDF: グラフ型データモデル
- N-Triples: RDFグラフの記述形式
- Turtle: 人が読み書きしやすいRDF形式
- JSON-LD: JSONベースでWeb連携しやすいRDF形式
- N-Quads: 名前付きグラフを行形式で表す形式
用途別の基本判断は次のとおりです。
- 機械生成、行処理、テスト: N-Triples
- 人手編集、語彙設計: Turtle
- Web API、構造化データ: JSON-LD
- 名前付きグラフの大量処理: N-Quads
- 名前付きグラフの人手編集: TriG
N-Triplesは単純ですが、文字列のsplitだけで安全に解析できる形式ではありません。
IRI、空白ノード、言語タグ、データ型、Unicodeエスケープを正しく扱うRDFライブラリを利用します。
また、構文が正しいことと、データの意味・品質が正しいことは別です。
- 構文検証
- データ型の確認
- SHACLによる形状検証
- IRI命名規則
- 個人情報
- 外部IRI取得時のSSRF
- グラフ同値性
まで含めて運用する必要があります。
- https://www.w3.org/TR/n-triples/
- https://www.w3.org/TR/rdf11-concepts/
- https://www.w3.org/TR/turtle/
- https://www.w3.org/TR/n-quads/
- https://www.w3.org/TR/trig/
- https://www.w3.org/TR/json-ld11/
- https://www.w3.org/TR/json-ld11-api/
- https://www.w3.org/TR/sparql11-query/
- https://www.w3.org/TR/shacl/
- https://www.w3.org/TR/rdf12-n-triples/
- https://www.w3.org/TR/rdf12-concepts/
- https://www.w3.org/TR/rdf12-turtle/
- https://www.w3.org/TR/rdf-canon/
- https://www.w3.org/groups/wg/rdf-star/
- https://jena.apache.org/documentation/
- https://jena.apache.org/documentation/io/
- https://rdflib.readthedocs.io/
- https://rdf4j.org/documentation/