GH-3806: Allow URIs as values of ja:cxtName.
diff --git a/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/AssemblerUtils.java b/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/AssemblerUtils.java
index 83a0c7b..4d99ba1 100644
--- a/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/AssemblerUtils.java
+++ b/jena-arq/src/main/java/org/apache/jena/sparql/core/assembler/AssemblerUtils.java
@@ -36,6 +36,7 @@
 import org.apache.jena.query.ResultSet;
 import org.apache.jena.rdf.model.Model;
 import org.apache.jena.rdf.model.ModelFactory;
+import org.apache.jena.rdf.model.RDFNode;
 import org.apache.jena.rdf.model.Resource;
 import org.apache.jena.rdf.model.ResourceFactory;
 import org.apache.jena.riot.RDFDataMgr;
@@ -232,9 +233,17 @@
         while ( rs.hasNext() )
         {
             QuerySolution soln = rs.next();
-            String name = soln.getLiteral("name").getLexicalForm();
+            RDFNode key = soln.get("name");
+            String name;
+            if (key.isLiteral()) {
+                String rawName = key.asLiteral().getLexicalForm();
+                name = MappingRegistry.mapPrefixName(rawName);
+            } else if (key.isURIResource()) {
+                name = key.asResource().getURI();
+            } else {
+                throw new ARQException("Value of ja:cxtName must be a literal or URI.");
+            }
             String value = soln.getLiteral("value").getLexicalForm();  // Works for numbers as well!
-            name = MappingRegistry.mapPrefixName(name);
             Symbol symbol = Symbol.create(name);
             if ( "undef".equalsIgnoreCase(value) )
                 context.remove(symbol);
diff --git a/jena-arq/src/test/java/org/apache/jena/sparql/core/TestContext.java b/jena-arq/src/test/java/org/apache/jena/sparql/core/TestContext.java
index afd6de3..6b31e47 100644
--- a/jena-arq/src/test/java/org/apache/jena/sparql/core/TestContext.java
+++ b/jena-arq/src/test/java/org/apache/jena/sparql/core/TestContext.java
@@ -28,7 +28,15 @@
 
 import org.junit.jupiter.api.Test;
 
+import org.apache.jena.assembler.JA;
+import org.apache.jena.graph.Node;
+import org.apache.jena.graph.NodeFactory;
+import org.apache.jena.rdf.model.Model;
+import org.apache.jena.rdf.model.ModelFactory;
+import org.apache.jena.rdf.model.RDFNode;
+import org.apache.jena.rdf.model.Resource;
 import org.apache.jena.sparql.ARQException;
+import org.apache.jena.sparql.core.assembler.AssemblerUtils;
 import org.apache.jena.sparql.util.Context;
 import org.apache.jena.sparql.util.Symbol;
 
@@ -114,4 +122,68 @@
         // Bad. Long for Integer.
         assertThrows(ARQException.class, ()->cxt.getInt(p1, -2));
     }
+
+    /**
+     * Test context parsing where the key is a literal.
+     *
+     * <pre>{@code
+     * PREFIX ja: <http://jena.hpl.hp.com/2005/11/Assembler#>
+     * PREFIX eg: <http://www.example.org/>
+     *
+     * [] ja:context [ ja:cxtName "key" ; ja:cxtValue true ] .
+     * }</pre>
+     */
+    @Test
+    public void testCxtAssemblerLiteral() {
+        Node keyNode = NodeFactory.createLiteralString("http://www.example.org/key");
+        Symbol keySym = Symbol.create(keyNode.getLiteralLexicalForm());
+        Context cxt = parseTestContext(keyNode);
+        assertTrue(cxt.isTrue(keySym));
+    }
+
+    /**
+     * Test context parsing where the key is a URI.
+     *
+     * <pre>{@code
+     * PREFIX ja: <http://jena.hpl.hp.com/2005/11/Assembler#>
+     * PREFIX eg: <http://www.example.org/>
+     *
+     * [] ja:context [ ja:cxtName eg:key ; ja:cxtValue true ] .
+     * }</pre>
+     */
+    @Test
+    public void testCxtAssemblerURI() {
+        Node keyNode = NodeFactory.createURI("http://www.example.org/key");
+        Symbol keySym = Symbol.create(keyNode.getURI());
+        Context cxt = parseTestContext(keyNode);
+        assertTrue(cxt.isTrue(keySym));
+    }
+
+    @Test
+    public void testCxtAssemblerInvalid() {
+        assertThrows(ARQException.class, () -> {
+            Node keyNode = NodeFactory.createBlankNode();
+            parseTestContext(keyNode);
+        });
+    }
+    /**
+     * Create a test context from the following RDF model.
+     *
+     * <pre>{@code
+     * PREFIX ja: <http://jena.hpl.hp.com/2005/11/Assembler#>
+     * PREFIX eg: <http://www.example.org/>
+     *
+     * [] ja:context [ ja:cxtName ${KEY_NODE} ; ja:cxtValue true ] .
+     * }</pre>
+     */
+    private static Context parseTestContext(Node key) {
+        Model model = ModelFactory.createDefaultModel();
+        RDFNode k = model.asRDFNode(key);
+        Resource cxtRes = model.createResource()
+            .addProperty(JA.cxtName, k)
+            .addLiteral(JA.cxtValue, true);
+        Resource r = model.createResource().addProperty(JA.context, cxtRes);
+        Context cxt = AssemblerUtils.parseContext(r);
+        return cxt;
+    }
 }