Thanks for the explanation. What do you mean with "inject" in 1/? ParameterizedSparqlString?
On Sun, Jul 5, 2020 at 8:53 PM Andy Seaborne <a...@apache.org> wrote: > > <_:label> is a syntax feature, not built into the storage or query > execution. > > model.createResource("_:" + id)); > > creates a resource with a strange URI (which is actually illegal by RFC > 3986/7). > > There are various ways: > > 1/ The app can put the bnode into the QSM and injected at execution - it > won't become a bnode-variable because that happens in parsing. > > 2/ To put a concrete node into a query: > > String bn = "<_:" + id+">"; > > then put string into SPARQL syntax: > > QueryFactory.create("SELECT * { VALUES ?s {"+bn+"} ?s ?p ?o }"); > QueryFactory.create("SELECT * { "+bn+" ?p ?o }"); > > 3/ rewrite the abstract syntax after parsing: > > Map<String, Resource> substitutions = > Collections.singletonMap("s", bnode); > query = QueryFactory.create("SELECT * { ?s ?p ?o }"); > query = QueryTransformOps.transformQuery(query, substitutions); > > Forms 2 and 3 have the advantage of not relying on how execution works - > QSMs are ingested inthe start of execution and e.g. aren't visible in > subqueries and also interact and bypass with query optimization. > > Andy > > On 05/07/2020 15:22, Martynas Jusevičius wrote: > > Hi, > > > > I came across a situation where I want to carry over a blank node ID > > in a QuerySolutionMap to QueryExecution, to match exact blank node > > resources rather than have them as variables. > > > > I found an old thread by Holger on this topic: > > https://mail-archives.apache.org/mod_mbox/jena-users/201308.mbox/browser > > > > The suggestion was to use <_:LABEL> URI scheme for blank nodes. > > https://jena.apache.org/documentation/query/extension.html#blank-node-labels > > > > Based on that, I tried this logic: > > > > if (instance.isURIResource()) qsm.add(SPIN.THIS_VAR_NAME, instance); > > if (instance.isAnon()) qsm.add(SPIN.THIS_VAR_NAME, > > model.createResource("_:" + instance.getId())); > > > > However I'm not getting the results I expect. So I decided to make an > > isolated test: > > > > @Test > > public void bnodeQueryTest() > > { > > Model model = ModelFactory.createDefaultModel(); > > Resource bnode = model.createResource().addProperty(FOAF.name, > > "whateverest"); > > AnonId id = bnode.getId(); > > > > Query query = QueryFactory.create("SELECT * { ?s ?p ?o }"); > > QuerySolutionMap qsm = new QuerySolutionMap(); > > qsm.add("s", model.createResource("_:" + id)); > > > > try (QueryExecution qex = QueryExecutionFactory.create(query, > > model, qsm)) > > { > > ResultSet resultSet = qex.execSelect(); > > > > assertTrue(resultSet.hasNext()); > > assertEquals(id, > > resultSet.next().get("s").asResource().getId()); > > } > > } > > > > The test fails on assertTrue() because SELECT returns no results. > > > > Is the test flawed? Am I misunderstanding the use of this URI scheme? > > If not, what's the purpose if it cannot match blank nodes in data? > > > > Martynas > >