This notebook demonstrates how to convert Resources to JSON-LD and vice-versa. JSON-LD is a semantic-preserving JSON format allowing to provide identifiers and meaning to JSON keys and values by mean of an added '@context' object. Read the excellent JSON-LD documentation to learn more about this format.
A JSON-LD context can be assigned to a Resource in three ways by order of priority:
context
: e.g.jane_resource.context="https://schema.org/docs/jsonldcontext.json"
Model
section of the forge configuration file: e.g.'''
Model:
name: RdfModel
origin: ...
source: ...
context:
iri: "https://schema.org/docs/jsonldcontext.json"
'''
from kgforge.core import KnowledgeGraphForge
A configuration file is needed in order to create a KnowledgeGraphForge session. A configuration can be generated using the notebook 00-Initialization.ipynb.
forge = KnowledgeGraphForge("../../configurations/forge.yml")
import json
from kgforge.core import Resource
def pp(x):
print(json.dumps(x, indent=4))
context = {
"ex": "http://example.org/",
"Person": "ex:Person",
"Organization": "ex:Organization",
"employer": "ex:employer",
"name": "ex:name",
"award":"ex:award",
"email":"ex:email"
}
jane = Resource(context=context, type="Person", name="Jane Doe", award=["Nobel"], email=["jane.doe1@example.org", "jane.doe2@example.org"])
forge.as_json(jane)
{'type': 'Person', 'award': ['Nobel'], 'email': ['jane.doe1@example.org', 'jane.doe2@example.org'], 'name': 'Jane Doe'}
pp(forge.as_jsonld(jane)) # default JSON-LD form=="compacted"
{ "@context": { "ex": "http://example.org/", "Person": "ex:Person", "Organization": "ex:Organization", "employer": "ex:employer", "name": "ex:name", "award": "ex:award", "email": "ex:email" }, "@type": "Person", "name": "Jane Doe", "award": [ "Nobel" ], "email": [ "jane.doe1@example.org", "jane.doe2@example.org" ] }
pp(forge.as_jsonld(jane, form="expanded"))
{ "@type": [ "http://example.org/Person" ], "http://example.org/award": [ { "@value": "Nobel" } ], "http://example.org/email": [ { "@value": "jane.doe1@example.org" }, { "@value": "jane.doe2@example.org" } ], "http://example.org/name": [ { "@value": "Jane Doe" } ] }
pp(forge.as_jsonld(jane, form="compacted"))
{ "@context": { "ex": "http://example.org/", "Person": "ex:Person", "Organization": "ex:Organization", "employer": "ex:employer", "name": "ex:name", "award": "ex:award", "email": "ex:email" }, "@type": "Person", "name": "Jane Doe", "award": [ "Nobel" ], "email": [ "jane.doe1@example.org", "jane.doe2@example.org" ] }
jane = Resource(context="https://schema.org/docs/jsonldcontext.json", type="Person", name="Jane Doe")
print(jane)
{ context: https://schema.org/docs/jsonldcontext.json type: Person name: Jane Doe }
pp(forge.as_jsonld(jane, form="expanded"))
{ "@type": [ "http://schema.org/Person" ], "http://schema.org/name": [ { "@value": "Jane Doe" } ] }
The configured model provides a default context that will be used to create resources that do not have context provided.
jane = Resource(type="Person", name="Jane Doe")
print(jane)
{ type: Person name: Jane Doe }
pp(forge.as_jsonld(jane))
{ "@context": "https://bbp.neuroshapes.org", "@type": "Person", "name": "Jane Doe" }
pp(forge.as_jsonld(jane, form="expanded"))
{ "@type": [ "http://schema.org/Person" ], "http://schema.org/name": [ { "@value": "Jane Doe" } ] }
It is possible to use a context that is available in the configured RdfModel Store
john = Resource(context=context, type="Person", name="John Smith", award=["A.M. TURING AWARD"],
email=["john.smith1@example.org", "john.smith2@example.org"])
data = {
"@context": context,
"@type": "Person",
"name": "John Smith",
"award":["A.M. TURING AWARD"],
"email":["john.smith1@example.org", "john.smith2@example.org"]
}
resource = forge.from_jsonld(data)
resource == john
True