- From: Markus Lanthaler <markus.lanthaler@gmx.net>
- Date: Sun, 27 Apr 2014 17:15:30 +0200
- To: <public-hydra@w3.org>
Gregg, you forgot to CC the group. So include your complete mail (and my comments) below. On Sunday, April 27, 2014 4:58 PM, Gregg Kellogg wrote: > On Apr 27, 2014, at 7:34 AM, "Markus Lanthaler" wrote: > > On Friday, April 25, 2014 9:25 PM, Gregg Kellogg wrote: > >>> You can bind operations to properties and classes, so that's not a > > problem. > >>> What you can't currently do, is to bind IRI template mappings to a > > templated > >>> link: > >>> > >>> :property a hydra:TemplatedLink . > >>> > >>> # this doesn't work! The range of :property is hydra:IriTemplate not > >>> xsd:string > >>> /something :property "my/{template}" . > >>> > >>> # you need to do something like > >>> /something :property [ > >>> hydra:template "my/{template}" ; > >>> hydra:mappings .... > >>> ] . > >> > >> I explored this in my Querying collections email: > >> > >> :InterestCollection a hydra:Class; > >> hydra:supportedProperty [ > >> a hydra:SupportedProperty; > >> hydra:multiple false; > >> hydra:property hydra:member; > >> hydra:required false > >> ], [ > >> a hydra:SupportedProperty; > >> hydra:property :searchInterestCollection > >> ], . > >> > >> :searchInterestCollection a hydra:TemplatedLink; > >> hydra:search [ > >> a hydra:IriTemplate; > >> hydra:template "{?collection}?likeKind={?kind}"; > >> hydra:mapping [ > >> a hydra:IriTemplateMapping; > >> hydra:variable "collection"; > >> hydra:property :interestCollection; > >> hydra:required true > >> ], [ > >> a hydra:IriTemplateMapping; > >> hydra:variable "kind"; > >> hydra:property :likeKind > >> hydra:required true > >> ] . > >> > >> Although, I confused where the actual :searchInterestCollection > > property/value would go, > >> and it does seem that it needs to go within an instance of a > > :InterestCollection. > > > > Yes > > > > > >> We could consider doing something like an owl:Restriction on > > :interestCollection that > >> requires :searchInterestCollection to have a specific value. I could then > > define that value in > >> the API and not have to repeat it in a collection instance. > >> > >> We could instead define a value such as > >> > >> :SearchInterestValue a hydra:IriTemplate; > >> hydra:template "{?kind}"; > >> hydra:mapping [ > >> a hydra:IriTemplateMapping; > >> hydra:variable "collection"; > >> hydra:property :interestCollection; > >> hydra:required true > >> ], [ > >> a hydra:IriTemplateMapping; > >> hydra:variable "kind"; > >> hydra:property :likeKind > >> hydra:required true > >> ] . > >> > >> Then define a restriction such as > >> > >> :interestCollection; > >> rdfs:subClassOf [ > >> a owl:Restriction; > >> owl:onProperty :searchInterestCollection; > >> owl:hasValue :SearchInterestValue > >> ] . > >> > >> (Although, there may be a Hydra-specific way to do this as part of a > > revised Constraint). > >> > >> What this would do is say that if I have a :InterestCollection, I can > > infer that it has a > >> :searchInterestCollection property who's value is :SearchInterestValue, > > and thus not have to > >> repeat myself by actually manifesting this in each instance. > > > > I see. That certainly works (already). You can do it without OWL by simply > > materializing that triple, which is very cheap to do for the server and > > eliminates the reasoning for the client. The issue however is that it could > > quite easily be misinterpreted as a link instead of a templated link (by > > humans): > > > > { > > "@type": "InterestCollection", > > "searchInterestCollection": "/apidoc#SearchInterestValue" > > } > > It may be that saying TemplatesLink is a subclass of Link is wrong, or that they > are disjoint. It's the result of applying variable substitution to the template > which is a Link. Right. That's the reason why TemplatedLink is currently *not* a subclass of Link. They are both subclasses of rdf:Property. > > I think, it would be much more straightforward to allow the association of > > IriTemplateMappings to a TemplatedLink property and change from rdfs:range > > hydra:IriTemplate to schema:rangeIncludes xsd:string, hydra:IriTemplate. > > Then you could simply do something like this: > > > > { > > "@type": "InterestCollection", > > "searchInterestCollection": "{?kind}" > > } > > > > with > > > > :searchInterestCollection a hydra:TemplatedLink; > > hydra:mapping [ > > a hydra:IriTemplateMapping; > > hydra:variable "kind"; > > hydra:property :likeKind > > hydra:required true > > ] . > > > > The downside is that it introduces variability and makes the implementation > > of clients slightly more difficult as the IriTemplate would have be > > "reconstructed". > > Yes, but I think this is pretty clear, but requires more work on the semantics of TemplatesLink, IMO. What's semantics is TempledLink missing? > Gregg > > > -- > > Markus Lanthaler > > @markuslanthaler > > -- Markus Lanthaler @markuslanthaler
Received on Sunday, 27 April 2014 15:16:19 UTC