Loading md/annex-b.md +97 −35 Original line number Diff line number Diff line Loading @@ -76,10 +76,6 @@ Such definition has been tested using [i.19]. "@type": "@vocab" }, "attrs": "ngsi-ld:attrs", "avg": { "@id": "ngsi-ld:avg", "@container": "@list" }, "bbox": { "@container": "@list", "@id": "geojson:bbox" Loading Loading @@ -123,10 +119,6 @@ Such definition has been tested using [i.19]. }, "description": "http://purl.org/dc/terms/description", "detail": "ngsi-ld:detail", "distinctCount": { "@id": "ngsi-ld:distinctCount", "@container": "@list" }, "endAt": { "@id": "ngsi-ld:endAt", "@type": "DateTime" Loading Loading @@ -185,7 +177,17 @@ Such definition has been tested using [i.19]. "jsonldContext": "ngsi-ld:jsonldContext", "jsons": { "@id": "ngsi-ld:jsons", "@container": "@list", "@context": { "distinctCount": { "@id": "ngsi-ld:distinctCount", "@container": "@list" }, "totalCount": { "@id": "ngsi-ld:totalCount", "@container": "@list" } } }, "key": "ngsi-ld:hasKey", "lang": "ngsi-ld:lang", Loading @@ -195,8 +197,18 @@ Such definition has been tested using [i.19]. }, "languageMaps": { "@id": "ngsi-ld:hasLanguageMaps", "@container": "@list", "@context": { "distinctCount": { "@id": "ngsi-ld:distinctCount", "@container": "@list" }, "totalCount": { "@id": "ngsi-ld:totalCount", "@container": "@list" } } }, "langString": "http://www.w3.org/1999/02/22-rdf-syntax-ns#langString", "lastFailure": { "@id": "ngsi-ld:lastFailure", Loading @@ -220,14 +232,6 @@ Such definition has been tested using [i.19]. "location": "ngsi-ld:location", "management": "ngsi-ld:management", "managementInterval": "ngsi-ld:managementInterval", "max": { "@id": "ngsi-ld:max", "@container": "@list" }, "min": { "@id": "ngsi-ld:min", "@container": "@list" }, "mode": "ngsi-ld:mode", "modifiedAt": { "@id": "ngsi-ld:modifiedAt", Loading Loading @@ -265,11 +269,31 @@ Such definition has been tested using [i.19]. }, "objectLists": { "@id": "ngsi-ld:hasObjectLists", "@container": "@list", "@context": { "distinctCount": { "@id": "ngsi-ld:distinctCount", "@container": "@list" }, "totalCount": { "@id": "ngsi-ld:totalCount", "@container": "@list" } } }, "objects": { "@id": "ngsi-ld:hasObjects", "@container": "@list", "@context": { "distinctCount": { "@id": "ngsi-ld:distinctCount", "@container": "@list" }, "totalCount": { "@id": "ngsi-ld:totalCount", "@container": "@list" } } }, "objectType": { "@id": "ngsi-ld:hasObjectType", Loading Loading @@ -377,14 +401,6 @@ Such definition has been tested using [i.19]. "@id": "ngsi-ld:success", "@type": "@id" }, "sum": { "@id": "ngsi-ld:sum", "@container": "@list" }, "sumsq": { "@id": "ngsi-ld:sumsq", "@container": "@list" }, "sysAttrs": "ngsi-ld:sysAttrs", "temporalQ": "ngsi-ld:temporalQ", "tenant": { Loading @@ -403,10 +419,6 @@ Such definition has been tested using [i.19]. "timesFailed": "ngsi-ld:timesFailed", "timesSent": "ngsi-ld:timesSent", "title": "http://purl.org/dc/terms/title", "totalCount": { "@id": "ngsi-ld:totalCount", "@container": "@list" }, "triggerReason": "ngsi-ld:triggerReason", "typeList": { "@id": "ngsi-ld:typeList", Loading @@ -431,12 +443,52 @@ Such definition has been tested using [i.19]. }, "valueLists": { "@id": "ngsi-ld:hasValueLists", "@container": "@list", "@context": { "distinctCount": { "@id": "ngsi-ld:distinctCount", "@container": "@list" }, "totalCount": { "@id": "ngsi-ld:totalCount", "@container": "@list" } } }, "values": { "@id": "ngsi-ld:hasValues", "@container": "@list", "@context": { "avg": { "@id": "ngsi-ld:avg", "@container": "@list" }, "distinctCount": { "@id": "ngsi-ld:distinctCount", "@container": "@list" }, "max": { "@id": "ngsi-ld:max", "@container": "@list" }, "min": { "@id": "ngsi-ld:min", "@container": "@list" }, "sum": { "@id": "ngsi-ld:sum", "@container": "@list" }, "sumsq": { "@id": "ngsi-ld:sumsq", "@container": "@list" }, "totalCount": { "@id": "ngsi-ld:totalCount", "@container": "@list" } } }, "valueType": { "@id": "ngsi-ld:hasValueType", "@type": "@vocab" Loading @@ -447,8 +499,18 @@ Such definition has been tested using [i.19]. }, "vocabs": { "@id": "ngsi-ld:hasVocabs", "@container": "@list", "@context": { "distinctCount": { "@id": "ngsi-ld:distinctCount", "@container": "@list" }, "totalCount": { "@id": "ngsi-ld:totalCount", "@container": "@list" } } }, "watchedAttributes": { "@id": "ngsi-ld:watchedAttributes", "@type": "@vocab" Loading md/annex-c.md +150 −48 Original line number Diff line number Diff line Loading @@ -1106,10 +1106,10 @@ level of the graph only. Below is an example, where temporal evolution of the speed of the car is provided by two different sources. As both may be relevant at the same time, there are two individual attribute instances for speed; each is identified by a _`datasetId`_ and both instances are represented in an array. The combination of an Attribute's _`datasetId`_ and the _`instanceId`_ associated to each value enables modification of a particular instance value without affecting instances from other sources. _`datasetId`_ and both instances are represented in an array. The combination of an Attribute's _`datasetId`_ and the _`instanceId`_ associated to each value enables modification of a particular instance value without affecting instances from other sources. ```json { Loading Loading @@ -1228,40 +1228,20 @@ individual attribute instances for speed; each is identified by a _`datasetId`_. "speed": [ { "type": "Property", "avg": [ [55.5, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"] ], "max": [ [56, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"] ], "min": [ [55, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"] ], "distinctCount": [ [2, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"] ], "totalCount": [ [2, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"] ], "avg": [[55.5, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"]], "max": [[56, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"]], "min": [[55, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"]], "distinctCount": [[2, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"]], "totalCount": [[2, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"]], "datasetId": "urn:ngsi-ld:Property:speedometerA4567-speed" }, { "type": "Property", "avg": [ [54.5, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"] ], "max": [ [54.5, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"] ], "min": [ [54.5, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"] ], "distinctCount": [ [1, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"] ], "totalCount": [ [2, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"] ], "avg": [[54.5, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"]], "max": [[54.5, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"]], "min": [[54.5, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"]], "distinctCount": [[1, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"]], "totalCount": [[2, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"]], "datasetId": "urn:ngsi-ld:Property:gpsBxyz123-speed" } ], Loading Loading @@ -2168,7 +2148,7 @@ been compacted, as the Core _`@context`_ is always considered to be implicitly present if not specified explicitly (and that is why it is included in the JSON-LD response, as mandated by the specification). ## C.7 Link header utilization clarifications ## C.7 JSON-LD Link header utilization clarifications The JSON-LD Specification [n.8] states clearly that **only one HTTP Link header** with the link relationship Loading @@ -2178,8 +2158,8 @@ using the NGSI-LD API. The main implication is that if the _`@context`_ is a compound one, i.e. an _`@context`_ which references multiple individual _`@context`_, served by resources behind different URIs, then a **wrapper** _`@context`_ has to be created and hosted. The final aim is that only one _`@context`_ is referenced from the JSON-LD Link header. This can be illustrated with an example: _`@context`_ is referenced from the JSON-LD [Link]{.HTML-Code} header. This can be illustrated with an example: Imagine that it is desired to create an Entity providing _`@context`_ terms which are defined in two different JSON-LD _`@context`_ resources: Loading @@ -2187,8 +2167,9 @@ which are defined in two different JSON-LD _`@context`_ resources: - _`http://example.org/vehicle/v1/vehicle-context.jsonld`_ - _`https://schema.org`_ If a developer wants to reference these two _`@context`_ resources from a Link header, a wrapper _`@context`_ can be easily created as follows: If a developer wants to reference these two _`@context`_ resources from a JSON-LD [Link]{.HTML-Code} header, a wrapper _`@context`_ can be easily created as follows: ```json { Loading @@ -2200,12 +2181,13 @@ header, a wrapper _`@context`_ can be easily created as follows: } ``` As such wrapper _`@context`_ needs to be referenced from a Link header by using a URI, then it will have to be hosted at some place on the Web. Usually, developers will host _`@context`_ using popular and simple solutions such as GitHub or GitLab pages. As a result, developers will be able to use _`@context`_ in queries or when using ["application/json"]{.HTML-Code} as main content type managed by their applications. As such wrapper _`@context`_ needs to be referenced from a JSON-LD [Link]{.HTML-Code} header by using a URI, then it will have to be hosted at some place on the Web. Usually, developers will host _`@context`_ using popular and simple solutions such as GitHub or GitLab pages. As a result, developers will be able to use _`@context`_ in queries or when using ["application/json"]{.HTML-Code} as main content type managed by their applications. It is a **good practice to include the Core** _`@context`_ in the wrapper _`@context`_ so it can be used, off-the-shelf, by external JSON-LD processing Loading Loading @@ -2311,8 +2293,8 @@ With a response as shown: <!-- prettier-ignore-end --> Observe that in this case the broker is responding with the same wrapper _`@context`_ in the Link header of the HTTP Response or within the JSON-LD response payload body (when MIME type accepted is _`@context`_ in the JSON-LD [Link]{.HTML-Code} header of the HTTP Response or within the JSON-LD response payload body (when MIME type accepted is ["application/ld+json"]{.HTML-Code}). However, that could not be always the case, as there could be situations where the broker could need to provide a wrapper _`@context`_ hosted by itself, for instance, when there are inline Loading Loading @@ -2365,7 +2347,7 @@ With a response as shown: ``` Since the core _`@context`_ was omitted from the request, the Link header refers Since the core _`@context`_ was omitted from the request, the JSON-LD [Link]{.HTML-Code} header refers to a [Context Broker]{.HTML-Keyboard} endpoint _`/ngsi-ld/v1/jsonldContexts/http%3A%2F%2Fexample.org%2Fngsi-ld%2Flatest%2Fvehicle.jsonld?core=1.9`_ which returns the following JSON-LD _`@context`_ referencing two files: Loading Loading @@ -2576,3 +2558,123 @@ Entity of type "Store" with two Properties. The "address" Property is digitally >>> <!-- prettier-ignore-end --> ## C.11 Scope Queries As specified in Clause 7.2.5, the Scope Query language is intended to select only those Entities that are within the specified Scope(s). Scopes are specified as a disjunction of elements, where each element can either directly be a Scope or a conjunction of multiple Scopes. <!-- prettier-ignore-start --> >>> [!tip] EXAMPLE: Give back all the Entities of type ["OffStreetParking"]{.HTML-Code} that are within the Scope [/Madrid/Centro]{.HTML-Code} or [/Madrid/Cortes]{.HTML-Code}. **GET** [/ngsi-ld/v1/entities/?type=OffStreetParking&scopeQ="/Madrid/Centro,/Madrid/Cortes"]{.HTML-Variable} **Request Headers** - [Accept: application/ld+json]{.HTML-Code} - [Link: <​http://example.org/ngsi-ld/latest/parking.jsonld>; rel="http://www.w3.org/ns/json-ld#context"; type="application/ld+json"]{.HTML-Code} With a response as shown: **Status Code:** 200 OK **Response Headers** - [Content-Type: application/ld+json]{.HTML-Code} - [Content-Length: 1784]{.HTML-Code} **Response Body** ```json [ { "id": "urn:ngsi-ld:OffStreetParking:Downtown1", "type": "OffStreetParking", "scope": "/Madrid/Centro", "name": { "type": "Property", "value": "Downtown One" }, "availableSpotNumber": { "type": "Property", "value": 121, "observedAt": "2017-07-29T12:05:02Z", "reliability": { "type": "Property", "value": 0.7 }, "providedBy": { "type": "Relationship", "object": "urn:ngsi-ld:Camera:C1" } }, "totalSpotNumber": { "type": "Property", "value": 200 }, "location": { "type": "GeoProperty", "value": { "type": "Point", "coordinates": [-8.5, 41.2] } }, "@context": [ "http://example.org/ngsi-ld/latest/parking.jsonld", "https://uri.etsi.org/ngsi-ld/v1/ngsi-ld-core-context-v1.9.jsonld" ] }, { "id": "urn:ngsi-ld:OffStreetParking:Corte4", "type": "OffStreetParking", "scope": ["/Madrid/Cortes", "/Company894/UnitC"], "name": { "type": "Property", "value": "Corte4" }, "availableSpotNumber": { "type": "Property", "value": 121, "observedAt": "2017-07-29T12:05:02Z", "reliability": { "type": "Property", "value": 0.7 }, "providedBy": { "type": "Relationship", "object": "urn:ngsi-ld:Camera:C1" } }, "totalSpotNumber": { "type": "Property", "value": 100 }, "location": { "type": "GeoProperty", "value": { "type": "Point", "coordinates": [-8.6, 41.3] } }, "@context": [ "http://example.org/ngsi-ld/latest/parking.jsonld", "https://uri.etsi.org/ngsi-ld/v1/ngsi-ld-core-context-v1.9.jsonld" ] } ] ``` >>> <!-- prettier-ignore-end --> md/clause-10.md +24 −19 Original line number Diff line number Diff line Loading @@ -1754,20 +1754,23 @@ Figure: Retrieve Entity use case Entity as mandated by clause 5.2.6.4.1 and containing only the Attributes requested (if present). - If the Prefer Header [n.14] is set to - If the [Prefer]{.HTML-Code} Header [n.14] is set to ["ngsi-ld=<​version>"]{.HTML-Code} then the ContextBroker shall endeavour to amend the JSON-LD object to conform to the specified version of the NGSI-LD specification as mandated in clause 9.5.3, and return a Preference-Applied Header set to [Preference-Applied]{.HTML-Code} Header set to ["ngsi-ld=<​conformant-version>"]{.HTML-Code} in the response. - If the Accept Header is set to ["application/geo+json"]{.HTML-Code}, a GeoJSON _Feature_ object representing the entity as mandated by clause 5.2.6.11.1 and containing only the Attributes requested (if present): - If the Prefer Header is omitted or set to ["body=ld+json"]{.HTML-Code} then the _Feature_ object will also contain an _`@context`_ field. - If the Prefer Header is set to ["body=json"]{.HTML-Code} the _`@context`_ is set as a Link Header and removed from the Feature object. - If the [Accept]{.HTML-Code} Header is set to ["application/geo+json"]{.HTML-Code}, a GeoJSON _Feature_ object representing the entity as mandated by clause 5.2.6.11.1 and containing only the Attributes requested (if present): - If the [Prefer]{.HTML-Code} Header is omitted or set to ["body=ld+json"]{.HTML-Code} then the _Feature_ object will also contain an _`@context`_ field. - If the [Prefer]{.HTML-Code} Header is set to ["body=json"]{.HTML-Code} the _`@context`_ is set as a [Link]{.HTML-Code} Header and removed from the Feature object. #### 10.4.2.5 Output data Loading Loading @@ -2089,21 +2092,23 @@ If the execution of the operation is limited to the local scope (see clause the Entities as mandated by clause 5.2.6.4.1 and containing only the Attributes requested (if present). - If the Prefer Header [n.14] is set to - If the [Prefer]{.HTML-Code} Header [n.14] is set to ["ngsi-ld=<​version>"]{.HTML-Code} then the ContextBroker shall endeavour to amend the elements of the JSON-LD array to conform to the specified version of the NGSI-LD specification as mandated in clause 9.5.3, and return a Preference-Applied Header set to and return a [Preference-Applied]{.HTML-Code} Header set to ["ngsi-ld=<​conformant-version>"]{.HTML-Code} in the response. - If the Accept Header is set to ["application/geo+json",]{.HTML-Code} the response shall be a GeoJSON _FeatureCollection_ as mandated by clause 5.2.6.11.2, with each _Feature_ within the _FeatureCollection_ containing only the Attributes requested (if present): - If the Prefer Header is omitted or set to ["body=ld+json"]{.HTML-Code} then the _FeatureCollection_ will also contain an _`@context`_ field. - If the Prefer Header is set to ["body=json]{.HTML-Code}" the _`@context`_ is sent as a Link Header and removed from the _FeatureCollection_ object. - If the [Prefer]{.HTML-Code} Header is omitted or set to ["body=ld+json"]{.HTML-Code} then the _FeatureCollection_ will also contain an _`@context`_ field. - If the [Prefer]{.HTML-Code} Header is set to ["body=json]{.HTML-Code}" the _`@context`_ is sent as a [Link]{.HTML-Code} Header and removed from the _FeatureCollection_ object. #### 10.4.3.5 Output data Loading md/clause-11.md +23 −13 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ Implementations shall exhibit the following behaviour: - If an **exclusive** [Context Source Registration]{.HTML-Keyboard} already exists for this Entity id (URI), Attributes from matching input data are forwarded for remote processing: - For matching Registrations where the "Create or Update (Upsert) Temporal Evolution of an Entity" operation is supported, the operation is forwarded to the registration endpoint. If the endpoint then raises an error, this Loading @@ -72,6 +73,7 @@ Implementations shall exhibit the following behaviour: - If any **redirect** [Context Source Registrations]{.HTML-Keyboard} exist that match against the input data, that input data is forwarded for remote processing by one or more matching endpoints: - For matching Registrations where the "Create or Update (Upsert) Temporal Evolution of an Entity" operation is supported, matching input data is forwarded. If any such endpoint then raises an error, this shall result in Loading Loading @@ -154,6 +156,7 @@ The following behaviour shall be exhibited by compliant implementations: - If an **exclusive** [Context Source Registration]{.HTML-Keyboard} matches against the input data, the Attributes from matching input data are forwarded for remote processing. For each matching registration: - If the "Add Attributes to Temporal Evolution of an Entity" operation is supported by the matched registration, matching input data is forwarded to the Registration endpoint. Loading @@ -164,12 +167,13 @@ The following behaviour shall be exhibited by compliant implementations: parts of it succeeded. The Attributes matching the **exclusive** [Context Source Registration]{.HTML-Keyboard} are then removed from the EntityTemporal Fragment and not processed further. Registration]{.HTML-Keyboard} are then removed from the EntityTemporal Fragment and not processed further. - If a **redirect** [Context Source Registration]{.HTML-Keyboard} matches against the input data, the Attributes from matching input data are forwarded for remote processing. For each matching registration: - If a **redirect** [Context Source Registration]{.HTML-Keyboard} matches against the input data, the Attributes from matching input data are forwarded for remote processing. For each matching registration: - If the "Add Attributes to Temporal Evolution of an Entity" operation is supported by the matched registration, matching input data is forwarded to the Registration endpoint. Loading @@ -180,8 +184,8 @@ The following behaviour shall be exhibited by compliant implementations: parts of it succeeded. The Attributes matching the **redirect** [Context Source Registration]{.HTML-Keyboard} are then removed from the EntityTemporal Fragment and not processed further. Registration]{.HTML-Keyboard} are then removed from the EntityTemporal Fragment and not processed further. - For any **inclusive** [Context Source Registrations]{.HTML-Keyboard} that match against the remaining input data, that input data is also forwarded for Loading @@ -189,8 +193,8 @@ The following behaviour shall be exhibited by compliant implementations: - If the target [Temporal Evolution of an Entity]{.HTML-Keyboard} exists locally and matches against the remaining input data, implementations shall do the following: - For each Attribute instance included by the EntityTemporal Fragment at root level: - For each Attribute instance included by the EntityTemporal Fragment at root level: - The Attribute (considering term expansion rules as mandated by Clause+++clause-8+++root.2.4) instance(s) shall be added to the target [Temporal Evolution of an Entity]{.HTML-Keyboard}. Loading Loading @@ -253,6 +257,7 @@ Figure: Delete Attribute from Temporal Evolution of an Entity use case - If an **exclusive** or **redirect** [Context Source Registration]{.HTML-Keyboard} matches against the input data, the input data is forwarded. For each matching registration: - If the "Delete Attribute from Temporal Evolution of an Entity" operation is supported by the matched registration, matching input data is forwarded to the Registration endpoint. Loading Loading @@ -342,6 +347,7 @@ Figure: Modify Attribute Instance in Temporal Evolution of an Entity use case - If an **exclusive** or **redirect** [Context Source Registration]{.HTML-Keyboard} matches against the input data, the input data is forwarded. For each matching registration: - If the "Modify Attribute instance in Temporal Evolution of an Entity" operation is supported by the matched registration, matching input data is forwarded to the Registration endpoint. Loading Loading @@ -428,6 +434,7 @@ Figure: Delete Attribute Instance from Temporal Evolution of an Entity use case - If an **exclusive** or **redirect** [Context Source Registration]{.HTML-Keyboard} matches against the input data, the input data is forwarded. For each matching registration: - If the "Delete Attribute instance from Temporal Evolution of an Entity" operation is supported by the matched registration, matching input data is forwarded to the Registration endpoint. Loading Loading @@ -500,6 +507,7 @@ Figure: Delete Temporal Evolution of an Entity use case - If an **exclusive** or **redirect** [Context Source Registration]{.HTML-Keyboard} matches against the input data, the input data is forwarded. For each matching registration: - If the "Delete Temporal Evolution of Entity" operation is supported by the matched registration, matching input data is forwarded to the Registration endpoint. Loading Loading @@ -799,12 +807,14 @@ Clause+++clause-8+++root.6 ), no further restrictions have to be provided. temporal property (by default _observedAt_) within the concerned temporal interval. - Otherwise, - Let S be the set of selected Entities i.e. the query result set. - If split entities flag is explicitly set to true or, if not explicitly set, the default setting of the deployment allows split entities, and local scope is not specified, implementations shall run a query that shall return an Entity Array containing all the Entities found locally, that meet all of the following conditions (given the respective parameter is provided): - If id(s) is provided, keep in S only those Entities whose id is equivalent to any of the id(s) passed as a parameter. - If an id pattern is provided, keep in S only those Entities whose id Loading Loading @@ -854,8 +864,8 @@ Clause+++clause-8+++root.6 ), no further restrictions have to be provided. - If no geoquery is provided, then S3 is equal to S2. - If the Scope query is present, from S3, select those Entities whose Entity Scope instances match the Scope query (as mandated by Clause+++clause-7+++root.2.5, for an example see [i.16] ~annex A.16). Let S4 be the new subset. Clause+++clause-7+++root.2.5, for an example see Annex C.11). Let S4 be the new subset. - If no Scope query is provided, then S4 is equal to S3. - If the ContextBroker implementation supports the use of [Entity Loading Loading @@ -914,8 +924,8 @@ Clause+++clause-8+++root.6 ), no further restrictions have to be provided. - If no geoquery is provided, then S6 is equal to S5. - If the Scope query is present, from S6, select those Entities whose Entity Scope instances match the Scope query (as mandated by Clause+++clause-7+++root.2.5, for an example see [i.16] ~annex A.16). Let S7 be the new subset. Clause+++clause-7+++root.2.5, for an example see Annex C.11). Let S7 be the new subset. - If no Scope query is provided, then S7 is equal to S6. - Otherwise S7 is equal to S4. - If a _`datasetId`_ parameter is provided, from S7, for all Entities, filter Loading md/clause-12.md +20 −4 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
md/annex-b.md +97 −35 Original line number Diff line number Diff line Loading @@ -76,10 +76,6 @@ Such definition has been tested using [i.19]. "@type": "@vocab" }, "attrs": "ngsi-ld:attrs", "avg": { "@id": "ngsi-ld:avg", "@container": "@list" }, "bbox": { "@container": "@list", "@id": "geojson:bbox" Loading Loading @@ -123,10 +119,6 @@ Such definition has been tested using [i.19]. }, "description": "http://purl.org/dc/terms/description", "detail": "ngsi-ld:detail", "distinctCount": { "@id": "ngsi-ld:distinctCount", "@container": "@list" }, "endAt": { "@id": "ngsi-ld:endAt", "@type": "DateTime" Loading Loading @@ -185,7 +177,17 @@ Such definition has been tested using [i.19]. "jsonldContext": "ngsi-ld:jsonldContext", "jsons": { "@id": "ngsi-ld:jsons", "@container": "@list", "@context": { "distinctCount": { "@id": "ngsi-ld:distinctCount", "@container": "@list" }, "totalCount": { "@id": "ngsi-ld:totalCount", "@container": "@list" } } }, "key": "ngsi-ld:hasKey", "lang": "ngsi-ld:lang", Loading @@ -195,8 +197,18 @@ Such definition has been tested using [i.19]. }, "languageMaps": { "@id": "ngsi-ld:hasLanguageMaps", "@container": "@list", "@context": { "distinctCount": { "@id": "ngsi-ld:distinctCount", "@container": "@list" }, "totalCount": { "@id": "ngsi-ld:totalCount", "@container": "@list" } } }, "langString": "http://www.w3.org/1999/02/22-rdf-syntax-ns#langString", "lastFailure": { "@id": "ngsi-ld:lastFailure", Loading @@ -220,14 +232,6 @@ Such definition has been tested using [i.19]. "location": "ngsi-ld:location", "management": "ngsi-ld:management", "managementInterval": "ngsi-ld:managementInterval", "max": { "@id": "ngsi-ld:max", "@container": "@list" }, "min": { "@id": "ngsi-ld:min", "@container": "@list" }, "mode": "ngsi-ld:mode", "modifiedAt": { "@id": "ngsi-ld:modifiedAt", Loading Loading @@ -265,11 +269,31 @@ Such definition has been tested using [i.19]. }, "objectLists": { "@id": "ngsi-ld:hasObjectLists", "@container": "@list", "@context": { "distinctCount": { "@id": "ngsi-ld:distinctCount", "@container": "@list" }, "totalCount": { "@id": "ngsi-ld:totalCount", "@container": "@list" } } }, "objects": { "@id": "ngsi-ld:hasObjects", "@container": "@list", "@context": { "distinctCount": { "@id": "ngsi-ld:distinctCount", "@container": "@list" }, "totalCount": { "@id": "ngsi-ld:totalCount", "@container": "@list" } } }, "objectType": { "@id": "ngsi-ld:hasObjectType", Loading Loading @@ -377,14 +401,6 @@ Such definition has been tested using [i.19]. "@id": "ngsi-ld:success", "@type": "@id" }, "sum": { "@id": "ngsi-ld:sum", "@container": "@list" }, "sumsq": { "@id": "ngsi-ld:sumsq", "@container": "@list" }, "sysAttrs": "ngsi-ld:sysAttrs", "temporalQ": "ngsi-ld:temporalQ", "tenant": { Loading @@ -403,10 +419,6 @@ Such definition has been tested using [i.19]. "timesFailed": "ngsi-ld:timesFailed", "timesSent": "ngsi-ld:timesSent", "title": "http://purl.org/dc/terms/title", "totalCount": { "@id": "ngsi-ld:totalCount", "@container": "@list" }, "triggerReason": "ngsi-ld:triggerReason", "typeList": { "@id": "ngsi-ld:typeList", Loading @@ -431,12 +443,52 @@ Such definition has been tested using [i.19]. }, "valueLists": { "@id": "ngsi-ld:hasValueLists", "@container": "@list", "@context": { "distinctCount": { "@id": "ngsi-ld:distinctCount", "@container": "@list" }, "totalCount": { "@id": "ngsi-ld:totalCount", "@container": "@list" } } }, "values": { "@id": "ngsi-ld:hasValues", "@container": "@list", "@context": { "avg": { "@id": "ngsi-ld:avg", "@container": "@list" }, "distinctCount": { "@id": "ngsi-ld:distinctCount", "@container": "@list" }, "max": { "@id": "ngsi-ld:max", "@container": "@list" }, "min": { "@id": "ngsi-ld:min", "@container": "@list" }, "sum": { "@id": "ngsi-ld:sum", "@container": "@list" }, "sumsq": { "@id": "ngsi-ld:sumsq", "@container": "@list" }, "totalCount": { "@id": "ngsi-ld:totalCount", "@container": "@list" } } }, "valueType": { "@id": "ngsi-ld:hasValueType", "@type": "@vocab" Loading @@ -447,8 +499,18 @@ Such definition has been tested using [i.19]. }, "vocabs": { "@id": "ngsi-ld:hasVocabs", "@container": "@list", "@context": { "distinctCount": { "@id": "ngsi-ld:distinctCount", "@container": "@list" }, "totalCount": { "@id": "ngsi-ld:totalCount", "@container": "@list" } } }, "watchedAttributes": { "@id": "ngsi-ld:watchedAttributes", "@type": "@vocab" Loading
md/annex-c.md +150 −48 Original line number Diff line number Diff line Loading @@ -1106,10 +1106,10 @@ level of the graph only. Below is an example, where temporal evolution of the speed of the car is provided by two different sources. As both may be relevant at the same time, there are two individual attribute instances for speed; each is identified by a _`datasetId`_ and both instances are represented in an array. The combination of an Attribute's _`datasetId`_ and the _`instanceId`_ associated to each value enables modification of a particular instance value without affecting instances from other sources. _`datasetId`_ and both instances are represented in an array. The combination of an Attribute's _`datasetId`_ and the _`instanceId`_ associated to each value enables modification of a particular instance value without affecting instances from other sources. ```json { Loading Loading @@ -1228,40 +1228,20 @@ individual attribute instances for speed; each is identified by a _`datasetId`_. "speed": [ { "type": "Property", "avg": [ [55.5, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"] ], "max": [ [56, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"] ], "min": [ [55, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"] ], "distinctCount": [ [2, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"] ], "totalCount": [ [2, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"] ], "avg": [[55.5, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"]], "max": [[56, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"]], "min": [[55, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"]], "distinctCount": [[2, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"]], "totalCount": [[2, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"]], "datasetId": "urn:ngsi-ld:Property:speedometerA4567-speed" }, { "type": "Property", "avg": [ [54.5, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"] ], "max": [ [54.5, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"] ], "min": [ [54.5, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"] ], "distinctCount": [ [1, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"] ], "totalCount": [ [2, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"] ], "avg": [[54.5, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"]], "max": [[54.5, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"]], "min": [[54.5, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"]], "distinctCount": [[1, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"]], "totalCount": [[2, "2022-08-09T18:25:00Z", "2022-08-09T18:30:00Z"]], "datasetId": "urn:ngsi-ld:Property:gpsBxyz123-speed" } ], Loading Loading @@ -2168,7 +2148,7 @@ been compacted, as the Core _`@context`_ is always considered to be implicitly present if not specified explicitly (and that is why it is included in the JSON-LD response, as mandated by the specification). ## C.7 Link header utilization clarifications ## C.7 JSON-LD Link header utilization clarifications The JSON-LD Specification [n.8] states clearly that **only one HTTP Link header** with the link relationship Loading @@ -2178,8 +2158,8 @@ using the NGSI-LD API. The main implication is that if the _`@context`_ is a compound one, i.e. an _`@context`_ which references multiple individual _`@context`_, served by resources behind different URIs, then a **wrapper** _`@context`_ has to be created and hosted. The final aim is that only one _`@context`_ is referenced from the JSON-LD Link header. This can be illustrated with an example: _`@context`_ is referenced from the JSON-LD [Link]{.HTML-Code} header. This can be illustrated with an example: Imagine that it is desired to create an Entity providing _`@context`_ terms which are defined in two different JSON-LD _`@context`_ resources: Loading @@ -2187,8 +2167,9 @@ which are defined in two different JSON-LD _`@context`_ resources: - _`http://example.org/vehicle/v1/vehicle-context.jsonld`_ - _`https://schema.org`_ If a developer wants to reference these two _`@context`_ resources from a Link header, a wrapper _`@context`_ can be easily created as follows: If a developer wants to reference these two _`@context`_ resources from a JSON-LD [Link]{.HTML-Code} header, a wrapper _`@context`_ can be easily created as follows: ```json { Loading @@ -2200,12 +2181,13 @@ header, a wrapper _`@context`_ can be easily created as follows: } ``` As such wrapper _`@context`_ needs to be referenced from a Link header by using a URI, then it will have to be hosted at some place on the Web. Usually, developers will host _`@context`_ using popular and simple solutions such as GitHub or GitLab pages. As a result, developers will be able to use _`@context`_ in queries or when using ["application/json"]{.HTML-Code} as main content type managed by their applications. As such wrapper _`@context`_ needs to be referenced from a JSON-LD [Link]{.HTML-Code} header by using a URI, then it will have to be hosted at some place on the Web. Usually, developers will host _`@context`_ using popular and simple solutions such as GitHub or GitLab pages. As a result, developers will be able to use _`@context`_ in queries or when using ["application/json"]{.HTML-Code} as main content type managed by their applications. It is a **good practice to include the Core** _`@context`_ in the wrapper _`@context`_ so it can be used, off-the-shelf, by external JSON-LD processing Loading Loading @@ -2311,8 +2293,8 @@ With a response as shown: <!-- prettier-ignore-end --> Observe that in this case the broker is responding with the same wrapper _`@context`_ in the Link header of the HTTP Response or within the JSON-LD response payload body (when MIME type accepted is _`@context`_ in the JSON-LD [Link]{.HTML-Code} header of the HTTP Response or within the JSON-LD response payload body (when MIME type accepted is ["application/ld+json"]{.HTML-Code}). However, that could not be always the case, as there could be situations where the broker could need to provide a wrapper _`@context`_ hosted by itself, for instance, when there are inline Loading Loading @@ -2365,7 +2347,7 @@ With a response as shown: ``` Since the core _`@context`_ was omitted from the request, the Link header refers Since the core _`@context`_ was omitted from the request, the JSON-LD [Link]{.HTML-Code} header refers to a [Context Broker]{.HTML-Keyboard} endpoint _`/ngsi-ld/v1/jsonldContexts/http%3A%2F%2Fexample.org%2Fngsi-ld%2Flatest%2Fvehicle.jsonld?core=1.9`_ which returns the following JSON-LD _`@context`_ referencing two files: Loading Loading @@ -2576,3 +2558,123 @@ Entity of type "Store" with two Properties. The "address" Property is digitally >>> <!-- prettier-ignore-end --> ## C.11 Scope Queries As specified in Clause 7.2.5, the Scope Query language is intended to select only those Entities that are within the specified Scope(s). Scopes are specified as a disjunction of elements, where each element can either directly be a Scope or a conjunction of multiple Scopes. <!-- prettier-ignore-start --> >>> [!tip] EXAMPLE: Give back all the Entities of type ["OffStreetParking"]{.HTML-Code} that are within the Scope [/Madrid/Centro]{.HTML-Code} or [/Madrid/Cortes]{.HTML-Code}. **GET** [/ngsi-ld/v1/entities/?type=OffStreetParking&scopeQ="/Madrid/Centro,/Madrid/Cortes"]{.HTML-Variable} **Request Headers** - [Accept: application/ld+json]{.HTML-Code} - [Link: <​http://example.org/ngsi-ld/latest/parking.jsonld>; rel="http://www.w3.org/ns/json-ld#context"; type="application/ld+json"]{.HTML-Code} With a response as shown: **Status Code:** 200 OK **Response Headers** - [Content-Type: application/ld+json]{.HTML-Code} - [Content-Length: 1784]{.HTML-Code} **Response Body** ```json [ { "id": "urn:ngsi-ld:OffStreetParking:Downtown1", "type": "OffStreetParking", "scope": "/Madrid/Centro", "name": { "type": "Property", "value": "Downtown One" }, "availableSpotNumber": { "type": "Property", "value": 121, "observedAt": "2017-07-29T12:05:02Z", "reliability": { "type": "Property", "value": 0.7 }, "providedBy": { "type": "Relationship", "object": "urn:ngsi-ld:Camera:C1" } }, "totalSpotNumber": { "type": "Property", "value": 200 }, "location": { "type": "GeoProperty", "value": { "type": "Point", "coordinates": [-8.5, 41.2] } }, "@context": [ "http://example.org/ngsi-ld/latest/parking.jsonld", "https://uri.etsi.org/ngsi-ld/v1/ngsi-ld-core-context-v1.9.jsonld" ] }, { "id": "urn:ngsi-ld:OffStreetParking:Corte4", "type": "OffStreetParking", "scope": ["/Madrid/Cortes", "/Company894/UnitC"], "name": { "type": "Property", "value": "Corte4" }, "availableSpotNumber": { "type": "Property", "value": 121, "observedAt": "2017-07-29T12:05:02Z", "reliability": { "type": "Property", "value": 0.7 }, "providedBy": { "type": "Relationship", "object": "urn:ngsi-ld:Camera:C1" } }, "totalSpotNumber": { "type": "Property", "value": 100 }, "location": { "type": "GeoProperty", "value": { "type": "Point", "coordinates": [-8.6, 41.3] } }, "@context": [ "http://example.org/ngsi-ld/latest/parking.jsonld", "https://uri.etsi.org/ngsi-ld/v1/ngsi-ld-core-context-v1.9.jsonld" ] } ] ``` >>> <!-- prettier-ignore-end -->
md/clause-10.md +24 −19 Original line number Diff line number Diff line Loading @@ -1754,20 +1754,23 @@ Figure: Retrieve Entity use case Entity as mandated by clause 5.2.6.4.1 and containing only the Attributes requested (if present). - If the Prefer Header [n.14] is set to - If the [Prefer]{.HTML-Code} Header [n.14] is set to ["ngsi-ld=<​version>"]{.HTML-Code} then the ContextBroker shall endeavour to amend the JSON-LD object to conform to the specified version of the NGSI-LD specification as mandated in clause 9.5.3, and return a Preference-Applied Header set to [Preference-Applied]{.HTML-Code} Header set to ["ngsi-ld=<​conformant-version>"]{.HTML-Code} in the response. - If the Accept Header is set to ["application/geo+json"]{.HTML-Code}, a GeoJSON _Feature_ object representing the entity as mandated by clause 5.2.6.11.1 and containing only the Attributes requested (if present): - If the Prefer Header is omitted or set to ["body=ld+json"]{.HTML-Code} then the _Feature_ object will also contain an _`@context`_ field. - If the Prefer Header is set to ["body=json"]{.HTML-Code} the _`@context`_ is set as a Link Header and removed from the Feature object. - If the [Accept]{.HTML-Code} Header is set to ["application/geo+json"]{.HTML-Code}, a GeoJSON _Feature_ object representing the entity as mandated by clause 5.2.6.11.1 and containing only the Attributes requested (if present): - If the [Prefer]{.HTML-Code} Header is omitted or set to ["body=ld+json"]{.HTML-Code} then the _Feature_ object will also contain an _`@context`_ field. - If the [Prefer]{.HTML-Code} Header is set to ["body=json"]{.HTML-Code} the _`@context`_ is set as a [Link]{.HTML-Code} Header and removed from the Feature object. #### 10.4.2.5 Output data Loading Loading @@ -2089,21 +2092,23 @@ If the execution of the operation is limited to the local scope (see clause the Entities as mandated by clause 5.2.6.4.1 and containing only the Attributes requested (if present). - If the Prefer Header [n.14] is set to - If the [Prefer]{.HTML-Code} Header [n.14] is set to ["ngsi-ld=<​version>"]{.HTML-Code} then the ContextBroker shall endeavour to amend the elements of the JSON-LD array to conform to the specified version of the NGSI-LD specification as mandated in clause 9.5.3, and return a Preference-Applied Header set to and return a [Preference-Applied]{.HTML-Code} Header set to ["ngsi-ld=<​conformant-version>"]{.HTML-Code} in the response. - If the Accept Header is set to ["application/geo+json",]{.HTML-Code} the response shall be a GeoJSON _FeatureCollection_ as mandated by clause 5.2.6.11.2, with each _Feature_ within the _FeatureCollection_ containing only the Attributes requested (if present): - If the Prefer Header is omitted or set to ["body=ld+json"]{.HTML-Code} then the _FeatureCollection_ will also contain an _`@context`_ field. - If the Prefer Header is set to ["body=json]{.HTML-Code}" the _`@context`_ is sent as a Link Header and removed from the _FeatureCollection_ object. - If the [Prefer]{.HTML-Code} Header is omitted or set to ["body=ld+json"]{.HTML-Code} then the _FeatureCollection_ will also contain an _`@context`_ field. - If the [Prefer]{.HTML-Code} Header is set to ["body=json]{.HTML-Code}" the _`@context`_ is sent as a [Link]{.HTML-Code} Header and removed from the _FeatureCollection_ object. #### 10.4.3.5 Output data Loading
md/clause-11.md +23 −13 Original line number Diff line number Diff line Loading @@ -54,6 +54,7 @@ Implementations shall exhibit the following behaviour: - If an **exclusive** [Context Source Registration]{.HTML-Keyboard} already exists for this Entity id (URI), Attributes from matching input data are forwarded for remote processing: - For matching Registrations where the "Create or Update (Upsert) Temporal Evolution of an Entity" operation is supported, the operation is forwarded to the registration endpoint. If the endpoint then raises an error, this Loading @@ -72,6 +73,7 @@ Implementations shall exhibit the following behaviour: - If any **redirect** [Context Source Registrations]{.HTML-Keyboard} exist that match against the input data, that input data is forwarded for remote processing by one or more matching endpoints: - For matching Registrations where the "Create or Update (Upsert) Temporal Evolution of an Entity" operation is supported, matching input data is forwarded. If any such endpoint then raises an error, this shall result in Loading Loading @@ -154,6 +156,7 @@ The following behaviour shall be exhibited by compliant implementations: - If an **exclusive** [Context Source Registration]{.HTML-Keyboard} matches against the input data, the Attributes from matching input data are forwarded for remote processing. For each matching registration: - If the "Add Attributes to Temporal Evolution of an Entity" operation is supported by the matched registration, matching input data is forwarded to the Registration endpoint. Loading @@ -164,12 +167,13 @@ The following behaviour shall be exhibited by compliant implementations: parts of it succeeded. The Attributes matching the **exclusive** [Context Source Registration]{.HTML-Keyboard} are then removed from the EntityTemporal Fragment and not processed further. Registration]{.HTML-Keyboard} are then removed from the EntityTemporal Fragment and not processed further. - If a **redirect** [Context Source Registration]{.HTML-Keyboard} matches against the input data, the Attributes from matching input data are forwarded for remote processing. For each matching registration: - If a **redirect** [Context Source Registration]{.HTML-Keyboard} matches against the input data, the Attributes from matching input data are forwarded for remote processing. For each matching registration: - If the "Add Attributes to Temporal Evolution of an Entity" operation is supported by the matched registration, matching input data is forwarded to the Registration endpoint. Loading @@ -180,8 +184,8 @@ The following behaviour shall be exhibited by compliant implementations: parts of it succeeded. The Attributes matching the **redirect** [Context Source Registration]{.HTML-Keyboard} are then removed from the EntityTemporal Fragment and not processed further. Registration]{.HTML-Keyboard} are then removed from the EntityTemporal Fragment and not processed further. - For any **inclusive** [Context Source Registrations]{.HTML-Keyboard} that match against the remaining input data, that input data is also forwarded for Loading @@ -189,8 +193,8 @@ The following behaviour shall be exhibited by compliant implementations: - If the target [Temporal Evolution of an Entity]{.HTML-Keyboard} exists locally and matches against the remaining input data, implementations shall do the following: - For each Attribute instance included by the EntityTemporal Fragment at root level: - For each Attribute instance included by the EntityTemporal Fragment at root level: - The Attribute (considering term expansion rules as mandated by Clause+++clause-8+++root.2.4) instance(s) shall be added to the target [Temporal Evolution of an Entity]{.HTML-Keyboard}. Loading Loading @@ -253,6 +257,7 @@ Figure: Delete Attribute from Temporal Evolution of an Entity use case - If an **exclusive** or **redirect** [Context Source Registration]{.HTML-Keyboard} matches against the input data, the input data is forwarded. For each matching registration: - If the "Delete Attribute from Temporal Evolution of an Entity" operation is supported by the matched registration, matching input data is forwarded to the Registration endpoint. Loading Loading @@ -342,6 +347,7 @@ Figure: Modify Attribute Instance in Temporal Evolution of an Entity use case - If an **exclusive** or **redirect** [Context Source Registration]{.HTML-Keyboard} matches against the input data, the input data is forwarded. For each matching registration: - If the "Modify Attribute instance in Temporal Evolution of an Entity" operation is supported by the matched registration, matching input data is forwarded to the Registration endpoint. Loading Loading @@ -428,6 +434,7 @@ Figure: Delete Attribute Instance from Temporal Evolution of an Entity use case - If an **exclusive** or **redirect** [Context Source Registration]{.HTML-Keyboard} matches against the input data, the input data is forwarded. For each matching registration: - If the "Delete Attribute instance from Temporal Evolution of an Entity" operation is supported by the matched registration, matching input data is forwarded to the Registration endpoint. Loading Loading @@ -500,6 +507,7 @@ Figure: Delete Temporal Evolution of an Entity use case - If an **exclusive** or **redirect** [Context Source Registration]{.HTML-Keyboard} matches against the input data, the input data is forwarded. For each matching registration: - If the "Delete Temporal Evolution of Entity" operation is supported by the matched registration, matching input data is forwarded to the Registration endpoint. Loading Loading @@ -799,12 +807,14 @@ Clause+++clause-8+++root.6 ), no further restrictions have to be provided. temporal property (by default _observedAt_) within the concerned temporal interval. - Otherwise, - Let S be the set of selected Entities i.e. the query result set. - If split entities flag is explicitly set to true or, if not explicitly set, the default setting of the deployment allows split entities, and local scope is not specified, implementations shall run a query that shall return an Entity Array containing all the Entities found locally, that meet all of the following conditions (given the respective parameter is provided): - If id(s) is provided, keep in S only those Entities whose id is equivalent to any of the id(s) passed as a parameter. - If an id pattern is provided, keep in S only those Entities whose id Loading Loading @@ -854,8 +864,8 @@ Clause+++clause-8+++root.6 ), no further restrictions have to be provided. - If no geoquery is provided, then S3 is equal to S2. - If the Scope query is present, from S3, select those Entities whose Entity Scope instances match the Scope query (as mandated by Clause+++clause-7+++root.2.5, for an example see [i.16] ~annex A.16). Let S4 be the new subset. Clause+++clause-7+++root.2.5, for an example see Annex C.11). Let S4 be the new subset. - If no Scope query is provided, then S4 is equal to S3. - If the ContextBroker implementation supports the use of [Entity Loading Loading @@ -914,8 +924,8 @@ Clause+++clause-8+++root.6 ), no further restrictions have to be provided. - If no geoquery is provided, then S6 is equal to S5. - If the Scope query is present, from S6, select those Entities whose Entity Scope instances match the Scope query (as mandated by Clause+++clause-7+++root.2.5, for an example see [i.16] ~annex A.16). Let S7 be the new subset. Clause+++clause-7+++root.2.5, for an example see Annex C.11). Let S7 be the new subset. - If no Scope query is provided, then S7 is equal to S6. - Otherwise S7 is equal to S4. - If a _`datasetId`_ parameter is provided, from S7, for all Entities, filter Loading