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を慣用的に使います。 |
|||||||||||||||||||
|
|||||||||||||||||||
ここで、一度に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> |