namedgraph opened a new issue, #4091:
URL: https://github.com/apache/jena/issues/4091

   ## Version
   
   6.0.0 and 6.1.0 (current release). Works in 5.6.0. Still present on `main` 
(by code inspection, links below).
   
   Environment: macOS (arm64), OpenJDK 25.0.1 (Homebrew).
   
   ## What happened
   
   The `arq` CLI can no longer output the result of a quad `CONSTRUCT { GRAPH … 
{ … } }` query (the ARQ syntax extension) in **any** format — the default 
output path throws, and the dataset-capable `--results` formats were dropped. 
Minimal repro, no data files needed:
   
   ```shell
   echo 'CONSTRUCT { GRAPH <urn:x:g> { <urn:x:s> <urn:x:p> <urn:x:o> } } WHERE 
{}' > quads.rq
   
   apache-jena-5.6.0/bin/arq --query quads.rq     # exit 0:
   # <urn:x:g> {
   #     <urn:x:s>  <urn:x:p>  <urn:x:o> .
   # }
   
   apache-jena-6.1.0/bin/arq --query quads.rq     # exit 2 (same on 6.0.0):
   # org.apache.jena.riot.RiotException: No dataset writer for Turtle_pretty
   ```
   
   Full stack trace on 6.1.0:
   
   ```
   org.apache.jena.riot.RiotException: No dataset writer for Turtle_pretty
        at 
org.apache.jena.riot.RDFWriter.createDatasetWriter$(RDFWriter.java:253)
        at org.apache.jena.riot.RDFWriter.write$(RDFWriter.java:263)
        at org.apache.jena.riot.RDFWriter.output(RDFWriter.java:222)
        at org.apache.jena.riot.RDFWriter.output(RDFWriter.java:161)
        at 
org.apache.jena.riot.RDFWriterBuilder.output(RDFWriterBuilder.java:213)
        at 
org.apache.jena.sparql.util.QueryExecUtils.writeDataset(QueryExecUtils.java:282)
        at 
org.apache.jena.sparql.util.QueryExecUtils.doConstructQuadsQuery(QueryExecUtils.java:250)
        at 
org.apache.jena.sparql.util.QueryExecUtils.executeQuery(QueryExecUtils.java:124)
        at arq.query.lambda$queryExec$0(query.java:248)
        at org.apache.jena.system.Txn.exec(Txn.java:82)
        at org.apache.jena.system.Txn.executeRead(Txn.java:120)
        at arq.query.queryExec(query.java:244)
        at arq.query.exec(query.java:161)
        at org.apache.jena.cmd.CmdMain.mainMethod(CmdMain.java:98)
        at org.apache.jena.cmd.CmdMain.mainRun(CmdMain.java:64)
        at org.apache.jena.cmd.CmdMain.mainRun(CmdMain.java:52)
        at arq.arq.main(arq.java:31)
   ```
   
   There is no workaround from the CLI:
   
   - `--results=trig` / `--results=nq` → `Unrecognized output format` in 6.x 
(5.6.0 accepted `trig`)
   - `--results=text` → the same exception as the default
   - `--syntax=arq` changes nothing — parsing and execution succeed (the stack 
reaches `doConstructQuadsQuery`); the failure is purely in output-writer 
selection
   
   So pipelines that use `arq` for quad CONSTRUCT are pinned to Jena ≤ 5.6.0.
   
   ## Analysis
   
   Introduced by the 6.0.0 `ResultsFormat` rewrite (symbol registry → enum):
   
   - The default results format `TEXT` carries `RDFFormat.TURTLE` 
([ResultsFormat.java#L43](https://github.com/apache/jena/blob/jena-6.1.0/jena-arq/src/main/java/org/apache/jena/sparql/resultset/ResultsFormat.java#L43)).
   - `QueryExecUtils.writeDataset` passes `outputFormat.rdfFormat()` straight 
to `RDFWriter` 
([QueryExecUtils.java#L278-L284](https://github.com/apache/jena/blob/jena-6.1.0/jena-arq/src/main/java/org/apache/jena/sparql/util/QueryExecUtils.java#L278-L284));
 Turtle has no dataset writer → `RiotException`.
   - No enum constant carries a dataset-capable `RDFFormat`, and the 
`trig`/`nquads` name registrations are commented out 
([ResultsFormat.java#L167-L169](https://github.com/apache/jena/blob/jena-6.1.0/jena-arq/src/main/java/org/apache/jena/sparql/resultset/ResultsFormat.java#L167-L169))
 — so TriG/N-Quads output is unreachable. Unchanged on `main`.
   
   Related regression from the same rewrite: for a plain (triples) CONSTRUCT, 
`writeModel` hardcodes `RDFFormat.TURTLE_PRETTY` and ignores the requested 
format 
([QueryExecUtils.java#L272-L276](https://github.com/apache/jena/blob/jena-6.1.0/jena-arq/src/main/java/org/apache/jena/sparql/util/QueryExecUtils.java#L272-L276)):
   
   ```shell
   echo 'CONSTRUCT { <urn:x:s> <urn:x:p> <urn:x:o> } WHERE {}' > triples.rq
   apache-jena-6.1.0/bin/arq --query triples.rq --results=rdfxml   # exit 0:
   # <urn:x:s>  <urn:x:p>  <urn:x:o> .
   ```
   
   Turtle, not the requested RDF/XML. (5.6.0 rejected the unsupported name 
outright with `Unrecognized output format: rdfxml`, exit 5 — 6.x accepts it and 
silently ignores it.)
   
   ## Self-contained repro script
   
   Downloads 5.6.0 / 6.0.0 / 6.1.0 from archive.apache.org and prints the full 
matrix (default quad output, `--results=trig`, `--results=rdfxml`) per version:
   
   <details>
   <summary>jena-quad-construct-repro.sh</summary>
   
   ```shell
   #!/usr/bin/env bash
   # Minimal repro: `arq` cannot output quad CONSTRUCT results in Apache Jena 
6.x.
   #   5.6.0: emits TriG, exit 0
   #   6.0.0/6.1.0: org.apache.jena.riot.RiotException: No dataset writer for 
Turtle_pretty, exit 2
   # Usage: ./jena-quad-construct-repro.sh [workdir]   (default 
/tmp/jena-quad-repro)
   # Requires: curl, tar, Java 21+ (Jena 6.x requirement).
   set -uo pipefail
   
   WORK="${1:-/tmp/jena-quad-repro}"
   VERSIONS=(5.6.0 6.0.0 6.1.0)
   MIRROR=https://archive.apache.org/dist/jena/binaries
   
   mkdir -p "$WORK"
   cd "$WORK"
   
   for v in "${VERSIONS[@]}"; do
       [ -d "apache-jena-$v" ] && continue
       echo "downloading apache-jena-$v ..." >&2
       curl -fsSL -o "apache-jena-$v.tar.gz" "$MIRROR/apache-jena-$v.tar.gz"
       tar xzf "apache-jena-$v.tar.gz"
   done
   
   cat > quads.rq <<'EOF'
   CONSTRUCT { GRAPH <urn:x:g> { <urn:x:s> <urn:x:p> <urn:x:o> } } WHERE {}
   EOF
   cat > triples.rq <<'EOF'
   CONSTRUCT { <urn:x:s> <urn:x:p> <urn:x:o> } WHERE {}
   EOF
   
   # NB: bin/arq honors a pre-set JENA_HOME when building the classpath, so a 
stray
   # export runs a DIFFERENT version's jars than the script path suggests — pin 
it.
   run() {
       local v=$1; shift
       env JENA_HOME="$WORK/apache-jena-$v" "$WORK/apache-jena-$v/bin/arq" "$@"
   }
   
   for v in "${VERSIONS[@]}"; do
       echo "================ Apache Jena $v ================"
       echo "--- quad CONSTRUCT, default output ---"
       run "$v" --query quads.rq 2>&1 | head -4
       echo "exit=${PIPESTATUS[0]}"
       echo "--- quad CONSTRUCT, --results=trig ---"
       run "$v" --query quads.rq --results=trig 2>&1 | head -4
       echo "exit=${PIPESTATUS[0]}"
       echo "--- triples CONSTRUCT, --results=rdfxml ---"
       run "$v" --query triples.rq --results=rdfxml 2>&1 | head -4
       echo "exit=${PIPESTATUS[0]}"
       echo
   done
   ```
   
   </details>
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to