Skip to content

Commit f425604

Browse files
matentzncthoyt
andauthored
Pass through SSSOM JSON-LD context when writing JSON (#479)
Fixes #477 --------- Co-authored-by: Charles Tapley Hoyt <[email protected]>
1 parent 91b803f commit f425604

File tree

3 files changed

+84
-3
lines changed

3 files changed

+84
-3
lines changed

src/sssom/context.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,15 @@ def _get_default_converter() -> Converter:
4242
return Converter(records)
4343

4444

45+
def _load_sssom_context():
46+
with open(SSSOM_CONTEXT) as file:
47+
return json.load(file, strict=False)
48+
49+
4550
@lru_cache(1)
4651
def _get_built_in_prefix_map() -> Converter:
4752
"""Get URI prefixes for built-in prefixes."""
48-
with open(SSSOM_CONTEXT) as file:
49-
context = json.load(file, strict=False)
53+
context = _load_sssom_context()
5054
prefix_map = {
5155
prefix: uri_prefix
5256
for prefix, uri_prefix in context["@context"].items()

src/sssom/writers.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import pandas as pd
99
import yaml
10+
from curies import Converter
1011
from jsonasobj2 import JsonObj
1112
from linkml_runtime.dumpers import JSONDumper, rdflib_dumper
1213
from linkml_runtime.utils.schemaview import SchemaView
@@ -17,6 +18,7 @@
1718
from sssom.validators import check_all_prefixes_in_curie_map
1819

1920
from .constants import CURIE_MAP, SCHEMA_YAML, SSSOM_URI_PREFIX
21+
from .context import _load_sssom_context
2022
from .parsers import to_mapping_set_document
2123
from .util import (
2224
RDF_FORMATS,
@@ -433,10 +435,24 @@ def to_fhir_json(msdf: MappingSetDataFrame) -> Dict:
433435
return json_obj
434436

435437

438+
def _update_sssom_context_with_prefixmap(converter: Converter):
439+
"""Prepare a JSON-LD context and dump to a string."""
440+
context = _load_sssom_context()
441+
for k, v in converter.bimap.items():
442+
if k in context["@context"] and context["@context"][k] != v:
443+
logging.info(
444+
f"{k} namespace is already in the context, ({context['@context'][k]}, "
445+
f"but with a different value than {v}. Overwriting!"
446+
)
447+
context["@context"][k] = v
448+
return context
449+
450+
436451
def to_json(msdf: MappingSetDataFrame) -> JsonObj:
437452
"""Convert a mapping set dataframe to a JSON object."""
438453
doc = to_mapping_set_document(msdf)
439-
data = JSONDumper().dumps(doc.mapping_set, contexts={"@context": doc.prefix_map})
454+
context = _update_sssom_context_with_prefixmap(doc.converter)
455+
data = JSONDumper().dumps(doc.mapping_set, contexts=json.dumps(context))
440456
json_obj = json.loads(data)
441457
return json_obj
442458

tests/test_writers.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,23 @@
44
import os
55
import unittest
66

7+
import pandas as pd
8+
from curies import Converter
9+
10+
from sssom import MappingSetDataFrame
11+
from sssom.constants import (
12+
CREATOR_ID,
13+
OBJECT_ID,
14+
OBJECT_LABEL,
15+
PREDICATE_ID,
16+
SEMAPV,
17+
SUBJECT_ID,
18+
SUBJECT_LABEL,
19+
)
720
from sssom.parsers import parse_sssom_json, parse_sssom_rdf, parse_sssom_table
821
from sssom.writers import (
22+
_update_sssom_context_with_prefixmap,
23+
to_json,
924
write_fhir_json,
1025
write_json,
1126
write_ontoportal_json,
@@ -67,6 +82,52 @@ def test_write_sssom_json(self):
6782
f"{path} has the wrong number of mappings.",
6883
)
6984

85+
def test_write_sssom_json_context(self):
86+
"""Test when writing to JSON, the context is correctly written as well."""
87+
rows = [
88+
(
89+
"DOID:0050601",
90+
"ADULT syndrome",
91+
"skos:exactMatch",
92+
"UMLS:C1863204",
93+
"ADULT SYNDROME",
94+
SEMAPV.ManualMappingCuration.value,
95+
"orcid:0000-0003-4423-4370",
96+
)
97+
]
98+
columns = [
99+
SUBJECT_ID,
100+
SUBJECT_LABEL,
101+
PREDICATE_ID,
102+
OBJECT_ID,
103+
OBJECT_LABEL,
104+
SEMAPV.ManualMappingCuration.value,
105+
CREATOR_ID,
106+
]
107+
df = pd.DataFrame(rows, columns=columns)
108+
msdf = MappingSetDataFrame(df)
109+
msdf.clean_prefix_map()
110+
json_object = to_json(msdf)
111+
self.assertIn("@context", json_object)
112+
self.assertIn("DOID", json_object["@context"])
113+
self.assertIn("mapping_set_id", json_object["@context"])
114+
115+
def test_update_sssom_context_with_prefixmap(self):
116+
"""Test when writing to JSON, the context is correctly written as well."""
117+
records = [
118+
{
119+
"prefix": "SCTID",
120+
"prefix_synonyms": ["snomed"],
121+
"uri_prefix": "http://snomed.info/id/",
122+
},
123+
]
124+
converter = Converter.from_extended_prefix_map(records)
125+
context = _update_sssom_context_with_prefixmap(converter)
126+
self.assertIn("@context", context)
127+
self.assertIn("SCTID", context["@context"])
128+
self.assertNotIn("snomed", context["@context"])
129+
self.assertIn("mapping_set_id", context["@context"])
130+
70131
def test_write_sssom_fhir(self):
71132
"""Test writing as FHIR ConceptMap JSON."""
72133
path = os.path.join(test_out_dir, "test_write_sssom_fhir.json")

0 commit comments

Comments
 (0)