- From: Gregg Kellogg <gregg@greggkellogg.net>
- Date: Sun, 27 Apr 2014 09:30:43 -0700
- To: Markus Lanthaler <markus.lanthaler@gmx.net>
- Cc: "<public-hydra@w3.org>" <public-hydra@w3.org>
On Apr 27, 2014, at 8:15 AM, "Markus Lanthaler" <markus.lanthaler@gmx.net> wrote: > > 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. Sorr, on my iPad, and don't have the documentation in front of me. Do we need to assert that they are disjoint? If they are, then I don't see how a client would confuse the value of a TemplatedLink property with a Link. >>> 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? That the result of manifesting a template to an IRI after variable substitution is a Link; I'm not sure how you might express this, though. Probably just claiming this in the spec is sufficient. Gregg >> Gregg >> >>> -- >>> Markus Lanthaler >>> @markuslanthaler >>> > > > -- > Markus Lanthaler > @markuslanthaler > >
Received on Sunday, 27 April 2014 16:31:13 UTC