- From: Markus Lanthaler <markus.lanthaler@gmx.net>
- Date: Fri, 21 Mar 2014 15:52:50 +0100
- To: "'Gregg Kellogg'" <gregg@greggkellogg.net>
- Cc: <public-hydra@w3.org>
On Wednesday, March 19, 2014 10:44 PM, Gregg Kellogg wrote: > Vering in to N3 syntax (and changing vocabularies), for the moment, an > alternative way of referencing a collection could be through a BNode: > > </GreggKellogg> a foaf:Person; > foaf:knows [is hydra:member of </GreggKellogg/colleagues>] > > Alternatively, if we mint a hydra:isMemberOf property as the inverse of > hydra:member: > > </GreggKellogg> a foaf:Person; > foaf:knows [hydra:isMemberOf </GreggKellogg/colleagues>] > > (JSON-LD and RDFa both have nice support for reversed properties, so > creating such a property probably isn't necessary. > > This ends up using the BNode as an existential quantifier for any > member of the colleagues collection, so doesn't create anything which > would be inconsistent. Dereferencing the is member of relation gets a > collection (or possibly, paged collection), which doesn't assert that > it is, itself, a colleague. After pulling in the collection, and > performing RDFS entailment, you'd get the following: > > </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. > These statements are entirely consistent, and the BNode is rather more > easily ignored than a collection IRI. This is a case where we should look at LDP [1], as Paul suggested some time ago. LDP allow you to describe a "DirectContainer" (I find the naming quite confusing) as follows: </GreggKellogg> a foaf:Person ; foaf:knows </MarkusLanthaler> . </GreggKellogg/friends> a ldp:DirectContainer; dcterms:title "Gregg's friends"; ldp:membershipResource </GreggKellogg>; ldp:hasMemberRelation foaf:knows; ldp:contains </MarkusLanthaler> . The problem I have with LDP is that it hardcodes the complete interaction model. It's also kind of tricky to "find" such a container. You have to traverse the graph along non-materialized, reverse properties which is not exactly straightforward IMHO. > In JSON-LD, it could look like the following: > > { > "@context": { > "foaf": "http://xmlns.com/foaf/0.1/", > "hydra": "<http://www.w3.org/ns/hydra/", > "memberOf": {"@reverse": "hydra:member"} > }, > "@id" "GreggKellogg", > "foaf:knows": {"memberOf": "GreggKellogg/colleagues"} > } > > It does mean that saying foaf:knows is a hydra:Link isn't sufficient, > but saying hydra:isMemberOf is a hydra:Link would be, and wouldn't need > to be asserted on any other property for an API to be able to perform > reasonable dereferencing. 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? -- Markus Lanthaler @markuslanthaler
Received on Friday, 21 March 2014 14:59:14 UTC