Fiwareを使って都市OSを動かしてみよう

Munu


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


Column
Link
用語集

Coppell

Technologies

 3. Contextの作成 3.2節




3.2.独自形式のEntity作成
2022-04-10/2023-11-11
次に、独自のEntityの形式の例を二つ格納してみましょう。
 ひとつは、前節のStoreのEntityに独自のAttributeを追加しましょう。このコンビニには駐車場があります。駐車場の形式はOffStreetParkingという形式が定められており、面倒なので、既にOffStreetParkingのEntityが格納されていると仮定しましょう。そのEntityのidは、"urn:ngsi-ld:OffStreetParking:002"だったとし、StoreのEntityに駐車場との関係を示すAttributeを追加してみましょう。Attribute名はキャメルケース(Lower Camel Case)を使うことが必要です。そこで、新たに追加するAttribute名を"refOffStreetParking"としましょう。因みに、Entity間の関係をrelationshipと呼びます。NGSI v2では、relationshipはこの様に相手のEntityのidをattributeとして格納する事で表現します。
以下のjson形式のテキストファイルを用意します。

{
   "refOffStreetParking": {
       "type": "Relationship",
       "value": "urn:ngsi-ld:OffStreetParking:002"
   }
}

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

curl -iX POST -H "Content-Type: application/json" -d @d:\postrefOffStreetParking002.json http://localhost:1026/v2/entities/urn:ngsi-ld:Store:002/attrs
そうすると、以下の様な応答があれば成功です。
PS C:\Users\owner> curl -iX POST -H "Content-Type: application/json" -d @d:\postrefOffStreetParking002.json http://localhost:1026/v2/entities/urn:ngsi-ld:Store:002/attrs
HTTP/1.1 204 No Content
Connection: Keep-Alive
Fiware-Correlator: 36025b78-baeb-11ec-b52b-0242ac120003
Date: Wed, 13 Apr 2022 05:33:12 GMT

PS C:\Users\owner>

EntityをGETしてみましょう。

curl -X GET http://localhost:1026/v2/entities/urn:ngsi-ld:Store:002

応答は以下となります。
PS C:\Users\owner> curl -X GET http://localhost:1026/v2/entities/urn:ngsi-ld:Store:002
{"id":"urn:ngsi-ld:Store:002","type":"Store","address":{"type":"PostalAddress","value":{"streetAddress":"吉浦潭鼓町1-1","addressLocality":"呉市","addressRegion":"広島県","postalCode":"7370843"},"metadata":{}},"category":{"type":"Text","value":"ConvenienceStore","metadata":{}},"description":{"type":"Text","value":"呉市吉浦の国道31号線沿いのコンビニエンススト ア","metadata":{}},"location":{"type":"geo:json","value":{"type":"Point","coordinates":[132.5304138,34.2567817]},"metadata":{}},"name":{"type":"Text","value":"セブンイレブン呉市吉浦店","metadata":{}},"openingHoursSpecification":{"type":"StructuredValue","value":{"opens":"00:00:00","closes":"23:59:00"},"metadata":{}},"refOffStreetParking":{"type":"Relationship","value":"urn:ngsi-ld:OffStreetParking:002","metadata":{}},"telephone":{"type":"Text","value":"+81823311458","metadata":{}}}
PS C:\Users\owner>

この様に、標準形式に無いAttributeが下線部の様に格納されたことがわかります。

ここまでは、標準があるEntity形式にAttributeを独自に追加しましたが、今度は全く新たなEntity形式を作ってみましょう。コンビニは冷蔵庫がありますから、RefrigeratorというタイプのEntityを考えましょう。尚、Entityのタイプ名はアメリカ英語、先頭文字は大文字という制約かありますから、注意が必要です。Entityの形式は以下の通りとします。refStoreのTypeが"Relationship"となっていますが、これは他のEntityのidが格納されている特別なAttributeなので、特別なTypeとしてRelationshipを慣用的に使います。

Attribute Type Description of Value
id Text "エンティティーのID
type Text "Refrigerator"
refStore Relationship 冷蔵庫を設置しているStoreのid
name Text 店内における冷蔵庫の呼称
description Text 説明
ここで、一度に3っつのEntityを格納してみましょう。jsonのテキストは以下となります。複数のEntityを並べるときは、"[]"で囲うことで複数並べることができます。また、actionTypeに appendを指定していますが、これは既に格納されていれば書き換えて、格納されていない場合は新たに格納する指定です。

{
   "actionType": "append",
   "entities": [
       {
           "id": "urn:ngsi-ld:Refrigerator:002-001",
           "type": "Refrigerator",
           "name": {
               "type": "Text",
               "value": "窓側"
           },
           "description": {
               "type": "Text",
               "value": "店内で一番窓側に設置した冷蔵庫"
           },
           "refStore": {
               "type": "Relationship",
               "value": "urn:ngsi-ld:Store:002"
           },
           "temperature": {
               "type": "Integer",
               "value": 10
           }
       },
       {
           "id": "urn:ngsi-ld:Refrigerator:002-002",
           "type": "Refrigerator",
           "name": {
               "type": "Text",
               "value": "中央"
           },
           "description": {
               "type": "Text",
               "value": "店内で中央の冷蔵庫"
           },
           "refStore": {
               "type": "Relationship",
               "value": "urn:ngsi-ld:Store:002"
           },
           "temperature": {
               "type": "Integer",
               "value": 11
           }
       },
       {
           "id": "urn:ngsi-ld:Refrigerator:002-003",
           "type": "Refrigerator",
           "name": {
               "type": "Text",
               "value": "奥側"
           },
           "description": {
               "type": "Text",
               "value": "店内で一番奥に設置した冷蔵庫"
           },
           "refStore": {
               "type": "Relationship",
               "value": "urn:ngsi-ld:Store:002"
           },
           "temperature": {
               "type": "Integer",
               "value": 12
           }
       }
   ]
}
このテキストファイルを参照してPOSTします。今度はEntitiesではなく、op/updateに対して行います。フォルダの構造は後で説明します。

curl -iX POST -H "Content-Type: application/json" -d @d:\postRefrigerator002.json http://localhost:1026/v2/op/update

正常に終了すれば、以下の様な応答があります。
PS C:\Users\owner> curl -iX POST -H "Content-Type: application/json" -d @d:\postRefrigerator002.json http://localhost:1026/v2/op/update
HTTP/1.1 204 No Content
Connection: Keep-Alive
Fiware-Correlator: f060a5ba-baeb-11ec-9963-0242ac120003
Date: Wed, 13 Apr 2022 05:38:25 GMT

PS C:\Users\owner>

ちゃんと格納されているかどうか、GETしてみましょう。オプションにtype= Refrigeratorを指定して、他のEntityが出力されないようにします。

curl -X GET http://localhost:1026/v2/entities?type=Refrigerator

そうすると、以下の様に3件のEntityが表示されます。
PS C:\Users\owner> curl -X GET http://localhost:1026/v2/entities?type=Refrigerator
[{"id":"urn:ngsi-ld:Refrigerator:002-001","type":"Refrigerator","description":{"type":"Text","value":"店内で一番窓側に設置した冷蔵庫","metadata":{}},"name":{"type":"Text","value":"窓側","metadata":{}},"refStore":{"type":"Relationship","value":"urn:ngsi-ld:Store:002","metadata":{}},"temperature":{"type":"Integer","value":10,"metadata":{}}},{"id":"urn:ngsi-ld:Refrigerator:002-002","type":"Refrigerator","description":{"type":"Text","value":"店内で中央の冷蔵庫","metadata":{}},"name":{"type":"Text","value":"中央","metadata":{}},"refStore":{"type":"Relationship","value":"urn:ngsi-ld:Store:002","metadata":{}},"temperature":{"type":"Integer","value":11,"metadata":{}}},{"id":"urn:ngsi-ld:Refrigerator:002-003","type":"Refrigerator","description":{"type":"Text","value":"店内で一番奥に設置した冷蔵庫","metadata":{}},"name":{"type":"Text","value":"奥側","metadata":{}},"refStore":{"type":"Relationship","value":"urn:ngsi-ld:Store:002","metadata":{}},"temperature":{"type":"Integer","value":12,"metadata":{}}}]
PS C:\Users\owner>