Skip to content

Commit f520842

Browse files
committed
Added missing class
1 parent 56fe953 commit f520842

1 file changed

Lines changed: 23 additions & 5 deletions

File tree

  • src/main/java/com/atomgraph/linkeddatahub/writer/function

src/main/java/com/atomgraph/linkeddatahub/writer/function/Construct.java

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,16 @@
3131
import net.sf.saxon.s9api.SaxonApiException;
3232
import net.sf.saxon.s9api.SequenceType;
3333
import net.sf.saxon.s9api.XdmValue;
34+
import org.apache.jena.query.Query;
3435
import org.apache.jena.query.QueryExecution;
35-
import org.apache.jena.query.QuerySolutionMap;
36+
import org.apache.jena.query.QueryFactory;
3637
import org.apache.jena.rdf.model.Model;
38+
import org.apache.jena.sparql.core.Var;
39+
import org.apache.jena.sparql.engine.binding.Binding;
40+
import org.apache.jena.sparql.engine.binding.BindingFactory;
41+
import org.apache.jena.sparql.expr.ExprVar;
42+
import org.apache.jena.sparql.syntax.ElementBind;
43+
import org.apache.jena.sparql.syntax.ElementGroup;
3744
import org.apache.jena.rdf.model.ModelFactory;
3845
import org.apache.jena.rdf.model.Resource;
3946
import org.apache.jena.rdf.model.ResourceFactory;
@@ -94,13 +101,24 @@ public XdmValue call(XdmValue[] arguments) throws SaxonApiException
94101
arguments[0].itemAt(0).asMap().forEach((forClass, constructors) ->
95102
{
96103
Resource instance = model.createResource();
97-
QuerySolutionMap qsm = new QuerySolutionMap();
98-
qsm.add(SPIN.THIS_VAR_NAME, instance);
99-
100104
instance.addProperty(RDF.type, ResourceFactory.createResource(forClass.getStringValue()));
105+
106+
// Inject BIND(?_this_bind AS ?this) into the WHERE clause.
107+
// This keeps ?this as a variable in the CONSTRUCT template (not a written blank node),
108+
// so the template picks up the concrete node value — preserving blank node identity.
109+
// See: https://github.com/apache/jena/issues/3267
110+
Var bindVar = Var.alloc("_this_bind");
111+
Binding binding = BindingFactory.binding(bindVar, instance.asNode());
112+
101113
constructors.stream().forEach(constructor ->
102114
{
103-
try (QueryExecution qex = QueryExecution.model(model).query(constructor.getStringValue()).initialBinding(qsm).build())
115+
Query query = QueryFactory.create(constructor.getStringValue());
116+
ElementGroup group = new ElementGroup();
117+
group.addElement(query.getQueryPattern());
118+
group.addElement(new ElementBind(Var.alloc(SPIN.THIS_VAR_NAME), new ExprVar(bindVar)));
119+
query.setQueryPattern(group);
120+
121+
try (QueryExecution qex = QueryExecution.create().query(query).model(model).substitution(binding).build())
104122
{
105123
qex.execConstruct(model);
106124
}

0 commit comments

Comments
 (0)