- From: Gregg Kellogg <gregg@greggkellogg.net>
- Date: Mon, 16 Sep 2024 14:20:20 -0700
- To: Filip Kolarik <filip26@gmail.com>
- Cc: RDF-star WG <public-rdf-star-wg@w3.org>, JSON-LD Working Group <public-json-ld-wg@w3.org>
- Message-Id: <833E1FF9-FEB7-44AF-A53D-DA5F17E976A3@greggkellogg.net>
> On Sep 16, 2024, at 2:12 PM, Filip Kolarik <filip26@gmail.com> wrote:
>
> Thanks. Making the @annotation.id <http://annotation.id/> optional would help with adoption, I guess it can be generated.
Yes, as with Turtle, using an explicit annotation identifier (reifier) is optional. Just like with other node objects, if there is no `@id`, a fresh blank node is allocated to serve as the identifier. Same thing happens in Turtle.
> Details to be considered:
>
> * what if an @annotation is used on a graph object?
>
> The answer could depend on @graph/dataset interpretation (not necessarily equal to RDF dataset definition). If the dataset is something substantial then adding annotation to the @graph could be interpreted the same way as adding it to a node. If not, then adding annotation looks like metadata of metadata.
Similar to if the annotated object has recursive elements; this isn’t supported in Turtle, and it may lead to odd results in JSON-LD. In the case of a graph object, if @annotation and @graph appear in the same object, what would be annotated is the relationship between the subject and the graph identifier; there are no semantics that would indicate that this annotates the graph, itself. Opening this up could be a can of worms, given that JSON-LD commonly uses graph names as references to that graph while RDF just has a name/graph pair and use of that name outside does not necessarily refer to that graph.
> What about @annotation inside @annotation, does it make sense?
Yes, also possible in Turtle, but that’s a fairly narrow use case.
Gregg
> On Mon, Sep 16, 2024 at 10:53 PM Gregg Kellogg <gregg@greggkellogg.net> wrote:
>>> On Sep 16, 2024, at 1:18 PM, Filip Kolarik <filip26@gmail.com <mailto:filip26@gmail.com>> wrote:
>>>
>>> Hi Gregg,
>>> thank you for the examples. I like the compactness of @graph annotations and I wonder how to annotate a record, i.e. a group of statements represented as a JSON object.
>>>
>>> Would something like this be possible?
>>>
>>> {
>>> @context: ...
>>> @id: ...
>>> firstName: ..
>>> lastName: ..
>>> @annotation: {
>>> created:
>>> source:
>>> }
>>> }
>>>
>>> This should result in a list of statements (created, source,) about statements (@id firstName, .., @id <> lastName ...,).
>>
>> This is the most likely way that annotations would be implemented in JSON-LD-star, but the details need to be worked out. RDF 1.2 Turtle only allows annotations of a single triple, as the annotation pattern ( `{| … |}` can appear after an object production. JSON-LD doesn’t have such constraints, but this could be controversial.
>>
>> If @annotation is used in a node object having multiple properties, then the most natural interpretations is that the triples associated with that node would each be reified using a common reifier, and that reifier would be used to annotate each triple. Given something like you suggested, it might be treated as the following:
>>
>> {
>> “@context”: …,
>> “@id”: “id”,
>> “firstName”: “Fred”,
>> “lastName”: “Flintstone,
>> “@annotation”: {
>> “@id”: “reifier”,
>> “created”: “1960-09-30”,
>> “source: “HannaBarbara”
>> }
>> }
>>
>> This corresponds to the following Turtle.
>>
>> :id :firstName “Fred” ~ :reifier {| :created “1960-09-30”; :source :HannaBarbara |};
>> :lastName “Flintstone” ~ :reifier .
>>
>> Details to be considered:
>>
>> * what if an @annotation is used on a graph object?
>>
>> Gregg
>>
>>> Best,
>>> Filip
>>>
>>>
>>>
>>>
>>> On Mon, Sep 16, 2024 at 2:47 AM Gregg Kellogg <gregg@greggkellogg.net <mailto:gregg@greggkellogg.net>> wrote:
>>>> A follow on to this, with some hypothetical multi-statement reifiers acting like graphs. Consider JSON-LD Example 115 [1] about making statements about a graph.
>>>>
>>>> {
>>>> "@context": {
>>>> "generatedAt": {
>>>> "@id": "http://www.w3.org/ns/prov#generatedAtTime",
>>>> "@type": "http://www.w3.org/2001/XMLSchema#dateTime"
>>>> },
>>>> "Person": "http://xmlns.com/foaf/0.1/Person",
>>>> "name": "http://xmlns.com/foaf/0.1/name",
>>>> "knows": {"@id": "http://xmlns.com/foaf/0.1/knows", "@type": "@id"}
>>>> },
>>>> "@id": "http://example.org/foaf-graph",
>>>> "generatedAt": "2012-04-09T00:00:00",
>>>> "@graph": [
>>>> {
>>>> "@id": "http://manu.sporny.org/about#manu",
>>>> "@type": "Person",
>>>> "name": "Manu Sporny",
>>>> "knows": "https://greggkellogg.net/foaf#me"
>>>> }, {
>>>> "@id": "https://greggkellogg.net/foaf#me",
>>>> "@type": "Person",
>>>> "name": "Gregg Kellogg",
>>>> "knows": "http://manu.sporny.org/about#manu"
>>>> }
>>>> ]
>>>> }
>>>> This results in the following TriG:
>>>> @prefix foaf: <http://xmlns.com/foaf/0.1/> .
>>>> @prefix prov: <http://www.w3.org/ns/prov#> .
>>>> @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
>>>> @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
>>>>
>>>> <http://example.org/foaf-graph> prov:generatedAtTime "2012-04-09T00:00:00"^^xsd:dateTime .
>>>>
>>>> <http://example.org/foaf-graph> {
>>>> <http://manu.sporny.org/about#manu> a foaf:Person;
>>>> foaf:name "Manu Sporny";
>>>> foaf:knows <https://greggkellogg.net/foaf#me> .
>>>>
>>>> <https://greggkellogg.net/foaf#me> a foaf:Person;
>>>> foaf:name "Gregg Kellogg";
>>>> foaf:knows <http://manu.sporny.org/about#manu> .
>>>> }
>>>> If you were to use @reifier instead of @graph, you’d get something like the following Turtle:
>>>> @prefix foaf: <http://xmlns.com/foaf/0.1/> .
>>>> @prefix prov: <http://www.w3.org/ns/prov#> .
>>>> @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
>>>> @prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
>>>>
>>>> <http://example.org/foaf-graph> prov:generatedAtTime "2012-04-09T00:00:00"^^xsd:dateTime;
>>>> rdf:reifies <<( <http://manu.sporny.org/about#manu> a foaf:Person )>>,
>>>> <<( <http://manu.sporny.org/about#manu> foaf:name “Manu Sporny” )>>,
>>>> <<( <http://manu.sporny.org/about#manu> foaf:knows <https://greggkellogg.net/foaf#me> )>>,
>>>> <<( <https://greggkellogg.net/foaf#me> a foaf:Person )>>,
>>>> <<( <https://greggkellogg.net/foaf#me> foaf:name “Gregg Kellogg” )>>,
>>>> <<( <https://greggkellogg.net/foaf#me> foaf:knows <http://manu.sporny.org/about#manu> )>> .
>>>> Gregg Kellogg
>>>> gregg@greggkellogg.net <mailto:gregg@greggkellogg.net>
>>>>
>>>> [1] https://www.w3.org/TR/json-ld11/
>>>>
>>>>> On Sep 14, 2024, at 1:13 PM, Gregg Kellogg <gregg@greggkellogg.net <mailto:gregg@greggkellogg.net>> wrote:
>>>>>
>>>>> The JSON-LD CG (specifically, Pierre-Antoine, Niklas and myself) started a draft on JSON-LD-star [1] in 2020. Since then, the target has changed, so we’ve created an issue to consider how this might adapt to Triple Terms, Reifying Triples, and Annotations [2].
>>>>>
>>>>> Basically, the idea is to add three new keywords to JSON-LD, @reifies, @triple, and @annotation. JSON-LD encodes RDF iin JSON using Node Objects, which can represent a subject/identifier, @type and properties based on key/value entries in a map. This proposal uses @reifies, @triple, and @annotation as special properties to encode triple terms.
>>>>>
>>>>> At the most fundamental level, @triple is intended to encode a single triple with an @id and a single-valued property.
>>>>>
>>>>> {
>>>>> "@context": {
>>>>> "@base": "http://example.org/",
>>>>> "@vocab": "http://example.org/",
>>>>> "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
>>>>> },
>>>>> "rdf:reifies": {
>>>>> "@triple": {
>>>>> "@id": "bob",
>>>>> "age": 42
>>>>> }
>>>>> },
>>>>> "certainty": 0.8
>>>>> }
>>>>>
>>>>> This would be equivalent to the following Turtle:
>>>>>
>>>>> BASE <http://example.org/>
>>>>> PREFIX : <http://example.org/>
>>>>> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#”>
>>>>>
>>>>> [ rdf:reifies <<( :bob :age 42 ))> ]; :certainty: 0.8 .
>>>>>
>>>>> In this case, since there is no explicit @id at the top level, a blank node is generated, which is used as the reifier.
>>>>>
>>>>> The @reifies keyword can be used to compact this, and holds the potentially for reifying more than one triple:
>>>>>
>>>>> {
>>>>> "@context": {
>>>>> "@base": "http://example.org/",
>>>>> "@vocab": "http://example.org/",
>>>>> "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
>>>>> },
>>>>> “@id”: “reifier”,
>>>>> "@reifies": {
>>>>> "@id": "bob",
>>>>> "age": 42
>>>>> },
>>>>> "certainty": 0.8
>>>>> }
>>>>>
>>>>> The example shows a single triple, but in principle, @reifies could take an array of objects, each with a different @id, and each object may have one or more properties; each of these could turn into a separate triple term referenced by the same reifier. This perticular example uses an expicit reifier, so the resulting Turtle would be:
>>>>>
>>>>> BASE <http://example.org/>
>>>>> PREFIX : <http://example.org/>
>>>>> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#”>
>>>>>
>>>>> :reifier rdf:reifies <<( :bob :age 42 ))>; :certainty: 0.8 .
>>>>>
>>>>> It’s an open question if downstream relationships would also be reified; they’re not in Turtle.
>>>>>
>>>>> The annotation syntax is similar to Turtle:
>>>>>
>>>>> {
>>>>> "@context": {
>>>>> "@base": "http://example.org/",
>>>>> "@vocab": "http://example.org/"
>>>>> },
>>>>> "@id": "bob",
>>>>> "age": {
>>>>> "@value": 42,
>>>>> "@annotation": {
>>>>> "@id": "_:anno",
>>>>> "certainty": 0.8
>>>>> }
>>>>> }
>>>>> }
>>>>>
>>>>> In this case, the annotation may have it’s own reifier assigned (here ’s _:anno), or one can be assigned automatically. This would be equivalent to the following Turtle:
>>>>>
>>>>> :bob :age 42 ~ _:anno {| :certainty 8.0E-1 |} .
>>>>>
>>>>> Note that in the Reification example, the @refiies keyword acts much like @graph. If it were restated as follows, it would use the named graph syntax, which is common in Verifiable Claims.
>>>>>
>>>>> {
>>>>> "@context": {
>>>>> "@base": "http://example.org/",
>>>>> "@vocab": "http://example.org/",
>>>>> "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
>>>>> },
>>>>> "@id": "reifier",
>>>>> "@graph": {
>>>>> "@id": "bob",
>>>>> "age": 42
>>>>> },
>>>>> "certainty": 0.8
>>>>> }
>>>>>
>>>>> This results in the following TriG.
>>>>>
>>>>> BASE <http://example.org/>
>>>>> PREFIX : <http://example.org/>
>>>>> PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#”>
>>>>> PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> .
>>>>>
>>>>> :reifier :certainty 8.0E-1 .
>>>>>
>>>>> :reifier {
>>>>> :bob :age 42 .
>>>>> }
>>>>>
>>>>> This suggests that there may be a way to describe named graphs using reification.
>>>>>
>>>>> Gregg Kellogg
>>>>> gregg@greggkellogg.net <mailto:gregg@greggkellogg.net>
>>>>>
>>>>> [1] https://json-ld.github.io/json-ld-star/
>>>>> [2] https://github.com/json-ld/json-ld-star/issues/49
>>>>
>>
Received on Monday, 16 September 2024 21:20:34 UTC