Source code for pymantic.parsers.jsonld

"""Parse RDF serialized as jsonld

Usage::

  from pymantic.parsers.jsonld import jsonld_parser
  graph = jsonld_parser.parse_json(json.load(io.open('file.jsonld', mode='rt')))
"""

import json

from .base import BaseParser


[docs]class PyLDLoader(BaseParser): class _Loader(object): def __init__(self, pyld_loader): self.pyld_loader = pyld_loader def parse_file(self, f): jobj = json.load(f) self.pyld_loader.process_jobj(jobj) def parse(self, string): jobj = json.loads(string) self.pyld_loader.process_jobj(jobj) def parse_json(self, jobj, sink=None): if sink is None: sink = self._make_graph() self._prepare_parse(sink) self.process_jobj(jobj) self._cleanup_parse() return sink def make_quad(self, values): quad = self.env.createQuad(*values) self._call_state.graph.add(quad) return quad def _make_graph(self): return self.env.createDataset() def __init__(self, *args, **kwargs): self.document = self._Loader(self) super(PyLDLoader, self).__init__(*args, **kwargs) def process_triple_fragment(self, triple_fragment): if triple_fragment['type'] == 'IRI': return self.env.createNamedNode(triple_fragment['value']) elif triple_fragment['type'] == 'blank node': return self._call_state.bnodes[triple_fragment['value']] elif triple_fragment['type'] == 'literal': language = None if 'language' in triple_fragment: language = triple_fragment['language'] return self.env.createLiteral( value=triple_fragment['value'], datatype=self.env.createNamedNode(triple_fragment['datatype']), language=language ) def process_jobj(self, jobj): from pyld.jsonld import to_rdf dataset = to_rdf(jobj) for graph_name, triples in dataset.items(): graph_iri = ( self.env.createNamedNode(graph_name) if graph_name != '@default' else None ) for triple in triples: self.make_quad( (self.process_triple_fragment(triple['subject']), self.process_triple_fragment(triple['predicate']), self.process_triple_fragment(triple['object']), graph_iri, ) )
jsonld_parser = PyLDLoader()