NGSI-LDにも挑戦


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


Column
Link
用語集

Coppell

Technologies

 4. @Contextを作ろう 4.2節



4.2.PropertyとRelationshipの追加
2022年4月10日
 本節では、既に格納したStoreのEntityにPropertyとRelationshipを追加します。
 このコンビニが「角打ち」を提供しているかどうかというPropertyと、このコンビニに付設する駐車場のEntityへのRelationshipを追加してみます。因みに角打ちとは店先で酒を飲ませてくれる昭和的なサービスです。Property名とRelationship名はキャメルケース(Lower Camel Case)を使うことが必要です。追加するPropertyとしては"kakuuchi"を追加します。本来、米国英語である必要がありますが、その様な英語はないのでそのままkakuuchiとします。また、駐車場の形式はOffStreetParkingという形式が定められており、面倒なので、既にOffStreetParkingのEntityが格納されていると仮定しましょう。そのEntityのidは、"urn:ngsi-ld:OffStreetParking:101"だったとし、StoreのEntityに駐車場との関係を示すRelationshipを追加してみましょう。新たに追加するRelationship名は"refOffStreetParking"とします。
以下のjsonld形式のテキストファイルを用意します。

{
   "@context": "http://www.coppelltech.jp/basecontext.jsonld",
   "kakuuchi": {
       "type": "Property",
       "value": false
   },
   "refOffStreetParking": {
       "type": "Relationship",
       "object": "urn:ngsi-ld:OffStreetParking:101"
   }
}

このpostrefOffStreetParking101.jsonldを参照してEntityを指定してPOSTします。Attributeは"attrs"フォルダ配下に格納されているかの様に管理されているので、以下のように指定します。

curl -iX POST 'http://localhost:1026/ngsi-ld/v1/entities/urn:ngsi-ld:Store:101/attrs' -H 'Content-Type: application/ld+json' -d @d:\postrefOffStreetParking101.jsonld
そうすると、以下の様な応答があれば成功です。
PS C:\Users\owner> curl -iX POST 'http://localhost:1026/ngsi-ld/v1/entities/urn:ngsi-ld:Store:101/attrs' -H 'Content-Type: application/ld+json' -d @d:\postrefOffStreetParking101.jsonld
HTTP/1.1 204 No Content
Date: Fri, 12 Aug 2022 01:03:09 GMT

PS C:\Users\owner>

EntityをGETしてみましょう。

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":"ローソン八王子長沼町店"},"kakuuchi":{"value":false,"type":"Property"},"refOffStreetParking":{"object":"urn:ngsi-ld:OffStreetParking:101","type":"Relationship"}}
PS C:\Users\owner>

この様に、標準形式に無いAttributeが下線部の様に格納されたことがわかります。
めでたし、めでたし。・・・・ええっ。ちょっと待ってください。NGSI-LDはあ曖昧さを排除するために、IRIを使うのではなかったのでしたっけ。"kakuuchi"や"refOffStreetparking"は@Contextにも記載がありませんし、IRIにも見えません。試しにIRIに見える記述で@Contextも定義を入れて実行してみましょう。@Contextは以下の様に追記しました。赤字の部分が追加した行ですが、http://www.coppelltech.jp/contextは存在しないurlです。


{
   "@context": {
       "schema": "https://schema.org/",
       "coppell": "http://www.coppelltech.jp/context#",
       "Store": "schema:Store",
       "address": "schema:address",
       "streetAddress": "schema:streetAddress",
       "addressLocality": "schema:addressLocality",
       "addressRegion": "schema:addressRegion",
       "postalCode": "schema:postalCode",
       "kakuuchi": "coppell:kakuuchi",
       "refOffStreetParking": "coppell:refOffStreetParking"
   }
}

こんどは、idとbasecontext2.jsonldのファイル名を変更しています。StoreのEntityは、以下の通りです。


{
   "id": "urn:ngsi-ld:Store:102",
   "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/basecontext2.jsonld"
}

Propertyの追加は以下の通りです。


{
   "@context": "http://www.coppelltech.jp/basecontext2.jsonld",
   "kakuuchi": {
       "type": "Property",
       "value": false
   },
   "refOffStreetParking": {
       "type": "Relationship",
       "object": "urn:ngsi-ld:OffStreetParking:102"
   }
}

実行コマンドは以下の通りです。最後のGETにLinkのヘッダを付けませんでした。さてどうなるでしょう。


curl -iX POST 'http://localhost:1026/ngsi-ld/v1/entities/' -H 'Content-Type: application/ld+json' -d @d:\postStore102new.jsonld
curl -iX POST 'http://localhost:1026/ngsi-ld/v1/entities/urn:ngsi-ld:Store:102/attrs' -H 'Content-Type: application/ld+json' -d @d:\postrefOffStreetParking102.jsonld
curl -X GET 'http://localhost:1026/ngsi-ld/v1/entities/urn:ngsi-ld:Store:102' -H 'Accept: application/ld+json'

結果は以下の通りです。
PS C:\Users\owner> curl -iX POST 'http://localhost:1026/ngsi-ld/v1/entities/' -H 'Content-Type: application/ld+json' -d @d:\postStore102new.jsonld
HTTP/1.1 201 Created
Date: Fri, 12 Aug 2022 01:42:27 GMT
Location: /ngsi-ld/v1/entities/urn:ngsi-ld:Store:102
Content-Length: 0

PS C:\Users\owner> curl -iX POST 'http://localhost:1026/ngsi-ld/v1/entities/urn:ngsi-ld:Store:102/attrs' -H 'Content-Type: application/ld+json' -d @d:\postrefOffStreetParking102.jsonld
HTTP/1.1 204 No Content
Date: Fri, 12 Aug 2022 01:47:29 GMT

PS C:\Users\owner> curl -X GET 'http://localhost:1026/ngsi-ld/v1/entities/urn:ngsi-ld:Store:102' -H 'Accept: application/ld+json'
{"@context":"https://uri.etsi.org/ngsi-ld/v1/ngsi-ld-core-context.jsonld","id":"urn:ngsi-ld:Store:102","type":"https://schema.org/Store","https://schema.org/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":"ローソン八王子長沼町店"},"http://www.coppelltech.jp/context#kakuuchi":{"value":false,"type":"Property"},"http://www.coppelltech.jp/context#refOffStreetParking":{"object":"urn:ngsi-ld:OffStreetParking:102","type":"Relationship"}}
PS C:\Users\owner>

 最後のGETの下線部分は@Contextに存在しないIRIを用いて記載したものでした。それでもOrion-ldはIRIだと理解して短縮名をIRIに拡張してEntityを作成していた事が分かります。但し、GET時には@Contextを通知しなかったので、Core @Contextに記載がある短縮名以外はIRIの形式で表示されました。この様に、IRIは実体として存在する必要はなく、形式としてIRIであれば良いことが分かります。

 この節で分かったことは、IRIで書くべき場所にIRIを書くのは利用者の責任で、実装はチェックしてくれない事。IRIの指す先に実体は無くても良いこと。つまり、タイプミスしても恐らく気づかずに実行されてしまうという事です。