Description
I've traced this down to https://github.com/digitalbazaar/pyld/blob/master/lib/pyld/jsonld.py#L4132
The original symptoms that I observed were that various Date
fields that should be compacted to keys like birthDate
were actually including a schema:
prefix.
It looks like the core problem is that the default inverse dictionary for @language
is not getting populated correctly (perhaps due to a change in the published @context
from schema.org?)
Date field specifications include both @id
and @type
, but not language, and are still expected to be pure strings (according to schema.org's documentation). When the compactor attempts to find the correct term, [_select_term]()
returns None.
The inverse dictionary winds up looking something like this:
{
'http://schema.org/birthDate': {'@none': {'@language': {},
'@type': {'http://schema.org/Date': 'birthDate'}}},
# etc
}
Instead of containing a {'@none': 'birthDate'}
for @language
, there's just an empty dict.
Some other non-date fields also seem to exhibit this issue, but I don't know enough about the library or json-ld to know if these symptoms are actually problems, or if they're by design.
Minimum-reproducible sample:
#!/usr/bin/env python
from pyld import jsonld
doc = {
'http://schema.org/name': 'Buster the Cat',
'http://schema.org/birthDate': '2012',
'http://schema.org/deathDate': '2015-02-25'
}
frame = {
'@context': 'http://schema.org/'
}
framed = jsonld.frame(doc, frame)
contents = framed['@graph'][0]
print(framed)
assert 'name' in contents # fine
assert 'birthDate' in contents # not fine, schema:birthDate instead
assert 'deathDate' in contents # not fine, schema:deathDate instead
My proposal to fix this would be to apply Artory@faaa139, to attempt to set these defaults regardless of the outcome of the conditionals there.