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

Munu


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


Column
Link
用語集

Coppell

Technologies

 5. NGSI v2のAP 5.6.4-5.6.6節




5.6.4.type指定のフィルタリング
2022年4月11日
 既に説明しましたが、特定のtypeを指定することにより、検索結果を特定のtypeに限定することができます。この様に検索結果を限定することをフィルタリングと呼びます。既に説明した例ですが、Storeの entityだけを取り出すには、以下の様に指定します。

curl -G -X GET 'http://localhost:1026/v2/entities' -d 'type=Store' -d 'options=keyValues'

複数のtypeを指定する場合には、カンマを挟んで並べます。

curl -G -X GET 'http://localhost:1026/v2/entities' -d 'type=Store,Refrigerator' -d 'options=keyValues'
PS C:\Users\owner> curl -G -X GET 'http://localhost:1026/v2/entities' -d 'type=Store,Refrigerator' -d 'options=keyValues'
[{"id":"urn:ngsi-ld:Store:001","type":"Store","address":{"streetAddress":"長沼町202-5","addressLocality":"八王子市","addressRegion":"東京都","postalCode":"1920907"},"location":{"type":"Point","coordinates":[139.37158,35.64226]},"name":"ローソン八王子長沼町店"},{"id":"urn:ngsi-ld:Store:002","type":"Store","address":{"streetAddress":"吉浦潭鼓町1-1","addressLocality":"呉市","addressRegion":"広島県","postalCode":"7370843"},"category":"ConvenienceStore","description":"呉市吉浦の国道31号線沿いのコンビニエンスストア","location":{"type":"Point","coordinates":[132.5304138,34.2567817]},"name":"セブンイ レブン呉市吉浦店","openingHoursSpecification":{"opens":"00:00:00","closes":"23:59:00"},"refOffStreetParking":"urn:ngsi-ld:OffStreetParking:002","telephone":"+81823311458"}]
PS C:\Users\owner>



5.6.5.AttributeのValue指定のフィルタリング
2022-04-11/2023-11-12
 typeでもidでもないAttributeのValueを指定する場合には、"q="で条件を指定します。例えば、既に示した例では、nameを条件に特定のStoreのEntityを検索しました。ご覧の様に、Valueを示す等号は"=="で記述します。

curl -G -X GET 'http://localhost:1026/v2/entities' -d 'type=Store' -d 'q=name==%e3%83%ad%e3%83%bc%e3%82%bd%e3%83%b3%e5%85%ab%e7%8e%8b%e5%ad%90%e9%95%b7%e6%b2%bc%e7%94%ba%e5%ba%97' -d 'options=keyValues'

addressの様に構造を持Atributeの場合には、ピリオドを挟んで、"addoress.streetAddress"の様に指定します。例えば、長沼町202-5のStoreを検索するには、

curl -G -X GET 'http://localhost:1026/v2/entities' -d 'q=address.streetAddress==%e9%95%b7%e6%b2%bc%e7%94%ba%32%30%32%2d%35' -d 'options=keyValues'

とすると、以下のようなレスポンスが返ります。
PS C:\Users\owner> curl -G -X GET 'http://localhost:1026/v2/entities' -d 'q=address.streetAddress==%e9%95%b7%e6%b2%bc%e7%94%ba%32%30%32%2d%35' -d 'options=keyValues'
[{"id":"urn:ngsi-ld:Store:001","type":"Store","address":{"streetAddress":"長沼町202-5","addressLocality":"八王子市","addressRegion":"東京都","postalCode":"1920907"},"location":{"type":"Point","coordinates":[139.37158,35.64226]},"name":"ローソン八王子長沼町店"}]
PS C:\Users\owner>

尚、条件に指定する文字列が数字だけからなる文字列の場合、文字列をシングルクオートで囲む必要があります。その場合は、前記の'q=...'はシングルクォートではなく、ダブルクォートで囲んで"q=..."の様に記述しておく必要があります。例えば、StoreをpstalCodeで検索してみましょう。二回検索します。一回目はシングルクォートで囲まない場合、二回目がシングルクォートで囲む場合です。

curl -G -X GET 'http://localhost:1026/v2/entities' -d "q=address.postalCode==1920907" -d 'options=keyValues'
curl -G -X GET 'http://localhost:1026/v2/entities' -d "q=address.postalCode=='1920907'" -d 'options=keyValues'

すると、以下の様なレスポンスが返ります。
PS C:\Users\owner> curl -G -X GET 'http://localhost:1026/v2/entities' -d "q=address.postalCode==1920907" -d 'options=keyValues'
[]
PS C:\Users\owner> curl -G -X GET 'http://localhost:1026/v2/entities' -d "q=address.postalCode=='1920907'" -d 'options=keyValues'
[{"id":"urn:ngsi-ld:Store:001","type":"Store","address":{"streetAddress":"長沼町202-5","addressLocality":"八王子市","addressRegion":"東京都","postalCode":"1920907"},"location":{"type":"Point","coordinates":[139.371578,35.642221]},"name":"ローソン八王子長沼町店"}]
PS C:\Users\owner>

この様に、数字だけからなる文字列は明示的にシングルクォートで囲って文字列としないと、正しく検索されません。


5.6.6.Metadataを指定したフィルタリング
2022年4月11日
 MetadataのValueも同様に指定した検索が可能です。この場合は"q="の代わりに"mq="を使用します。今までMetadataを使ったEntityは作成していませんでしたので、まずはStore003としてMetadataがあるEntityを作ってみましょう。この例では、locationのmetadataとして"typeOf"を作り、locationが指す位置の意味として"ParkingEntrance"を設定しました。

{
   "id": "urn:ngsi-ld:Store:003",
   "type": "Store",
   "name": {
       "type": "Text",
       "value": "ファミリーマート日野北野街道店"
   },
   "address": {
       "type": "PostalAddress",
       "value": {
           "streetAddress": "平山4-1-33",
           "addressLocality": "日野市",
           "addressRegion": "東京都",
           "postalCode": "1910043"
       }
   },
   "openingHoursSpecification": {
       "type": "StructuredValue",
       "value": {
           "opens": "00:00:00",
           "closes": "23:59:00"
       }
   },
   "location": {
       "type": "geo:json",
       "value": {
           "type": "Point",
           "coordinates": [
               139.38879540047748,
               35.65005167131512
           ]
       },
       "metadata": {
           "typeOf": {
               "type": "Text",
               "value": "ParkingEntrance"
           }
       }
   },
   "telephone": {
       "type": "Text",
       "value": "+81823311458"
   },
   "category": {
       "type": "Text",
       "value": "ConvenienceStore"
   },
   "description": {
       "type": "Text",
       "value": "日野市平山の北野街道沿いのコンビニエンスストア"
   }
}

これを"postStore003.json"に格納して、以下のコマンドで格納します。

curl -iX POST --header "Content-Type: application/json" -d @d:\postStore003.json http://localhost:1026/v2/entities

これで準備が出来ましたので、metadata指定で読み出してみましょう。以下のコマンドを打ちます。

curl -G -X GET 'http://localhost:1026/v2/entities' -d 'type=Store' -d 'mq=location.typeOf==ParkingEntrance' -d 'options=keyValues'

そうすると、以下の様にStore003だけが返却されます。
PS C:\Users\owner> curl -G -X GET 'http://localhost:1026/v2/entities' -d 'type=Store' -d 'mq=location.typeOf==ParkingEntrance' -d 'options=keyValues'
[{"id":"urn:ngsi-ld:Store:003","type":"Store","address":{"streetAddress":"平山4-1-33","addressLocality":"日野市","addressRegion":"東京都","postalCode":"1910043"},"category":"ConvenienceStore","description":"日野市平山の北野街道沿いのコンビ ニエンスストア","location":{"type":"Point","coordinates":[139.3887954,35.650051671]},"name":"ファミリーマート日野北野街 道店","openingHoursSpecification":{"opens":"00:00:00","closes":"23:59:00"},"telephone":"+81823311458"}]
PS C:\Users\owner>