NDC-LD


[NDC-LD中間報告版](http://www.kanzaki.com/works/2015/ndc-ld/)について，RDFの記述とNDC第9版本表の細目表の凡例（p21からp25まで）とを関連付けて説明してみる．また，分類項目の種類とそれぞれに対応するクラス，記述項目を列挙する他，階層関係の記述方法についてもまとめてみる．なお， **本稿は公開されたデータから第三者が推測した内容であり，公式見解ではない**．

## 細目表の凡例

### 分類記号
* 分類記号はskos:notationで記述する．
	
	```
	ndc9:007.1 skos:notation "007.1" .
	```

* 新設項目のフラグ（プラス印）は表現されない．
	
### 分類項目名
* 分類項目名は，skos:prefLabelに言語タグ（@ja）付きで記述する．

	```
	ndc9:007.1 skos:prefLabel "情報理論"@ja .
	```
	
* 複数の名辞がピリオドで区切られている場合でも，ひとつの文字列として記述する．

	```
	ndc9:007.13 skos:prefLabel "人工知能．パターン認識"@ja .
	```
	
	* 以下のように，名辞を分割して記述することは無い．
	
		```
		# 間違った例
		ndc9:007.13 skos:prefLabel "人工知能"@ja .
		ndc9:007.13 skos:prefLabel "パターン認識"@ja .
		```

### 分類小項目名・関連分類項目名

#### 分類小項目名

* 分類小項目名は，分類項目名に後置しskos:prefLabelに記述する

	```
	ndc9:012.1 skos:prefLabel "建築計画：基礎調査，位置，敷地"@ja .
	```

	* 分類小項目名を持つ分類項目に対して，以下のように小項目無しの分類項目名だけを記述することは無い
	
		```
		# 間違った例
		ndc9:012.1 skos:prefLabel "建築計画"@ja .
		```

#### 関連分類項目名

* 関連分類項目名はskos:noteに記述する

	```
	ndc9:007.64 skos:note "アルゴリズム，プログラミング言語" .
	```

### 英文項目名等

* 英文項目名等は，skos:prefLabelに言語タグ（@en）付きで記述する

	```
	ndc9:007 skos:prefLabel "Information science"@en .
	```

### 注記

* 注記はskos:noteに記述する
* **細分注記，限定注記，排除注記，別法注記などで記述方法が同じか否かは未調査**

### 参照

#### をも見よ参照

* 「をも見よ参照」はskos:relatedで記述する

	```
	ndc9:007.1 skos:related ndc9:361.45 .
	ndc9:007.1 skos:related ndc9:801.2 .
	```

#### を見よ参照

* 「を見よ参照」はskos:variantOfで記述する．このとき，参照元はndcv:Variantクラスのインスタンスで，参照先はskos:Conceptクラスのインスタンスである

	```
	ndc9:007.68 ndcv:variantOf ndc9:007.58 .
	```

### 注参照

* 注参照は2通りの記述方法がある
	* ひとつは，skos:noteにリテラルで記述する方法
	
		```
		ndc9:234.7 skos:note "＠オーストリア・ハンガリー帝国→234.6" .
		```
		
	* もうひとつは，rdfs:seeAlsoに参照先URIを記述する方法

		```
		ndc9:234.7 rdfs:seeAlso ndc9:234.6 .
		```
		
* 注参照は始めにskos:noteとして記述され，参照先URIを機械的に取得できた場合はskos:noteだけでなくrdfs:seeAlsoにも記述する



## 分類項目の種類


### 第1次区分の分類項目（類目）

* 1桁の分類記号を持つ項目である
* ndcv:MainClassクラスのインスタンスとして記述する

	```
	ndc9:0 rdf:type ndcv:MainClass .
	```

### 第2次区分の分類項目（綱目）

* 2桁の分類記号を持つ項目である
* ndcv:Divisionクラスのインスタンスとして記述する

	```
	ndc9:01 rdf:type ndcv:Division .
	```

### 第3次区分の通常項目，縮約項目，不均衡項目（要目）

* 3桁の分類記号を持つ項目である
* ndcv:Sectionかつskos:Conceptクラスのインスタンスとして記述する

	```
	ndc9:010 rdf:type ndcv:Section .
	ndc9:010 rdf:type skos:Concept .
	```

### 第4次区分以下の通常項目，縮約項目，不均衡項目（細目）

* 4桁以上の分類記号を持つ項目である
* skos:Conceptクラスのインスタンスとして表現する

	```
	ndc9:010.1 rdf:type skos:Concept .
	```

### 二者択一項目

* ndcv:Variantクラスのインスタンスとして表現する

	```
	ndc9:007.15 rdf:type ndcv:Variant .
	```

### 不使用項目

* 記述しない
	* 不使用項目からの「を見よ参照」も記述しない

### 削除項目

* 記述しない（例：014.69）
	* 削除項目からの「を見よ参照」も記述しない

### 範囲項目，中間見出し

* skos:Collectionクラスのインスタンスとして記述する

	```
	ndc9:016_018 rdf:type skos:Collection .
	```

## 各分類項目の記述内容

分類項目に対して記述するメタデータを，記述対象のクラス別にまとめる．前述の凡例には含まれない記述項目もある．
ndcv:sourceという記述項目を持つ分類項目もあるが，そのあたりは未調査．

### 第1次区分（類目）

* クラスはndcv:MainClassである
* 類名をskos:prefLabelに言語タグ（@ja）付きで記述する
	* 後述する名辞の規則にも従う
* 類名をrdfs:labelに言語タグ無しで記述する
* 類の分類記号をskos:notationで記述する
* 当該版のNDC全体を表すURIをskos:topConceptOfに記述する
	* NDC9の暫定URIはhttp://id.ndl.go.jp/class/ndc9/

	```
	# 類「0」の記述例
	ndc9:0 rdf:type ndcv:MainClass .
	ndc9:0 skos:prefLabel "総記（類目）"@ja .
	ndc9:0 rdfs:label "総記（類目）" .
	ndc9:0 skos:notation "0" .
	ndc9:0 skos:topConceptOf <http://id.ndl.go.jp/class/ndc9/> .
	```

### 第2次区分（綱目）

* クラスはndcv:Divisionである
* 綱名をskos:prefLabelに言語タグ（@ja）付きで記述する
	* 後述する名辞の規則に従う
* 綱名をrdfs:labelに言語タグ無しで記述する
	* 上位項目名の前置はしない
* 綱の分類記号をskos:notationで記述する
* 階層関係はskos:broaderまたはskos:topConceptOfで記述する
	* 後述する階層関係の規則に従う

	```
	ndc9:01 rdf:type ndcv:Division .
	ndc9:01 skos:prefLabel "図書館．図書館学（綱目）"@ja .
	ndc9:01 rdfs:label "図書館．図書館学（綱目）" .
	ndc9:01 skos:notation "01" .
	ndc9:01 skos:broader ndc9:0 .
	```

### 第3次区分（要目）の通常項目，縮約項目，不均衡項目

* クラスはndcv:Sectionかつskos:Conceptである
* 分類項目名をskos:prefLabelに言語タグ（@ja）付きで記述する
	* 後述する名辞の規則に従う
* 分類項目名をrdfs:labelに言語タグ無しで記述する
* 分類記号をskos:notationで記述する
* 階層関係をskos:broaderで記述する
	* 後述する階層関係の規則に従う
* 注記をskos:noteで記述する
* 「を見よ参照」をskos:relatedに記述する
* 当該分類項目を代表分類として持つNDLSHの件名のURIをskos:relatedMatchに記述する


### 第4次区分（細目）以下の通常項目，縮約項目，不均衡項目

* クラスはskos:Conceptである
	* 第3次区分の項目と異なり，ndcv:Sectionを含まない
* それ以外は第3次区分の項目と同じ属性を記述する



### 二者択一項目

* クラスはndcv:Variantである
* 上位項目のURIをskos:broaderで記述する
* 「を見よ参照」の参照先URIをndcv:variantOfで記述する

	```
	ndc9:007.15 rdf:type ndcv:Variant .
	ndc9:007.15 skos:broader ndc9:007.1 .
	ndc9:007.15 ndcv:variantOf ndc9:007.632 .
	```

### 範囲項目，中間見出し

* クラスはskos:Collectionである
* 上位項目のURIをdct:isPartOfで記述する
* 範囲はndcv:memberRangeの先に空ノードで表現する
	* 空ノードには，範囲の始点をxsd:minInclusiveで，終点をxsd:maxExclusiveで記述する
		
		```
		ndc9:016_018 rdf:type skos:Collection .
		ndc9:016_018 dct:isPartOf ndc9:01 .
		ndc9:016_018 ndcv:memberRange
			[
				xsd:minInclusive 16 ;
				xsd:maxExclusive 18
			] .
		```
			

## 名辞

（本節は書きかけである）

各分類項目はその項目を表す名辞（名前）を持つ．名辞はskos:prefLabelとrdfs:labelで記述する．

### skos:prefLabel

* 分類項目名を言語タグ付きで記述する

	```
	ndc9:007.1 skos:prefLabel "情報理論"@ja .
	```

* 複数の名辞がピリオドで区切られている場合でも，ひとつの文字列として記述する．

	```
	ndc9:007.13 skos:prefLabel "人工知能．パターン認識"@ja .
	```
	
	* 以下のように，名辞を分割して記述することは無い．
	
		```
		# 間違った例
		ndc9:007.13 skos:prefLabel "人工知能"@ja .
		ndc9:007.13 skos:prefLabel "パターン認識"@ja .
		```

* 分類小項目名は，分類項目名に後置しskos:prefLabelに記述する

	```
	ndc9:012.1 skos:prefLabel "建築計画：基礎調査，位置，敷地"@ja .
	```

	* 分類小項目名を持つ分類項目に対して，以下のように小項目無しの分類項目名だけを記述することは無い
	
		```
		# 間違った例
		ndc9:012.1 skos:prefLabel "建築計画"@ja .
		```
* 同義語，類語がある場合は，分類項目名に後置する

	```
	ndc9:007.634 skos:prefLabel "オペレーティング システム［OS］"@ja .
	```

* 限定語がある場合は，分類項目名に後置する

	```
	ndc9:020.28 skos:prefLabel "書誌学者＜列伝＞" @ja .
	```


### rdfs:label

* おおむねskos:prefLabelと同じ規則で記述し，加えて以下の規則にも従う
	* 言語タグは付与しない
	* 一部の分類項目は，上位分類項目の項目名を前置する
	
		```
		ndc9:012.4 rdfs:label "建築設計・製図--書庫．書架" .
		```
		
		前置する条件は，公開されたデータからは読み取れない


## 階層関係

* 階層関係をskos:broaderで表現する
	* 下位から上位への参照のみを記述し，上位から下位への参照は記述しない
	* SPARQLで逆向きに辿ることは可能
* 記号的な上位ではなく，意味的な上位を記述する
* 第1次区分項目の上位は無い
	* ndcv:topConceptOfにndc9:を記述する
	
		```
		ndc9:0 skos:topConceptOf ndc9: .
		```
		
	* チェックに用いたSPARQL式は以下


		```
		PREFIX ndcv: <http://purl.org/net/ns/ndcvocab#>
		PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
		PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
		
		SELECT distinct ?s ?s2 ?type
		WHERE {
  			?s rdf:type ndcv:MainClass .
  			?s (skos:broader|skos:topConceptOf) ?s2 .
  			OPTIONAL {?s2 rdf:type ?type .}
		}
		ORDER BY ?s ?s2
		```


* 第2次区分項目の上位は第1次区分項目または第2次区分項目または無し
	* 第2次区分の項目は，基本的に分類記号の上1桁と一致する第1次区分項目をskos:broaderに記述する
	
		```
		ndc9:15 skos:broader ndc9:1 .
		```
		
		ただし，以下の条件に一致する項目はその限りでない
		
	* 第2次区分表で字下げされておらず，かつ分類記号の下一桁が0以外の項目は，skos:broaderを記述せず，skos:topConceptOfの値をndc9:とする
	
		```
		ndc9:16 skos:topConceptOf ndc9: .
		```
		
		* 第2次区分表で上記項目にぶら下がっている第2次区分項目は，ぶら下がる先の第2次区分項目をskos:broaderに記述し，第1次区分項目をskos:broaderに記述しない
		
			```
			ndc9:17 skos:broader ndc9:16 .
			```
		
	* 第2次区分表で2段階の字下げがされている第2次区分項目は，1段上の第2次区分項目をskos:broaderに記述し，第1次区分項目をskos:broaderに記述しない
	
		```
		ndc9:47 skos:broader ndc9:46 .
		```
		
	* チェックに用いたSPARQL式は以下

		```
		PREFIX ndcv: <http://purl.org/net/ns/ndcvocab#>
		PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
		PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
		
		SELECT distinct ?s ?s2 ?type
		WHERE {
  			?s rdf:type ndcv:Division .
  			?s (skos:broader|skos:topConceptOf) ?s2 .
  			OPTIONAL {?s2 rdf:type ?type .}
		}
		ORDER BY ?s ?s2
		```
	
* 第3次区分項目の上位は第2次区分項目または第3次区分項目
	* 第3次区分表で字下げされていない第3次区分項目は，分類記号の上2桁が一致する第2次区分項目をskos:broaderに記述する
	
		```
		ndc9:060 skos:broader ndc9:06 .
		ndc9:069 skos:broader ndc9:06 .
		```
		
	* 第3次区分表で字下げされている第3次区分項目は，見た目の階層関係通りにskos:broaderで階層関係を表現する

		```
		ndc9:133 skos:broader ndc9:130 .
		ndc9:134 skos:broader ndc9:133 .
		```
		
	* チェックに用いたSPARQL式は以下．101件目以降はOFFSETの値を100，200，300，…と増やして確認した
	
		```
		PREFIX ndcv: <http://purl.org/net/ns/ndcvocab#>
		PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
		PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

		SELECT distinct ?s ?s2 (GROUP_CONCAT(distinct ?type ; separator = ", ") AS ?types)
		WHERE {
  			?s rdf:type ndcv:Section .
  			?s rdf:type skos:Concept .
  			?s (skos:broader|skos:topConceptOf) ?s2 .
  			OPTIONAL {?s2 rdf:type ?type .}
		}
		GROUP BY ?s ?s2
		ORDER BY ?s ?s2
		OFFSET 0
		LIMIT 100
		```

* 第4次区分以下の項目の上位は，分類記号の下1桁を削ったもの
	* 縮約項目の場合は，適切な位置まで階層を下げる
	* 不均衡項目の場合は，適切な位置まで階層を上げる


## その他

### NDLSHとの関連付け

* 当該分類項目を代表分類として持つNDLSHの語があれば，そのURIをskos:relatedMatchに記述する

	```
	ndc9:007.6 skos:relatedMatch <http://id.ndl.go.jp/auth/ndlsh/​01057776> .
	ndc9:007.6 skos:relatedMatch <http://id.ndl.go.jp/auth/ndlsh/​00576334> .
	...以下省略
	```

### 相関索引との関連付け

* 各分類項目には，NDC相関索引の索引語をndcv:indexedTermに空ノードで記述する
	* 空ノードには，索引語をxl:literalFormで，索引語の読みをndl:transcriptionで記述する
	
		```
		ndc9:007.6 ndcv:indexedTerm
			[
				xl:literalForm "情報処理" ;
				ndl:transcription "ジョウホウ ショリ"
			] ,
			[
				xl:literalForm "データ処理" ;
				ndl:transcription "データ ショリ"
			] ,
			[
				xl:literalForm "リアルタイムデータ処理" ;
				ndl:transcription "リアルタイム データ ショリ"
			] .
		```


## 不具合

* skos:topConceptOfの値をWebブラウザ上で表示した際，表記とリンクがおかしい
	* 表記が ```"http://id.ndl.go.jp/class/ndc9/">ndc9:```
	* リンク先が ```<http://id.ndl.go.jp/class/ndc9/``` を参照するSPARQL DESCRIBEクエリ
		* 末尾の > が無い
	* RDF/XMLのデータは問題ない