Re: JSON-LD-star patterns

> On Sep 16, 2024, at 1:18 PM, Filip Kolarik <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 20:53:57 UTC