You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@jena.apache.org by di...@gmail.com, di...@gmail.com on 2018/08/02 21:17:39 UTC

Custom Literal casting when converting from Json-LD to Jena Model

I'm converting a JSON-LD input to RDF using Jena:

Model m = ModelFactory.createDefaultModel;
String str_reader = new StringReader(json.noSpaces)
RDFDataMgr.read(m, str_reader, "", RDFFormat.JSONLD.getLang)

I want to be able to have a custom serializer for String Literals. My end goal is to convert a plain String literal to a xsd:date or xsd:dateTime Literal whenever a desired format is found.

I know this is handled by jsonld-java which in turn relies on jackson. Is there anyone who can give me a hint on how to add this type of custom serialization?

Re: Custom Literal casting when converting from Json-LD to Jena Model

Posted by di...@gmail.com, di...@gmail.com.

On 2018/08/03 12:44:25, Andy Seaborne <an...@apache.org> wrote: 
> Extend StreamRDFWrapper and call super.triple() otherwise the data will 
> not flow down the pipeline.  There are prefixes as well and quads if the 
> input is trig etc.
> 
>   @Override
>   public void triple(Triple triple) {
>     ... process triple ... create newTriple ...
>     super.triple(newTriple);
> }
> 
>      Andy
> 
> 
> On 03/08/18 12:53, ajs6f wrote:
> >> Since I want triple processing...is extending the StreamRDFBase and overriding the method `public void triple(Triple triple)` an option? Is it the best option?
> > 
> > That's a reasonable option, or try StreamRDFWrapper [1] and override where appropriate. Keep in mind that triple-level processing can occur well after parsing, if that's what makes sense for your application; although you won't have the advantages of streaming, you will have random-access to the rest of your data.
> > 
> > ajs6f
> > 
> > [1] https://jena.apache.org/documentation/javadoc/arq/org/apache/jena/riot/system/StreamRDFWrapper.html
> > 
> >> On Aug 3, 2018, at 7:33 AM, didac.montero.mendez@gmail.com wrote:
> >>
> >>
> >>
> >> On 2018/08/03 10:10:34, Andy Seaborne <an...@apache.org> wrote:
> >>>
> >>>
> >>> On 02/08/18 22:17, didac.montero.mendez@gmail.com wrote:
> >>>> I'm converting a JSON-LD input to RDF using Jena:
> >>>>
> >>>> Model m = ModelFactory.createDefaultModel;
> >>>> String str_reader = new StringReader(json.noSpaces)
> >>>> RDFDataMgr.read(m, str_reader, "", RDFFormat.JSONLD.getLang)
> >>>                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> >>> Lang.JSONLD
> >>>
> >>>> I want to be able to have a custom serializer for String Literals. My end goal is to convert a plain String literal to a xsd:date or xsd:dateTime Literal whenever a desired format is found.
> >>>
> >>> Look at StreamRDF and RDFDataMgr.parse
> >>> (or build your parser for more control with RDFParser.create())
> >>>
> >>> All parsers send their output to a output to a StreamRDF.
> >>>
> >>> RDFDataMgr.read uses a StreamRDF that puts triples/quads into a graph.
> >>>
> >>>
> >>> StreamRDFs combine so you can build a pipeline
> >>>
> >>> Parser -> convert strings -> store in graph.
> >>>
> >>> Streams as well so works for large data if the syntax streams (JSON-LD
> >>> does not).
> >>>
> >>>> I know this is handled by jsonld-java which in turn relies on jackson. Is there anyone who can give me a hint on how to add this type of custom serialization?
> >>>
> >>> Jackson is the JSON parser.
> >>>
> >>> jsonld-java is the JSON-LD algorithms.
> >>>
> >>> What you seem to want is triple processing and be syntax agnostic.
> >>>
> >>>      Andy
> >>>
> >> Thanks for your reply. That's informative. I see that I can use RDFParser.create() to customize the StreamRDF (using RDFParser.create().parse(stream)).
> >>
> >> Since I want triple processing...is extending the StreamRDFBase and overriding the method `public void triple(Triple triple)` an option? Is it the best option?
> > 
> That's exactly what I did. Thanks for the clear answers. It has been very helpful.

Re: Custom Literal casting when converting from Json-LD to Jena Model

Posted by Andy Seaborne <an...@apache.org>.
Extend StreamRDFWrapper and call super.triple() otherwise the data will 
not flow down the pipeline.  There are prefixes as well and quads if the 
input is trig etc.

  @Override
  public void triple(Triple triple) {
    ... process triple ... create newTriple ...
    super.triple(newTriple);
}

     Andy


On 03/08/18 12:53, ajs6f wrote:
>> Since I want triple processing...is extending the StreamRDFBase and overriding the method `public void triple(Triple triple)` an option? Is it the best option?
> 
> That's a reasonable option, or try StreamRDFWrapper [1] and override where appropriate. Keep in mind that triple-level processing can occur well after parsing, if that's what makes sense for your application; although you won't have the advantages of streaming, you will have random-access to the rest of your data.
> 
> ajs6f
> 
> [1] https://jena.apache.org/documentation/javadoc/arq/org/apache/jena/riot/system/StreamRDFWrapper.html
> 
>> On Aug 3, 2018, at 7:33 AM, didac.montero.mendez@gmail.com wrote:
>>
>>
>>
>> On 2018/08/03 10:10:34, Andy Seaborne <an...@apache.org> wrote:
>>>
>>>
>>> On 02/08/18 22:17, didac.montero.mendez@gmail.com wrote:
>>>> I'm converting a JSON-LD input to RDF using Jena:
>>>>
>>>> Model m = ModelFactory.createDefaultModel;
>>>> String str_reader = new StringReader(json.noSpaces)
>>>> RDFDataMgr.read(m, str_reader, "", RDFFormat.JSONLD.getLang)
>>>                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>> Lang.JSONLD
>>>
>>>> I want to be able to have a custom serializer for String Literals. My end goal is to convert a plain String literal to a xsd:date or xsd:dateTime Literal whenever a desired format is found.
>>>
>>> Look at StreamRDF and RDFDataMgr.parse
>>> (or build your parser for more control with RDFParser.create())
>>>
>>> All parsers send their output to a output to a StreamRDF.
>>>
>>> RDFDataMgr.read uses a StreamRDF that puts triples/quads into a graph.
>>>
>>>
>>> StreamRDFs combine so you can build a pipeline
>>>
>>> Parser -> convert strings -> store in graph.
>>>
>>> Streams as well so works for large data if the syntax streams (JSON-LD
>>> does not).
>>>
>>>> I know this is handled by jsonld-java which in turn relies on jackson. Is there anyone who can give me a hint on how to add this type of custom serialization?
>>>
>>> Jackson is the JSON parser.
>>>
>>> jsonld-java is the JSON-LD algorithms.
>>>
>>> What you seem to want is triple processing and be syntax agnostic.
>>>
>>>      Andy
>>>
>> Thanks for your reply. That's informative. I see that I can use RDFParser.create() to customize the StreamRDF (using RDFParser.create().parse(stream)).
>>
>> Since I want triple processing...is extending the StreamRDFBase and overriding the method `public void triple(Triple triple)` an option? Is it the best option?
> 

Re: Custom Literal casting when converting from Json-LD to Jena Model

Posted by ajs6f <aj...@apache.org>.
> Since I want triple processing...is extending the StreamRDFBase and overriding the method `public void triple(Triple triple)` an option? Is it the best option?

That's a reasonable option, or try StreamRDFWrapper [1] and override where appropriate. Keep in mind that triple-level processing can occur well after parsing, if that's what makes sense for your application; although you won't have the advantages of streaming, you will have random-access to the rest of your data.

ajs6f

[1] https://jena.apache.org/documentation/javadoc/arq/org/apache/jena/riot/system/StreamRDFWrapper.html

> On Aug 3, 2018, at 7:33 AM, didac.montero.mendez@gmail.com wrote:
> 
> 
> 
> On 2018/08/03 10:10:34, Andy Seaborne <an...@apache.org> wrote: 
>> 
>> 
>> On 02/08/18 22:17, didac.montero.mendez@gmail.com wrote:
>>> I'm converting a JSON-LD input to RDF using Jena:
>>> 
>>> Model m = ModelFactory.createDefaultModel;
>>> String str_reader = new StringReader(json.noSpaces)
>>> RDFDataMgr.read(m, str_reader, "", RDFFormat.JSONLD.getLang)
>>                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>> Lang.JSONLD
>> 
>>> I want to be able to have a custom serializer for String Literals. My end goal is to convert a plain String literal to a xsd:date or xsd:dateTime Literal whenever a desired format is found.
>> 
>> Look at StreamRDF and RDFDataMgr.parse
>> (or build your parser for more control with RDFParser.create())
>> 
>> All parsers send their output to a output to a StreamRDF.
>> 
>> RDFDataMgr.read uses a StreamRDF that puts triples/quads into a graph.
>> 
>> 
>> StreamRDFs combine so you can build a pipeline
>> 
>> Parser -> convert strings -> store in graph.
>> 
>> Streams as well so works for large data if the syntax streams (JSON-LD 
>> does not).
>> 
>>> I know this is handled by jsonld-java which in turn relies on jackson. Is there anyone who can give me a hint on how to add this type of custom serialization?
>> 
>> Jackson is the JSON parser.
>> 
>> jsonld-java is the JSON-LD algorithms.
>> 
>> What you seem to want is triple processing and be syntax agnostic.
>> 
>>     Andy
>> 
> Thanks for your reply. That's informative. I see that I can use RDFParser.create() to customize the StreamRDF (using RDFParser.create().parse(stream)). 
> 
> Since I want triple processing...is extending the StreamRDFBase and overriding the method `public void triple(Triple triple)` an option? Is it the best option?


Re: Custom Literal casting when converting from Json-LD to Jena Model

Posted by di...@gmail.com, di...@gmail.com.

On 2018/08/03 10:10:34, Andy Seaborne <an...@apache.org> wrote: 
> 
> 
> On 02/08/18 22:17, didac.montero.mendez@gmail.com wrote:
> > I'm converting a JSON-LD input to RDF using Jena:
> > 
> > Model m = ModelFactory.createDefaultModel;
> > String str_reader = new StringReader(json.noSpaces)
> > RDFDataMgr.read(m, str_reader, "", RDFFormat.JSONLD.getLang)
>                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
> Lang.JSONLD
> 
> > I want to be able to have a custom serializer for String Literals. My end goal is to convert a plain String literal to a xsd:date or xsd:dateTime Literal whenever a desired format is found.
> 
> Look at StreamRDF and RDFDataMgr.parse
> (or build your parser for more control with RDFParser.create())
> 
> All parsers send their output to a output to a StreamRDF.
> 
> RDFDataMgr.read uses a StreamRDF that puts triples/quads into a graph.
> 
> 
> StreamRDFs combine so you can build a pipeline
> 
> Parser -> convert strings -> store in graph.
> 
> Streams as well so works for large data if the syntax streams (JSON-LD 
> does not).
> 
> > I know this is handled by jsonld-java which in turn relies on jackson. Is there anyone who can give me a hint on how to add this type of custom serialization?
> 
> Jackson is the JSON parser.
> 
> jsonld-java is the JSON-LD algorithms.
> 
> What you seem to want is triple processing and be syntax agnostic.
> 
>      Andy
> 
Thanks for your reply. That's informative. I see that I can use RDFParser.create() to customize the StreamRDF (using RDFParser.create().parse(stream)). 

Since I want triple processing...is extending the StreamRDFBase and overriding the method `public void triple(Triple triple)` an option? Is it the best option?

Re: Custom Literal casting when converting from Json-LD to Jena Model

Posted by Andy Seaborne <an...@apache.org>.

On 02/08/18 22:17, didac.montero.mendez@gmail.com wrote:
> I'm converting a JSON-LD input to RDF using Jena:
> 
> Model m = ModelFactory.createDefaultModel;
> String str_reader = new StringReader(json.noSpaces)
> RDFDataMgr.read(m, str_reader, "", RDFFormat.JSONLD.getLang)
                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Lang.JSONLD

> I want to be able to have a custom serializer for String Literals. My end goal is to convert a plain String literal to a xsd:date or xsd:dateTime Literal whenever a desired format is found.

Look at StreamRDF and RDFDataMgr.parse
(or build your parser for more control with RDFParser.create())

All parsers send their output to a output to a StreamRDF.

RDFDataMgr.read uses a StreamRDF that puts triples/quads into a graph.


StreamRDFs combine so you can build a pipeline

Parser -> convert strings -> store in graph.

Streams as well so works for large data if the syntax streams (JSON-LD 
does not).

> I know this is handled by jsonld-java which in turn relies on jackson. Is there anyone who can give me a hint on how to add this type of custom serialization?

Jackson is the JSON parser.

jsonld-java is the JSON-LD algorithms.

What you seem to want is triple processing and be syntax agnostic.

     Andy