Commit Graph
1 Commits
Author SHA1 Message Date
FABIOTESSandClaude Opus 5 75b026c6dd fix(export): mint JSON-LD @ids the same way the RDF serializers do (#1101)
The #1101 fix covered serialize_to_turtle, serialize_to_ntriples and
serialize_to_rdfxml. Both JSON-LD writers were left interpolating the
entity's own text into f"semantica:entity/{text}" and the endpoints into
f"semantica:rel/{source}_{target}". Three consequences, all reproducible
on 0.6.5 through the public API:

- An entity whose text contains a space, which is most organisation and
  person names an extractor produces, mints an invalid IRI. A JSON-LD
  parser drops that node in full and says nothing, so the entity is
  simply missing from the export: rdflib reads 6 triples for
  {"text": "AcmeCorp"} and 2 for {"text": "Acme Corp"}.
- serialize_to_jsonld resolved endpoints from source_id/target_id only,
  while the rest of the module accepts source/target too. Every
  relationship carrying the second form minted the identical
  "semantica:rel/_", so all of them collapsed onto one node and their
  types and endpoints merged into a graph nobody wrote.
- The JSON-LD @id and the Turtle IRI for one entity disagreed
  (ns#entity/Acme Corp vs ns#entity_a73cb4563ee2e72c), so the two
  serializations of one knowledge graph were two different graphs.

Both writers now use mint_entity_iri/mint_relationship_iri, resolving
endpoints both ways and passing the list index the RDF paths pass, so
one knowledge graph carries one node identity whichever serializer
wrote it.

JSONExporter.export_entities and export_relationships also declare the
semantica prefix their @context was already writing "semantica:entities"
against. Without the declaration a processor reads that as an IRI in the
scheme semantica rather than the namespace expansion, which is the
original #1101 defect on a third path: rdflib returns the predicate
literally as semantica:entities.

tests/export/test_jsonld_iri_minting.py parses each export with a real
JSON-LD processor rather than asserting on the JSON text, and covers all
seven claims above. Each test fails on the parent commit.

236 export and ontology tests pass.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-19 15:43:23 +01:00