- From: Gregg Kellogg <gregg@greggkellogg.net>
- Date: Mon, 3 Feb 2014 14:24:22 -0800
- To: public-hydra@w3.org
Excuse me for some random thoughts, but I've been reconciling using Hydra for an API which typically returns JSON-LD representations of entities described using schema.org. Similar issues may exist with the schema.org action vocabulary as well. As a simple example, I may want to express follows information for a Person. In Turtle, this might look like the following:
<http://example/people/gregg> a schema:Person;
schema:name "Gregg Kellogg"@en;
schema:follows <http://example/people/markus>, <http://example/people/kingsley> ...
However, given that the list of potentially people I follow could be large; using Hydra I may construct this using a separate relationship to a Collection:
<http://example/people/gregg> a schema:Person, :ApiPerson;
:follows <http://example/people/gregg/follows> .
:ApiPerson a hydra:Class;
hydra:supportedProperties [hydra:property schema:name], [hydra:property :follows] .
:follows a hydra:Link
rdfs:label "follows";
rdfs:comment "Collection of followed people";
rdfs:domain schema:Person;
rdfs:range schema:Person;
hydra:supportedOperations [
hydra:method "GET";
hydra:returns hydra:Collection
] .
If the referenced collection contained the following data:
<http://example/people/gregg/follows> a hydra:Collection;
hydra:members (<http://example/people/markus> <http://example/kingsley> .
After loading both the original document and the collection into a graph, I would now have the following:
<http://example/people/gregg> a schema:Person, :ApiPerson;
:follows <http://example/people/gregg/follows> .
<http://example/people/gregg/follows> a hydra:Collection;
hydra:members (<http://example/people/markus> <http://example/kingsley> .
This now does not describe what I would want using the schema.org definitions. One way to reconstruct what I want would be to add more data to the collection document:
<http://example/people/gregg/follows> a hydra:Collection;
hydra:members (<http://example/people/markus> <http://example/kingsley> .
<http://example/people/gregg> schema:follows <http://example/people/markus>, <http://example/people/kingsley> .
This is actually easier to do in JSON-LD:
{
"@context": {
"hydra": "http://www.w3.org/ns/hydra/core#",
"schema": "http://schema.org/",
"follower": {"@reverse": "schema:follows"}
}
"@id": "http://example/people/gregg/follows",
"@type": "hydra:Collection",
"members": [
{ "@id": "http://example/people/markus", "follower": "http://example/people/gregg"},
{ "@id": "http://example/people/kingsley", "follower": "http://example/people/gregg"}
]
}
The issue is better for single-valued properties, as the property value would be the same as the entity identifier, which would result in what you would expect when merging both entity definitions.
I guess the question is, is this an expected usage pattern? Should the collection examples represent this, or should it be described as a recommended practice? Perhaps I've missed something.
Gregg Kellogg
gregg@greggkellogg.net
Received on Monday, 3 February 2014 22:24:55 UTC