- From: Markus Lanthaler <markus.lanthaler@gmx.net>
- Date: Tue, 3 Feb 2015 21:26:06 +0100
- To: <public-hydra@w3.org>
On 3 Feb 2015 at 14:38, Dietrich Schulten wrote:
> Am 25.01.2015 um 23:31 schrieb Markus Lanthaler:
>> On 25 Jan 2015 at 22:08, Dietrich Schulten wrote:
>>>>> But is there a way to express that the above also entails
>>>>>
>>>>> </alice> foaf:knows </bob>
>>>>> </alice> foaf:knows </zelda>
>>>>>
>>>>> ?
>>>>
>>>> Sure, just add those triples :-)
>>>
>>> Yay, I'll gladly duplicate all members :o)
>>
>> You don't duplicate anything here. Depending on how you look at it, you
add
>> new statements (triples) or you draw new connections into the graph.
>>
>
> I am still unsure how to implement the new collection design in
> hydra-java. I have three questions, I hope you can help to clarify my
> doubts.
I'll at least try :-)
> 1. On the Alice resource, how do I express that she has friends assuming
> that I want to have an Alice resource and a separate resource containing
> a list of her friends represented as a hydra:Collection? I think the
> answer is to say that Alice has collections, and each collection states
> that it manages a property for a subject or an object:
>
> {
> "@id": "/alice",
> "collection": [
> {
> "@id": "/alice/friends",
> "@type": "Collection",
> "manages": {
> "property": "foaf:knows",
> "subject": "/alice"
> }
> }
> ]
> }
Right
> However, it breaks the :knows relationship if I would say the following,
> given that /alice/friends points to a hydra:Collection rather than a
> plain set of foaf:Person.
>
> {
> "@id": "/alice",
> "foaf:knows": { "@id": "/alice/friends" }
> }
>
> Correct?
Yep, in case of FOAF this is correct. foaf:knows has a range of foaf:Person
which would imply that /alice/friends is a person.
> 2. What I could do is to embed the friends using the :knows property.
> What I gain by this is that I can express information about the :knows
> collection such as a search property or supported operations on
> /alice/friends. At the same time, we also state that Alice :knows someone.
>
> {
> "@id": "/alice",
> "foaf:name": "Alice",
> "collection": [
> {
> "@id": "/alice/friends",
> "@type": "Collection",
> "manages": {
> "property": "foaf:knows",
> "subject": "/alice"
> },
> "search" : ... an iritemplate,
> "operation" : ... supportedOperations
> ],
> "foaf:knows": [
> {"@id":"/bob", "foaf:name": "Robert Rumbaugh"},
> {"@id":"/zelda", "foaf:name": "Zelda Zackney"}
> ]
> }
Haven't thought about this one yet, but looks reasonable.
> As an alternative, I could also use hydra:member on the :Collection to
> embed the friends, but in that case I do not assert that Alice :knows
> someone - unless I use an additional construct which makes that
connection.
>
> Correct?
Yes. We *could* change the semantics of collection to entail those triples
but we haven't decided to do so (yet). In general, I think it is much easier
to not depend on reasoning if possible.
> 3. On to the other side of the picture, the separate collection of
> friends. The Alice resource points to it using the construct from 1.
above.
>
> {
> "@id": "/alice/friends",
> "@type": "Collection",
> "manages": {
> "property": "foaf:knows",
> "subject": "/alice"
> },
> "member": [
> {"@id":"/bob", "foaf:name": "Robert Rumbaugh"},
> {"@id":"/zelda", "foaf:name": "Zelda Zackney"}
> ]
> }
>
> Question: How to materialize the :knows relationship?
It would look somewhat like this (please note the additional knownBy
property):
{
"@context": { "knownBy": { "@reverse": "foaf:knows", "@type": "@id" }
},
"@id": "/alice/friends",
"@type": "Collection",
"member": [
{"@id":"/bob", "foaf:name": "Robert Rumbaugh", "knownBy": "/alice" },
{"@id":"/zelda", "foaf:name": "Zelda Zackney", "knownBy": "/alice" }
]
}
Would be interesting to see how well compression works here
> When pointing to a separate resource which looks like the one above, I
> understood that I can leave the value of Alice :knows undefined "because
> it is trivial for the server to materialize those triples". Or, as an
> alternative: "We *could* also define "manages" in a way that would allow
> a reasoner to infer these triples automatically".
>
> Did you in fact mean that as an alternative a) server materializes the
> :knows triples - or b) we define :manages so that the reasoner can infer
> the :knows triples ?
Yes. I prefer the former though as it is trivial for the server and
simplifies clients a lot.
> ad a) Exactly how would that work? Example: Client has /alice without a
> :knows attribute and it wants to find out if :knows has any value. How
> does the client learn which request it should send to the server? What
> is the server response which materializes the :knows triples for the
client?
> It would have the advantage that clients do not need a reasoner to work
> with hydra responses.
1) Client retrieves /alice which the intent to find /alice foaf:knows
relationships
2) Client doesn't find any /alice foaf:knows in the retrieved response but
sees that /alice has a collection /alice/friends which manges /alice
foaf:knows
3) Client retrieves /alice/friends
4) Client finds /alice foaf:knows relationships in the response (which would
look somewhat like the example above)
> ad b) If we do not define :manages in that way, we leave it as an
> exercise to server implementers to add these assertions in their
> ApiDocumentation. OTOH, even if we do define it that way, clients would
> have to fire up a reasoner to work with collection properties, so it
> won't always help.
Exactly. The complexity of clients would be vastly increased.
> To me, a) appears preferable, although I have no idea what you mean by
> "materialize triples". Outside the world of Linked Data, and based on
> the Web Linking RFC alone, it would mean the server offers an extension
> rel such as ex:knows on the Alice resource which has a href that returns
> a list of people. But that is exactly what I cannot do, hence my
confusion.
Have a look at the example in the playground:
http://json-ld.org/playground/#/gist/a6fcd5b6034daeb71243
You'll see that all the triples you need are there. You probably just forgot
about reverse properties [1]. You can also define them on the fly without
having to give it a different name - that probably simplifies your
implementation - even though you could always use a convention such as
"!foaf:knows" or "^foaf:knows".
HTH,
Markus
[1] http://www.w3.org/TR/json-ld/#reverse-properties
--
Markus Lanthaler
@markuslanthaler
Received on Tuesday, 3 February 2015 20:26:46 UTC