Skip to content

Harvest-Turtle war für keinen Parser lesbar (v2.42.1) - #129

Merged
daimpad merged 2 commits into
mainfrom
claude/fix-data-prep-errors-kJYpl
Sep 17, 2026
Merged

daimpad merged 2 commits into
mainfrom
claude/fix-data-prep-errors-kJYpl

Conversation

@daimpad

@daimpad daimpad commented Sep 17, 2026

Copy link
Copy Markdown
Owner

Beim Testen der Live-Ausgabe gefunden: Der als „empfohlen" ausgewiesene Turtle-Katalog ließ sich von keinem RDF-Parser einlesen.

Der Fehler

Die Dimensionsnamen im odw:qualityScore-Block standen als nackte Bezeichner da:

odw:dimensions [ findability [ odw:score 30 ; … ] ; accessibility [ … ] ]

Ein Prädikat muss in Turtle ein IRI oder ein Präfixname sein. findability ist beides nicht — der Parser bricht dort ab und verwirft das ganze Dokument, nicht nur die Zeile.

Belegt am echten Abruf einer Installation:

Dokument Ergebnis
Live-Ausgabe ?full=1&format=turtle PARSE-FEHLER: Unexpected "findability" on line 34
dasselbe Dokument ohne den Qualitätsblock OK — geparst, 25 Tripel

In JSON-LD fiel derselbe Schlüssel stillschweigend weg (kein Eintrag im @context) — die Dimensionen fehlten dort also ohnehin schon immer.

Drei Stellen, behoben

  1. Ursache: Dimensionsnamen tragen jetzt den odw:-Präfix.
  2. Absicherung: ODW_Rdf gibt einen Schlüssel nur noch aus, wenn er ein IRI oder ein Präfixname ist, sonst entfällt er. Eine verlorene Zusatzangabe ist ungleich harmloser als ein unlesbarer Katalog. Ein vollständiges IRI wird korrekt in spitze Klammern gesetzt.
  3. Nebenbefund: Die Datensatz-Fixtures wurden ohne @context serialisiert und hatten dadurch keine @prefix-Zeilen — ebenfalls unparsbar. Der neue ODW_Rest_API::build_dataset_document() setzt den Kontext an einer Stelle, die Endpunkt und Fixture gemeinsam nutzen.

Warum das grün durch die CI kam

Der SHACL-Job erzeugte zwar Turtle-Dateien, validierte aber nur die JSON-LD-Fixtures — die .ttl-Dateien wurden nie geparst. Dazu kam, dass der Qualitätsblock in den Fixtures gar nicht vorkam, weil der Generator den Filter odw_dataset_jsonld nicht durchlief. Die einzige kaputte Stelle lag exakt im blinden Fleck.

  • tests/shacl/validate.mjs prüft jetzt beide Serialisierungen (sechs Fixtures statt drei); ein Syntaxfehler in der Turtle-Datei lässt den Lauf scheitern.
  • Die maximale Fixture trägt einen gespeicherten MQA-Stand und durchläuft ODW_Quality::append_to_jsonld().

Tests

Zwei Unit-Tests, bewusst auf beiden Ebenen: Mit dem Serializer-Schutz allein degradiert der alte Fehler zu einem stillen odw:dimensions [] — die Dimensionen verschwänden unbemerkt aus der Ausgabe. Das habe ich gegengeprüft, indem ich die Ursache testweise zurückgedreht habe. Deshalb wird zusätzlich der Präfix der Dimensionsnamen festgenagelt.

Lokal geprüft

SHACL-Lauf grün über alle sechs Fixtures, Turtle-Parse jeder Datei einzeln gegengeprüft, Paketprüfung und i18n sauber. PHPUnit und PHPCS laufen in dieser Umgebung nicht (Composer erreicht github.com nicht) — sie entscheiden sich erstmals hier in der CI.

Version 2.42.0 → 2.42.1.

🤖 Generated with Claude Code

https://claude.ai/code/session_01JB1xUQM892bVZ4Yv3MZjvq


Generated by Claude Code

Beim Testen der Live-Ausgabe einer Installation gefunden: Der als
„empfohlen" ausgewiesene Turtle-Katalog ließ sich von keinem RDF-Parser
einlesen.

Ursache: Die Dimensionsnamen im odw:qualityScore-Block standen als nackte
Bezeichner da — „findability [ … ]". Ein Prädikat muss in Turtle ein IRI
oder ein Präfixname sein. Der Parser bricht dort ab und verwirft das
ganze Dokument, nicht nur die Zeile. Belegt am echten Abruf:
„Unexpected \"findability\" on line 34"; dasselbe Dokument ohne den Block
parst mit 25 Tripeln sauber. Die Namen tragen jetzt den odw:-Präfix.

In JSON-LD fiel derselbe Schlüssel stillschweigend weg, weil er im
@context nicht vorkommt — die Dimensionen fehlten dort also ohnehin.

Zwei weitere Stellen, die dasselbe ermöglicht haben:

- ODW_Rdf schrieb den Schlüssel ungeprüft heraus. Jetzt wird nur noch ein
  IRI oder ein Präfixname ausgegeben, alles andere entfällt. Eine
  verlorene Zusatzangabe ist harmloser als ein unlesbarer Katalog.

- Die Datensatz-Fixtures wurden ohne @context serialisiert und hatten
  deshalb keine @prefix-Zeilen — ebenfalls unparsbar. ODW_Rest_API::
  build_dataset_document() setzt den Kontext jetzt an einer Stelle, die
  Endpunkt und Fixture gemeinsam nutzen.

Warum die CI das nicht sah: Der SHACL-Job erzeugte Turtle, validierte
aber nur die JSON-LD-Fixtures — die .ttl-Dateien wurden nie geparst. Und
der Qualitätsblock kam in den Fixtures gar nicht vor, weil der Generator
den Filter odw_dataset_jsonld nicht durchlief. Die einzige kaputte Stelle
lag exakt im blinden Fleck. Beides behoben: validate.mjs prüft nun beide
Serialisierungen, und die maximale Fixture trägt einen gespeicherten
MQA-Stand und durchläuft append_to_jsonld().

Dazu zwei Unit-Tests. Der Serializer-Schutz allein hätte den Fehler in
ein stilles „odw:dimensions []" verwandelt — die Dimensionen wären
unbemerkt aus der Ausgabe verschwunden. Deshalb wird zusätzlich der
Präfix der Dimensionsnamen festgenagelt.

Lokal geprüft: SHACL-Lauf grün über alle sechs Fixtures (drei JSON-LD,
drei Turtle), Turtle-Parse einzeln gegengeprüft, Paketprüfung und
i18n sauber. PHPUnit und PHPCS laufen in dieser Umgebung nicht
(composer erreicht github.com nicht) — sie entscheiden sich in der CI.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01JB1xUQM892bVZ4Yv3MZjvq
test_append_to_jsonld_adds_mqa_data verlangte den Schlüssel
„findability" — also genau die Form, die ungültiges Turtle erzeugt. Eine
Zusicherung, die den Ist-Zustand abbildet statt einer Anforderung, meldet
den Fehler nicht, sondern hält ihn fest. Jetzt auf „odw:findability".

Die internen Dimensionsschlüssel bleiben unverändert: DIMENSIONS, die
Labels und config/mqa-metrics.php arbeiten weiter ohne Präfix, der
Präfix gehört allein in die JSON-LD- und Turtle-Ausgabe.

Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01JB1xUQM892bVZ4Yv3MZjvq
@daimpad
daimpad merged commit d583854 into main Sep 17, 2026
22 checks passed
@daimpad
daimpad deleted the claude/fix-data-prep-errors-kJYpl branch September 17, 2026 10:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants