"""YAML Schema to RDF GeneratorGenerate a JSON LD representation of the model"""importosimporturllib.parseasurlparsefromcopyimportdeepcopyfromdataclassesimportdataclassfromtypingimportOptionalimportclickfromlinkml_runtime.linkml_modelimportSchemaDefinitionfromrdflibimportGraphfromrdflib.pluginimportParserasrdflib_Parserfromrdflib.pluginimportpluginsasrdflib_pluginsfromlinkmlimportMETAMODEL_CONTEXT_URIfromlinkml._versionimport__version__fromlinkml.generators.jsonldgenimportJSONLDGeneratorfromlinkml.utils.generatorimportGenerator,shared_arguments
[docs]@dataclassclassRDFGenerator(Generator):# ClassVarsgeneratorname=os.path.basename(__file__)generatorversion="0.1.1"# TODO: we leave ttl as default for backwards compatibility but nt is# recommended, see https://github.com/linkml/linkml/issues/163valid_formats=["ttl"]+sorted([x.nameforxinrdflib_plugins(None,rdflib_Parser)if"/"notinstr(x.name)])visit_all_class_slots=Falseuses_schemaloader=True# ObjectVarsemit_metadata:bool=Falsecontext:list[str]=Noneoriginal_schema:SchemaDefinition=None"""See https://github.com/linkml/linkml/issues/871"""def__post_init__(self):self.original_schema=deepcopy(self.schema)super().__post_init__()def_data(self,g:Graph)->str:returng.serialize(format="turtle"ifself.format=="ttl"elseself.format)
[docs]defend_schema(self,output:Optional[str]=None,context:str=None,**_)->str:gen=JSONLDGenerator(self.original_schema,format=JSONLDGenerator.valid_formats[0],metadata=self.emit_metadata,importmap=self.importmap,)# Iterate over permissible text strings making them URI compatibleforeingen.schema.enums.values():forpvine.permissible_values.values():pv.text=urlparse.quote(pv.text)jsonld_str=gen.serialize(context=context)graph=Graph()graph.parse(data=jsonld_str,format="json-ld",base=str(self.namespaces._base),prefix=True,)out=self._data(graph)ifoutput:withopen(output,"w",encoding="UTF-8")asoutf:outf.write(out)returnout
@shared_arguments(RDFGenerator)@click.command(name="rdf")@click.option("-o","--output",help="Output file name")@click.option("--context",default=[METAMODEL_CONTEXT_URI],show_default=True,multiple=True,help=f"JSONLD context file (default: {METAMODEL_CONTEXT_URI})",)@click.version_option(__version__,"-V","--version")defcli(yamlfile,**kwargs):"""Generate an RDF representation of a LinkML model"""print(RDFGenerator(yamlfile,**kwargs).serialize(**kwargs))if__name__=="__main__":cli()