|
|||||||||
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です。
こんどは、idとbasecontext2.jsonldのファイル名を変更しています。StoreのEntityは、以下の通りです。
Propertyの追加は以下の通りです。
実行コマンドは以下の通りです。最後のGETにLinkのヘッダを付けませんでした。さてどうなるでしょう。
結果は以下の通りです。 |
|||||||||
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の指す先に実体は無くても良いこと。つまり、タイプミスしても恐らく気づかずに実行されてしまうという事です。 |