NGSI-LDにも挑戦


データ仕様の現状と課題
スマートシティの標準規格(案)
データモデルのユースケース
ツール


Column
Link
用語集

Coppell

Technologies

4. @Contextを作ろう


4.1 簡単な@Contextの作成
2022年8月10日
 前章で格納したExtityを再掲します。


{
   "id": "urn:ngsi-ld:Store:101",
   "type": "https://schema.org/Store",
   "https://schema.org/address": {
       "type": "Property",
       "value": {
           "https://schema.org/streetAddress": "長沼町202-5",
           "https://schema.org/addressLocality": "八王子市",
           "https://schema.org/addressRegion": "東京都",
           "https://schema.org/postalCode": "1920907"
       }
   },
   "location": {
       "type": "GeoProperty",
       "value": {
           "type": "Point",
           "coordinates": [139.37158, 35.64226]
       }
   },
   "name": {
       "type": "Property",
       "value": "ローソン八王子長沼町店"
   },
   "@context": "https://uri.etsi.org/ngsi-ld/v1/ngsi-ld-core-context.jsonld"
}

 idはcore @contextで@idに対し割り当てられた短縮名です。idは標準で形式が決まっており、"urn:ngsi-ld:<データタイプ名>:<文字節>"の形式であるURNです。URNですから、ユニークであることが期待されます。typeも同様に@typeの短縮名で、値はデータモデルのIRIです。次に.https://schema.org/address、location、nameがPropertyですが、locationとnameはcore @contextで定義された短縮名です。addressは定義されていないので、IRIで書かれています。typeはPropertyかRelationshipかの区別なのですが、Propertyの中でも座標は特別なので、GetPropertyと明示しています。addressとlocationの値は構造化されていますので、波括弧で囲って複数のマップ(Key-Valueペア)を記載していまず。また、Coordinatesは座標なので複数の値を持つため、大括弧で囲って東経と北緯の順番に記載しています。因みに、西経と南緯はマイナスの値で書きます。
 さて、id、type、locationなどは、https://uri.etsi.org/ngsi-ld/v1/ngsi-ld-core-context.jsonld内の定義のおかげでシンプルになっていますが、streetAddressなど、context内に定義が無いものは冗長なままでした。まずはこれを消しましょう。
 以下のコンテキストを作ります。


{
   "@context": {
       "schema": "https://schema.org/",
       "Store": "schema:Store",
       "address": "schema:address",
       "streetAddress": "schema:streetAddress",
       "addressLocality": "schema:addressLocality",
       "addressRegion": "schema:addressRegion",
       "postalCode": "schema:postalCode"
   }
}

このJSON-LD文書をhttp://www.coppelltech.jp/basecontext.jsonldに格納します。そうすると、Entityは以下の様に単純化して書く事ができます。


{
   "id": "urn:ngsi-ld:Store:101",
   "type": "Store",
   "address": {
       "type": "Property",
       "value": {
           "streetAddress": "長沼町202-5",
           "addressLocality": "八王子市",
           "addressRegion": "東京都",
           "postalCode": "1920907"
       }
   },
   "location": {
       "type": "GeoProperty",
       "value": {
           "type": "Point",
           "coordinates": [139.37158, 35.64226]
       }
   },
   "name": {
       "type": "Property",
       "value": "ローソン八王子長沼町店"
   },
   "@context": "http://www.coppelltech.jp/basecontext.jsonld"
}

 ここで、https://uri.etsi.org/ngsi-ld/v1/ngsi-ld-core-context.jsonldが消えているのが分かりますが、実はこのContextはcore @contextであり、既定値として自動的に実行されるため、本来は省略しても構わない定義でした。尚、他の定義に優先するので、この既定値のContext (core @context) を他の定義で書き換える事は出来ません。このJSON-LD文書を今度はDドライブ直下のpostStore101new.jsonldファイルに格納します。
 早速書き込んでみましょう。コマンドは以下です。


curl -iX POST 'http://localhost:1026/ngsi-ld/v1/entities/' -H 'Content-Type: application/ld+json' -d @d:\postStore101new.jsonld

そうすると、結果は以下の通りです。

PS C:\Users\owner> curl -iX POST 'http://localhost:1026/ngsi-ld/v1/entities/' -H 'Content-Type: application/ld+json' -d @d:\postStore101new.jsonld
HTTP/1.1 201 Created
Date: Wed, 10 Aug 2022 07:22:53 GMT
Location: /ngsi-ld/v1/entities/urn:ngsi-ld:Store:101
Content-Length: 0

PS C:\Users\owner>

また読み出してみましょう。読み出すときもContextを通知する必要があり、ヘッダのLinkで通知します。

curl -X GET 'http://localhost:1026/ngsi-ld/v1/entities/urn:ngsi-ld:Store:101' -H 'Accept: application/ld+json' -H 'Link: <http://www.coppelltech.jp/basecontext.jsonld>; type="application/ld+json"'

そうすると、結果が以下の様に帰ってくるはずです。
PS C:\Users\owner> curl -X GET 'http://localhost:1026/ngsi-ld/v1/entities/urn:ngsi-ld:Store:101' -H 'Accept: application/ld+json' -H 'Link: <http://www.coppelltech.jp/basecontext.jsonld>; type="application/ld+json"'
{"@context":"http://www.coppelltech.jp/basecontext.jsonld","id":"urn:ngsi-ld:Store:101","type":"Store","address":{"type":"Property","value":{"streetAddress":"長沼町202-5","addressLocality":"八王子市","addressRegion":"東京都","postalCode":"1920907"}},"location":{"type":"GeoProperty","value":{"type":"Point","coordinates":[139.37158,35.64226]}},"name":{"type":"Property","value":"ローソン八王子長沼町店"}}
PS C:\Users\owner>

json Pretty Linter で整形すると以下となります。

{
   "@context": "http://www.coppelltech.jp/basecontext.jsonld",
   "id": "urn:ngsi-ld:Store:101",
   "type": "Store",
   "address": {
       "type": "Property",
       "value": {
           "streetAddress": "長沼町202-5",
           "addressLocality": "八王子市",
           "addressRegion": "東京都",
           "postalCode": "1920907"
       }
   },
   "location": {
       "type": "GeoProperty",
       "value": {
           "type": "Point",
           "coordinates": [
               139.37158,
               35.64226
           ]
       }
   },
   "name": {
       "type": "Property",
       "value": "ローソン八王子長沼町店"
   }
}

登録したEntityが読み出されている事がわかります。尚、GET時にLinkヘッダでContextを通知しない場合、全てが短縮名にならず、core @contextの範囲でだけ短縮名になります。