3.やってみましたIMI対応・素朴な疑問の共有と対策のアイデア共有

2018年12月21日「IMI事例共有・勉強会」

13.やってみましたIMI対応・素朴な疑問の共有と対策のアイデア共有
1.コア語彙の検索、選択はどうしたらよいのかわからない2.ドメイン語彙、応用語彙の作成方法がわからない3.クラス内の構造化されたプロパティの選び方がわからない4.コア語彙のプロパティだけ使うといけないのか5.データモデル設計時の項目名の付け方がわからない
6.データの範囲（指標的）は、語彙としてどう表現すればよいのかわからない7.コード、コードリストの使い方がわからない
8.構造化されたXMLデータセットがXSD Sequence Error となる
9.固定値制約、グループ指定のデータモデルの意味がわからない
10.現実の日付けデータに合わない場合の語彙表現がわからない11.既に構造化されたデータセットをどのようにマッピングしたら良いのかわからない
12.座標系のデータセットはどのように語彙設計したらよいのかわからない
2

1.コア語彙の検索、選択はどうしたらよいのかわからない3コア語彙の検索、選択はどうしたら良いのか分からない

クラス用語

事柄（事物や出来事）に関する概念です。
性質や属性を表すプロパティ用語と結びついて使っています。

プロパティ用語

事柄の性質や事柄と事柄の関係を指し示す概念を表すための用語です。

※コア語彙は、この関連で定義し提供しています。

人型...ic:氏名...ic:生年月日

日付型...ic:年...ic:月...ic:日

生年月日
型: ic:日付型
説明: 生年月日を記述するためのプロパティ用語
定義域: 人型
日
型: xsd:integer
説明:日付や日時などの日の値を記述するためのプロパティ用語
定義域:日時型 日付型
4

探し方その1
基本は、コア語彙のHTML一覧から探す・・
クラス用語: 62
プロパティ用語: 121

5

探し方その2コア語彙のスキーマ(RDF/TTL)をRDFデータベースへgraphへ投入して人型を検索してみる
PREFIX ic: <http://imi.go.jp/ns/core/rdf#>
SELECT * WHERE {?s ?p ?oFILTER (REGEX(?s, "http://imi.go.jp/ns/core/rdf#") && REGEX(?o, "人型"))}

6

探し方その3
PostgreSQLデータベースで、RDF検索して見る(テーブル、ファンクション)-- テーブル定義
DROP TABLE IF EXISTS "コア語彙" CASCADE;CREATE TABLE "コア語彙" ("主語" TEXT, "述語" TEXT, "目的語" TEXT);-- ファンクション定義
DROP FUNCTION IF EXISTS "コア語彙検索"(text, integer);
CREATE FUNCTION "コア語彙検索"(text, integer) RETURNSTABLE("主語" TEXT, "述語" TEXT, "目的語" TEXT, "パス" TEXT[],"階層" TEXT ) AS $$WITH RECURSIVE "一次結果"("主語", "述語", "目的語", "パス") AS(SELECT "主語" ,"述語", "目的語", ARRAY["主語"] FROM "コア語彙" WHERE "主語" = $1
UNION ALL
SELECT コア語彙."主語", コア語彙."述語", コア語彙."目的語", result."パス" || コア語彙."主語"
FROM "一次結果" AS result,"コア語彙" AS コア語彙 WHERE result."目的語" = コア語彙."主語"
AND コア語彙."目的語" != ALL(result."パス"))
SELECT "主語", "述語", "目的語", "パス",ARRAY_UPPER("パス", 1)::TEXT AS "階層" FROM "一次結果"
WHERE ARRAY_UPPER("パス", 1) <= $2;$$ LANGUAGE SQL;
7

PostgreSQLデータベースで、RDFデータ(class,property,set)
INSERT INTO コア語彙 values('ic:人型','class','ic:実体型');
INSERT INTO コア語彙 values('ic:名称型','class','ic:事物型');
INSERT INTO コア語彙 values('ic:氏名型','class','ic:事物型');
INSERT INTO コア語彙 values('ic:住所型','class','ic:事物型');
INSERT INTO コア語彙 values('ic:連絡先型','class','ic:事物型');….
INSERT INTO コア語彙 values('ic:始点','property','ic:地物型');
INSERT INTO コア語彙 values('ic:終点','property','ic:地物型');
INSERT INTO コア語彙 values('ic:設置地点','property','ic:地物型');
INSERT INTO コア語彙 values('ic:測地高度','property','ic:長さ型');
INSERT INTO コア語彙 values('ic:高さ','property','ic:長さ型');….

INSERT INTO コア語彙 VALUES('ic:人型','set','ic:氏名');
INSERT INTO コア語彙 VALUES('ic:人型','set','ic:性別');
INSERT INTO コア語彙 VALUES('ic:人型','set','ic:性別コード');
INSERT INTO コア語彙 VALUES('ic:人型','set','ic:生年月日');….

8

SELECT "コア語彙検索"("主語",4) FROM "コア語彙" WHERE "主語" = 'ic:氏名型' GROUP BY "コア語彙検索"("主語",4);
コア語彙検索----------------------------------------------------------------------------------------------(ic:ID,property,ic:ID型,"{ic:氏名型,ic:事物型,ic:ID}",3)(ic:ID型,class,ic:概念型,"{ic:氏名型,ic:事物型,ic:ID,ic:ID型}",4)(ic:ID型,set,ic:参照,"{ic:氏名型,ic:事物型,ic:ID,ic:ID型}",4)(ic:ID型,set,ic:識別値,"{ic:氏名型,ic:事物型,ic:ID,ic:ID型}",4)(ic:ID型,set,ic:体系,"{ic:氏名型,ic:事物型,ic:ID,ic:ID型}",4)(ic:ミドルネーム,property,xsd:string,"{ic:氏名型,ic:ミドルネーム}",2)(ic:ミドルネームカナ表記,property,xsd:string,"{ic:氏名型,ic:ミドルネームカナ表記}",2)(ic:ミドルネームローマ字表記,property,xsd:string,"{ic:氏名型,ic:ミドルネームローマ字表記}",2)(ic:メタデータ,property,ic:文書型,"{ic:氏名型,ic:事物型,ic:概念型,ic:メタデータ}",4)(ic:画像,property,xsd:anyURI,"{ic:氏名型,ic:事物型,ic:画像}",3)(ic:概念型,set,ic:メタデータ,"{ic:氏名型,ic:事物型,ic:概念型}",3)(ic:概念型,set,ic:種別,"{ic:氏名型,ic:事物型,ic:概念型}",3)(ic:概念型,set,ic:種別コード,"{ic:氏名型,ic:事物型,ic:概念型}",3)(ic:記述,property,ic:記述型,"{ic:氏名型,ic:事物型,ic:記述}",3)(ic:記述型,class,ic:概念型,"{ic:氏名型,ic:事物型,ic:記述,ic:記述型}",4)(ic:記述型,set,ic:説明,"{ic:氏名型,ic:事物型,ic:記述,ic:記述型}",4)(ic:参照,property,ic:参照型,"{ic:氏名型,ic:事物型,ic:参照}",3)(ic:参照型,class,ic:概念型,"{ic:氏名型,ic:事物型,ic:参照,ic:参照型}",4)(ic:参照型,set,ic:参照先,"{ic:氏名型,ic:事物型,ic:参照,ic:参照型}",4)(ic:氏名型,class,ic:事物型,{ic:氏名型},1)(ic:氏名型,set,ic:ミドルネーム,{ic:氏名型},1)(ic:氏名型,set,ic:ミドルネームカナ表記,{ic:氏名型},1)(ic:氏名型,set,ic:ミドルネームローマ字表記,{ic:氏名型},1)(ic:氏名型,set,ic:姓,{ic:氏名型},1)(ic:氏名型,set,ic:姓カナ表記,{ic:氏名型},1)(ic:氏名型,set,ic:姓ローマ字表記,{ic:氏名型},1)(ic:氏名型,set,ic:姓名,{ic:氏名型},1)(ic:氏名型,set,ic:姓名カナ表記,{ic:氏名型},1)(ic:氏名型,set,ic:姓名ローマ字表記,{ic:氏名型},1)(ic:氏名型,set,ic:名,{ic:氏名型},1)(ic:氏名型,set,ic:名カナ表記,{ic:氏名型},1)(ic:氏名型,set,ic:名ローマ字表記,{ic:氏名型},1)(ic:事物型,class,ic:概念型,"{ic:氏名型,ic:事物型}",2)(ic:事物型,set,ic:ID,"{ic:氏名型,ic:事物型}",2)(ic:事物型,set,ic:画像,"{ic:氏名型,ic:事物型}",2)(ic:事物型,set,ic:記述,"{ic:氏名型,ic:事物型}",2)(ic:事物型,set,ic:参照,"{ic:氏名型,ic:事物型}",2)(ic:事物型,set,ic:説明,"{ic:氏名型,ic:事物型}",2)(ic:事物型,set,ic:表記,"{ic:氏名型,ic:事物型}",2)(ic:種別,property,xsd:string,"{ic:氏名型,ic:事物型,ic:概念型,ic:種別}",4)(ic:種別コード,property,ic:コード型,"{ic:氏名型,ic:事物型,ic:概念型,ic:種別コード}",4)(ic:姓,property,xsd:string,"{ic:氏名型,ic:姓}",2)(ic:姓カナ表記,property,xsd:string,"{ic:氏名型,ic:姓カナ表記}",2)(ic:姓ローマ字表記,property,xsd:string,"{ic:氏名型,ic:姓ローマ字表記}",2)(ic:姓名,property,xsd:string,"{ic:氏名型,ic:姓名}",2)(ic:姓名カナ表記,property,xsd:string,"{ic:氏名型,ic:姓名カナ表記}",2)(ic:姓名ローマ字表記,property,xsd:string,"{ic:氏名型,ic:姓名ローマ字表記}",2)(ic:説明,property,xsd:string,"{ic:氏名型,ic:事物型,ic:説明}",3)(ic:表記,property,xsd:string,"{ic:氏名型,ic:事物型,ic:表記}",3)(ic:名,property,xsd:string,"{ic:氏名型,ic:名}",2)(ic:名カナ表記,property,xsd:string,"{ic:氏名型,ic:名カナ表記}",2)(ic:名ローマ字表記,property,xsd:string,"{ic:氏名型,ic:名ローマ字表記}",2)(52 行)(ic:種別コード,property,ic:コード型,"{ic:氏名型,ic:事物型,ic:概念型,ic:種別コード}",4)9

探し方その4
http://www.visualdataweb.de/webvowl/#file=schema.xml
スキーマ(OWL)から検索して見る

10

11

2.ドメイン語彙、応用語彙の作成方法がわからない

12

ドメイン語彙、応用語彙の作成方法
実際に語彙を作り上げるためには、クラス用語とプロパティ用語およびそれらの関連性を定義する必要があります。
プロパティ用語は、クラス用語の性質・属性を表すものとして、クラス用語を何らかの値や、他のクラス用語と結び付けるために用いられます。たとえば、【期間】というクラス用語は、【開始日時】、【終了日時】、【説明】というプロパティ用語を組み合わせることができます。このような用語の集合
が「語彙」です。

用語には、それ自体の意味と共に、クラス用語とプロパティ用語の関係のような構造があります。
また、テキストデータの値の書式制限（文字数の上限など）もあります。従って、用語の集合である「語彙」も、用語に関わるそれら様々な情報を伴ったデータの集合として捉えられます。
13

継承による新規クラス用語の作成
語彙のクラス用語をベースに、プロパティ用語の追加、回数の変更などを行って新たなクラス用語を定義することをクラス用語の「継承」と呼びます。
継承には「拡張」と「制限」の2種類がありますが、共通語彙基盤の核となる「コア語彙」では、プロパティ用語を追加してクラス用語を派生させていく「拡張」の手法を使っています。
このような継承の考え方を用い、「コア語彙」を継承して「ドメイン語彙」や個別の応用で用いるデータモデルに必要なクラス用語とプロパティ用語を新規に作成することができます。

制約事項：
新規のクラス用語は、コア語彙をベースとした継承によって定義すること（少なくともコア語彙の全ての型のベースとなる基本型としての「ic:事物型」は継承する。なお、直接の継承元がコア
語彙のクラス用語ではなくても、継承関係を辿った中にコア語彙のクラス用語（例えばic:事物型）が現れればよい）

14複数のルートがあるデータセットはどのようにクラスを考えれば良いのか

目的の概念を特定正規化されたデータセット

連携項目

活動関連のデータセット
連携項目

組織関連のデータセット

連携項目

目的別のデータ連携用ビュー

人関連のデータセット

コア語彙・クラス

AAA(目的)型

目的に応じた型
継承再構成

XXX(人関連)型

継承再構成

YYY(活動関連)型

継承再構成

ZZZ(組織関連)型

継承再構成

目的に応じたデータモデル

人型

活動型

組織型
継承をたどることで語彙の構造を理解できる153.クラス内の構造化されたプロパティの選び方がわからない

16

クラス内の構造化されたプロパティの選び方が分からない
選択したクラスのプロパティは、すべて利用するのではなく目的にあったプロパティを選択して使用します。

プロパティの値型は意識して使う必要があります。
※xsd:dateは YYYY-MM-DD で規定されています

17

クラス内の構造化されたプロパティの選び方が分からない
選択したクラスのプロパティの回数指定のあるものを設定する場合には、グループ指定でユニークにして使います。

use ic:日付型>ic:標準型日付[臨時休業日(外部)];
use ic:日付型>ic:標準型日付[補足日];

184.コア語彙のプロパティだけ使うといけないのか5.データモデル設計時の項目名の付け方が
わからない

19

コア語彙のプロパティだけ使うといけないのか
コア語彙のクラスが用途に合わないし・・
項目名の標準化にプロパティ用語だけ使用したい・・

20

項目名の標準化のためプロパティ用語だけ使用したい
原始データ設計

コア語彙のプロパティ

 しかし
プロパティ用語だけを適用した場合

保守担当者名

ic:姓名

管理者名

ic:姓名

連絡先担当者名

ic:姓名・項目の意味が分からない
・データ項目が重複してどれか分からない

21

モデル設計時の項目名の付け方

コア語彙
名称
単一の項目名だけでは意味が分からない

構造化されていると意味が分かるが・・
表形式データでは?_?

日付
対象データ
名称
日付

単一の項目名だけで意味が分かる!
22

6.データの範囲（指標的）は、語彙としてどう表現すればよいのかわからない7.コード、コードリストの使い方がわからない

23データの範囲(指標的)は語彙としてどう表現すれば良いのか分からない?

24

コードリスト、コードを利用する方法で考えて見る
識別値が何を表すのかを明示する個別コード定義も必要です。コード定義においてコード種別を示す
ことで、個々のコードとコードリストを結びつけます。コードリストと個別コードをセットで定義して、コードリスト定義からもリストに含まれるコードの全体が把握できるようにします。
コードリスト型
プロパティ

役割

値の型

ic:名称

コードリストの名称

ic:名称型

ic:発行者

コードリストを作成、発行、維持する主体

ic:実体型

ic:バージョン

定義しているコードリストのバージョン

xsd:string

コード型
プロパティ

役割

値の型

ic:コード種別

そのコードが含まれるコードリスト

ic:コードリスト型

ic:識別値

情報属性を機械処理しやすく表す符号

xsd:string

ic:表記

識別値が表す情報属性を人が理解できるように示すラベル

xsd:stringic:上位コード

階層型コードリストにおける上位コード

ic:コード型

ic:下位コード

階層型コードリストにおける下位コード

ic:コード型

ic:関連コード

関連のあるコード

ic:コード型

ic:参照

追加情報を参照するための情報を記述

ic:参照型25

範囲(指標的)情報の集合を表現するためのコードリストの場合

例えば、元データは匿名化する際に、識別と対応する表現のコードリストを持っていると仮定すると・・
このようなコードリストで変換しているなどが考えられる。=>今回は、変換後のデータセットを対象とする。

26

応用語彙でモデルを作ってみる#description "ex:K-匿名化の年齢分類を表現するためのクラス⽤語"
class ex:匿名化年齢分類型{@ic:コードリスト型};#description "年齢分類に関する指標を参照するためのプロパティ⽤語"
property ex:匿名化年齢分類{@ic:コード型};

set ex:匿名化年齢分類型>ex:匿名化年齢分類;

27

#prefix ic: "http://imi.go.jp/ns/core/2#"#prefix ex: "http://example.org/"
vocabulary "http://example.org/" ;#name "匿名化年齢分類型"
class ex:匿名化年齢分類型{@ic:コードリスト型};#name "匿名化年齢分類"
property ex:匿名化年齢分類{@ic:コード型};
set ex:匿名化年齢分類型>ex:匿名化年齢分類;28

#prefix ic: "http://imi.go.jp/ns/core/2#"#prefix ex: "http://example.org/"
vocabulary "http://example.org/" ;#name "匿名化年齢分類型"
class ex:匿名化年齢分類型{@ic:コードリスト型};#name "匿名化年齢分類"
property ex:匿名化年齢分類{@ic:コード型};
set ex:匿名化年齢分類型>ex:匿名化年齢分類;
set ic:数量型 > ex:匿名化年齢分類;

年齢の匿名分類を表したいので、数量型に結び付け29変更・追記種別として参照先を固定値でいれて、構造化データ上に表現してみる

30

31

8.構造化されたXMLデータセットがXSD
Sequence Error となる

32

データ変換後の構造化において、XSD Sequence Validation error がおきる問題
実装におけるデータ変換後の構造化問題のポイント
語彙schema<xsd:group name="座標型-固有要素グループ"><xsd:sequence><xsd:element ref="ic:座標参照系" minOccurs="0" maxOccurs="1"/><xsd:element ref="ic:経度書式" minOccurs="0" maxOccurs="1"/><xsd:element ref="ic:緯度" minOccurs="0" maxOccurs="1"/><xsd:element ref="ic:経度" minOccurs="0" maxOccurs="1"/><xsd:element ref="ic:座標データ書式" minOccurs="0" maxOccurs="1"/><xsd:element ref="ic:座標データ" minOccurs="0" maxOccurs="1"/><xsd:element ref="ic:測地高度" minOccurs="0" maxOccurs="1"/></xsd:sequence></xsd:group>

IMI語彙記法で、プロパ
ティ順序制約の規定が曖昧なため実装の問題が起きている

Validation error!!
IMI語彙記法で、use設定による構造順指定#prefix ic: “http://imi.go.jp/ns/core/2#”
datamodel;
use ic:座標型>ic:経度;
use ic:座標型>ic:緯度;

データ変換後の構造化データ<root><ic:座標 xsi:type=“ic:座標型”><ic:経度>146.22</ic:経度><ic:緯度>34.02</ic:緯度></ic:座標></root>33

9.固定値制約、グループ指定のデータモデルの意味がわからない

34

固定値制約、グループ指定のデータモデルの意味が分からない

意味の違う電話番号が２つあるが、グループ指定と固定値制約のどちらで
データモデルを表現すれば良いのでしょうか?

35

Modelでは、値等価制約として書きたくなるが、書かない!

36

生成されるModelとMapping

手作業で、Mappingに固定値制約の値をつけて作成しなおす

37

このDMDと手作業で作成したMappingを使用してデータ形式変換をした結果

処理結果、入力項目に説明項目は無いがマッピング先に固定値制約が反映されて下記のようなRDF/XMLが出力される

38

10.現実の日付けデータに合わない場合の語彙表現がわからない

39

日付データと語彙の要素が合わない場合
IMIツールで処理する場合、入力データのセルの書式設定は、[文字列]となっている必要があります。
入力データ(xlsx)の項目に書式設定された場合

DMD作成支援「表形式データのプレビュー」(データ形式変換ツールも同様)で意図しないデータとなる場合があります。

40

11.既に構造化されたデータセットをどのようにマッピングしたら良いのかわからない

41

構造化データのマッピング

構造化されたデータ
コア語彙
名称
日付
対象データ
名称

{
mapping:{“コア語彙>名称” : “ic:氏名型>ic:姓名”,“コア語彙>日付” : “ic:日付型>ic:標準型日付”,“対象データ>名称” : “ic:氏名型>ic:姓名”,“対象データ>日付” : “ic:日付型>ic:標準型日付”}}
このようにマッピングファイルとして定義できるが、定義の解釈と構造化データへの変換処理は実装の中で実現しなくてはなりません。

日付42

IMI共通語彙基盤ライブラリを使って、構造化データから簡易なマッピングファイルを生成することができます。
<rdf:Description><rdf:type rdf:resource="ic:施設型"/><ic:ID rdf:parseType="Resource"><ic:識別値>001</ic:識別値></ic:ID><ic:名称 rdf:parseType="Resource"><ic:表記>共通語彙基盤</ic:表記><ic:カナ表記>キョウツウゴイキバン</ic:カナ表記></ic:名称><ic:住所 rdf:parseType="Resource"><ic:表記>東京都文京区本駒込二丁目28番8号 文京グリーンコートセンターオフィ
ス16階</ic:表記><ic:方書>総合受付13階</ic:方書></ic:住所><ic:地理座標 rdf:parseType="Resource"><ic:緯度>34.562</ic:緯度><ic:経度>145.26</ic:経度><ic:測地高度 rdf:parseType="Resource"><ic:数値 rdf:datatype="xsd:decimal">12.5</ic:数値></ic:測地高度></ic:地理座標><ic:連絡先 rdf:parseType="Resource"><ic:電話番号 rdf:datatype="ic:電話番号型">03-5978-7501</ic:電話番号><ic:内線番号>2613</ic:内線番号></ic:連絡先><ic:関与 rdf:parseType="Resource"><ic:役割>設置主体</ic:役割><ic:関与者 rdf:parseType="Resource"><rdf:type rdf:resource="ic:組織型"/><ic:ID rdf:parseType="Resource"><ic:識別値>13105</ic:識別値>

IMIToolsCore.Util.jsonld2mapping4312.座標系のデータセットはどのように語彙設計したらよいのかわからない

44

座標系のデータの語彙設計
座標データは実装上で様々なフォーマットが利用されている現状である。
地点を表すデータや面で表すデータなどがあり、まだ語彙の構造として確立した状況にない・・
RFC7946

45

GeoJsonの例

データモデルに展開してみる{"type": "Feature","geometry": {"type": "Point","coordinates": [139.75, 35.72]},"properties": {“name”: “災害発生場所"}}

このようにデータモデル化できるが、解釈と構造化データとの変換処理は実装の中で実現しなくてはなりません。
46