- From: Holger Knublauch <holger@topquadrant.com>
- Date: Mon, 21 Sep 2015 11:16:30 +1000
- To: public-hydra@w3.org
On 9/20/2015 22:04, Dietrich Schulten wrote: > Hi, > > I am looking into SHACL[1] with Hydra. Unless I am missing something (I am not a Hydra expert), the correspondence seems to be hydra:Class = sh:ShapeClass and hydra:SupportedProperty = sh:PropertyConstraint. Depending on how far you guys want to take this, I guess a deep integration could consist of 1) declare hydra:Class to be a subclass of sh:Shape (or just use sh:ShapeClass) 2) use sh:property as alternative to hydra:supportedProperty 3) replace hydra:required with sh:minCount=1 4) add missing features from Hydra (e.g. readable/writable) to sh:PropertyConstraint Holger > > In SHACL one can describe a set of property constraints for instances. > > ex:AllowedValuesExampleShape > a sh:Shape ; > sh:property [ > sh:predicate schema:eventStatus ; > sh:allowedValues ( schema:EventCancelled, > schema:EventScheduled, schema:EventPostPoned ) ; > ] > > If I understand the SHACL spec draft[2] correctly, this shape can be > applied to a scope: > > 1. by an individuum which adopts the shape via a sh:nodeShape property > whose value must be an IRI such as ex:AllowedValuesExampleShape, stating > that this individual satisfies AllowedValuesExampleShape. > > 2. by the shape which can apply itself to an rdfs:class via > sh:scopeClass, which says that every single individuum of that > rdfs:class must satisfy the shape > > 3. by the shape which can define "scope selectors" for subjects having a > certain predicate, or objects of a certain predicate, or for all > subjects or objects in a given graph > > > In Hydra we say that a method expects a certain type and we can make > statements about its properties, e.g. below I say that the > schema:eventStatus is a required property for a PUT request. > > { > "@context": { > "@vocab": "http://schema.org/", > "hydra": "http://www.w3.org/ns/hydra/core#" > }, > "@id": "http://localhost:8080/webapp/hypermedia-api/events/1", > "hydra:operation": [ > { > "hydra:method": "PUT", > "hydra:expects": > { > "@type": "Event", > "hydra:supportedProperty": [ > { > "hydra:property": "eventStatus", > "hydra:required": true > }] > } > }, > { > "hydra:method": "DELETE" > }] > } > > How do I constrain the allowed values for eventStatus with SHACL in the > context of a Hydra response? Can I simply add sh:allowedValues as shown > below? > > { > "@context": > { > "@vocab": "http://schema.org/", > "hydra": "http://www.w3.org/ns/hydra/core#", > "sh": "http://www.w3.org/ns/shacl#" > }, > "@id": "http://localhost:8080/webapp/hypermedia-api/events/1", > ... event properties ... > "hydra:operation": [ > { > "hydra:method": "PUT", > "hydra:expects": > { > "@type": "Event", > "hydra:supportedProperty": > { > "hydra:property": "eventStatus", > "hydra:required": true, > "sh:allowedValues" : { > "@list": [ // SHACL requires this to be an rdf:List > "schema:EventCancelled", > "schema:EventPostPoned" > ] > } > } > } > }, > { > "hydra:method": "DELETE" > }] > } > > By using sh:allowedValues I am saying that the value of > hydra:supportedProperty is not only a hydra:SupportedProperty, but also > a sh:PropertyConstraint. Does that make hydra:supportedProperty an alias > of sh:property by inference? If so, I guess that the value of > hydra:expects is now not only an Event, but also a sh:Shape. > > So I am really saying that one should send a sh:Shape as request body of > the PUT - which is not what I mean to say. What I want to say is that > the client may cancel or postpone the event. For this it should send an > Event with the appropriate eventStatus value. > > The following seems better, but it pushes the envelope quite a bit > because the SHACL spec specifically says that the value of sh:nodeShape > must be an IRI and the subject of sh:nodeShape must be an individual. I > took the freedom to inline the nodeShape below: > > { ... > "@id": "http://localhost:8080/webapp/hypermedia-api/events/1", > "hydra:operation": [ > { > "hydra:method": "PUT", > "hydra:expects": > { > "@type": "Event", > "sh:nodeShape": { > "@type": "sh:Shape", > "sh:property" : { > "sh:predicate": "eventStatus", > "sh:allowedValues" : { > "@list": [ > "schema:EventCancelled", > "schema:EventPostPoned" > ] > } > } > } > "hydra:supportedProperty": [ > { > "hydra:property": "eventStatus", > "hydra:required": true, > }] > } > }] > } > > What are your thoughts how Hydra could or should integrate with Hydra? > > If an inline nodeShape is a good fit, should we raise an issue with the > SHACL group to see if they can allow inline node shapes? > > To me, the nodeShape scope (1.) seems to fit somewhat better than the > other scopes (2., 3.). Usually I want to constrain a request body for a > particular ReST resource, maybe even in a particular status of the > resource - but I do not want to constrain an entire class I might not > even own. > > There is a second case where I think it makes sense to constrain values: > IriTemplateMapping. Similar questions arise there. > > > Best regards, > Dietrich > > [1] https://www.w3.org/2014/data-shapes/wiki/Main_Page > [2] http://w3c.github.io/data-shapes/shacl/ > > > > >
Received on Monday, 21 September 2015 01:17:04 UTC