- From: Gregg Kellogg <gregg@greggkellogg.net>
- Date: Mon, 12 May 2014 11:15:14 -0700
- To: Markus Lanthaler <markus.lanthaler@gmx.net>
- Cc: public-hydra@w3.org
This topic's been quiet for a while, but for me, resolving this is pretty much my top priority. At this point, I think there are two basic solutions: 1) Use a separate _collection property_, which has some semantic relationship to the base property, where the range is specifically a collection. For example: </gregg> a foaf:Person; :knowsCollection </gregg/knowsCollection> . :knowsCollection :collectionPropertyFor foaf:knows . Then the collection can reference each member and re-assert the relationship </gregg/knowsCollection> a hydra:Collection; hydra:member </markus> . </gregg> foaf:knows </markus> . 2) In a separate email, @lanthaler described an alternate using an intermediate object, such as the following: </gregg> a foaf:Person; :hasRelationshipIndirector [foaf:knows </gregg/knowsCollection>] . This could then reference the same type of collection I described above. It sort of breaks foaf:knows, except it does so on a blank resource, which could have some _catch-all_ semantic description, and it at least does not mess up the definition of the primary Person resource. I see many advantages to the 2nd proposal, but would really like to see this more actively discussed. Gregg Kellogg gregg@greggkellogg.net P.S. This is a duplicate of the issue response at <https://github.com/HydraCG/Specifications/issues/41#issuecomment-42867659> On Mar 24, 2014, at 1:41 PM, Gregg Kellogg <gregg@greggkellogg.net> wrote: > On Mar 24, 2014, at 8:14 AM, Markus Lanthaler <markus.lanthaler@gmx.net> wrote: > >> Changing the subject line >> >> On Friday, March 21, 2014 5:45 PM, Gregg Kellogg wrote: >>> On Mar 21, 2014, at 7:52 AM, Markus Lanthaler wrote: >>>> On Wednesday, March 19, 2014 10:44 PM, Gregg Kellogg wrote: >>>>> </GreggKellogg> a foaf:Person; >>>>> foaf:knows >>>>> [a foaf:Person; is hydra:member of </GreggKellogg/colleagues>], >>>>> </MarkusLanthaler> . >>>>> >>>>> <MarkusLanthaler> a foaf:Person . >>>> >>>> Hmm... I think this is a bit too clever and still creates a triple >>>> that you don't want. >>> >>> The notation is clever, just because Turtle doesn't allow me to express >>> this. The notation in JSON-LD is straightforward IMO. >> >> I think I disagree. You point to a blank node which is only there to be >> referenced by the collection (in contrast to point to the collection) that >> you are actually looking for. That's a bit too much magic IMHO. >> >> >>> The concept of indirecting through another resource is basically a >>> property path; it may be sophisticated, but it avoids asserting >>> unnecessary triples (at least with IRI subjects). It does create >>> additional BNode-subject triples, but in the context of Linked Data, >>> these can be seen as necessary "semantic glue", and are easily >>> filtered. >> >> Well, everything is "easily filtered".. it doesn't really matter whether >> it's a blank node or not I'd say. >> >> >> [...] >> >>>> While I don't really like the specific blank node solution you are >>>> proposing, I find the principle quite interesting. We could avoid the >>>> blank node, and thus a triple we don't want, entirely but just >>>> including a member of collection directly: >>>> >>>> { >>>> "@context": { >>>> "foaf": "http://xmlns.com/foaf/0.1/", >>>> "hydra": "http://www.w3.org/ns/hydra/core", >>>> "memberOf": { "@reverse": "hydra:member" } >>>> }, >>>> "@id" "GreggKellogg", >>>> "foaf:knows": { >>>> "@id": "MarkusLanthaler, >>>> "memberOf": "GreggKellogg/colleagues" >>>> } >>>> } >>>> >>>> WDYT? >>> >>> This would work fine, except for empty collections. >> >> Good point! >> >> >>> I would settle on >>> this as a compromise if the BNode-based relationship I suggested is not >>> palatable. Personally, I think the use of a BNode is a better call to >>> dereference the memberOf relation to get values, whereas filling in on >>> value might not make it clear that it is just a single representative >>> member of such a collection. >> >> I don't have a problem with the blank node per se but find the use of a >> reverse property quite confusing in this instance. Maybe we should consider >> creating a more explicit description of the collection instead. Something >> along the lines of >> >> "@id" "/GreggKellogg/colleagues", >> "managing": { >> "subject": "/GreggKellogg/", >> "property": "foaf:knows" >> }, >> "member": [ >> { "@id": "/MarkusLanthaler" } >> ] >> >> We could then even define a simple inference rule such as ?member => >> ?subject ?property ?member >> >> >>> Considered as a SPARQL query, the use of a BNode indirection is >>> something like the following: >>> >>> SELECT ?member ?p ?o >>> WHERE { >>> </GreggKellogg> a foaf:Person . >>> ?container hydra:member ?member . >>> ?member ?p ?o . >>> } >>> >>> Which has a certain appeal to me. >> >> I'm not sure what you want to illustrate with this SPARQL query.. copy and >> paste error? >> >> >>> I'd like to hear other people's thoughts on the merits of a direct >>> collection relationship vs. an indirect relationship, and the problem >>> that asserting a Collection as the value of a property who's range is >>> something else presents. >> >> Me too. I'll send a separate mail to public-lod and public-vocabs (of course >> cc'ing this group) to get more opinions. > > Perhaps if we could describe another kind of operation, where we could also provide a relative URL against which to perform the action. In the Hydra vocabulary, we could have something like the following: > > </GreggKellogg> a foaf:Person > hydra:supportedOperation [ > a GetRelatedCollectionOperation; > hydra:title "Get known relations"; > hydra:description "Retrieves a collection of foaf:Person related to the subject through foaf:knows"; > hydra:property foaf:knows; > hydra:uri </GreggKellogg/knows>; > hydra:method "GET"; > hydra:returns foaf:Person > ] . > > This increases the footprint of each class, but separates the operation of retrieving a collection, from the value of the property itself (which is asserted within the collection). Alternatively, the GetRelatedCollectionOperation could be specified within the supportedClass/supportedProperty/supportedOperation path within the vocabulary, where some form of URI template would be used to construct something relative the a specific entity's URL (in which case favoring </GreggKellogg/> would automatically allow <knows> as a relative path would work.). > > foaf:Person a hydra:Class; > hydra:supportedProperty [ > a hydra:SupportedProperty; > hydra:property foaf:knows; > hydra:supportedOperation [ > a GetRelatedCollectionOperation; > hydra:title "Get known relations"; > hydra:description "Retrieves a collection of foaf:Person related to the subject through foaf:knows"; > hydra:uri <knows/>; > hydra:method "GET"; > hydra:returns foaf:Person > ] > ] . > > Gregg > >> -- >> Markus Lanthaler >> @markuslanthaler >> >
Received on Monday, 12 May 2014 18:15:44 UTC